From e4e3b83a8cad1fd0034db9ef7b24cecd45ced88c Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Mon, 10 Nov 2025 16:29:22 +0500 Subject: [PATCH] fix --- .../migrations/0036_offer_is_deleted.py | 18 +++++++++ core/apps/orders/models/order_offer.py | 1 + core/apps/orders/urls.py | 1 + core/apps/orders/views/offer.py | 37 +++++++++++++++++-- 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 core/apps/orders/migrations/0036_offer_is_deleted.py diff --git a/core/apps/orders/migrations/0036_offer_is_deleted.py b/core/apps/orders/migrations/0036_offer_is_deleted.py new file mode 100644 index 0000000..dc64822 --- /dev/null +++ b/core/apps/orders/migrations/0036_offer_is_deleted.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.4 on 2025-11-10 16:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orders', '0035_order_completion_percentage_order_received_count_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='offer', + name='is_deleted', + field=models.BooleanField(default=False), + ), + ] diff --git a/core/apps/orders/models/order_offer.py b/core/apps/orders/models/order_offer.py index ec3dde1..0c4e07b 100644 --- a/core/apps/orders/models/order_offer.py +++ b/core/apps/orders/models/order_offer.py @@ -27,6 +27,7 @@ class Offer(BaseModel): qqs = models.BooleanField(default=False, null=True, blank=True) number = models.PositiveIntegerField(default=1) status = models.CharField(max_length=20, choices=STATUS, default='PENDING', null=True, blank=True) + is_deleted = models.BooleanField(default=False) def __str__(self): return str(self.number) diff --git a/core/apps/orders/urls.py b/core/apps/orders/urls.py index 919b194..90a3f76 100644 --- a/core/apps/orders/urls.py +++ b/core/apps/orders/urls.py @@ -22,6 +22,7 @@ urlpatterns = [ [ path('create/', offer_views.OffersCreateApiView.as_view()), path('list/', offer_views.OfferListApiView.as_view()), + path('deleted_list/', offer_views.DeletedOfferListApiView.as_view()), path('/delete/', offer_views.OfferDeleteApiView.as_view()), path('/update/', offer_views.OfferUpdateApiView.as_view()), path('bulk-delete/', offer_views.DeleteMultipleOfferApiView.as_view()), diff --git a/core/apps/orders/views/offer.py b/core/apps/orders/views/offer.py index 3c3ef5b..2a2c268 100644 --- a/core/apps/orders/views/offer.py +++ b/core/apps/orders/views/offer.py @@ -33,7 +33,31 @@ class OffersCreateApiView(generics.GenericAPIView): class OfferListApiView(generics.GenericAPIView): permission_classes = [HasRolePermission] queryset = Order.objects.select_related('product', 'unity').prefetch_related('offers').filter( - offers__isnull=False + offers__isnull=False, offers__is_deleted=False + ).distinct() + serializer_class = serializers.OrderListForOfferSerializer + filter_backends = [DjangoFilterBackend] + filterset_class = OrderFilter + + def get(self, request): + offer_status = request.query_params.get('status', None) + orders = self.filter_queryset(self.get_queryset()) + page = self.paginate_queryset(orders) + if page is not None: + if offer_status: + serializer = self.serializer_class(page, many=True, context={'status': offer_status}) + else: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.serializer_class(offers, many=True) + return Response(serializer.data, status=200) + + + +class DeletedOfferListApiView(generics.GenericAPIView): + permission_classes = [HasRolePermission] + queryset = Order.objects.select_related('product', 'unity').prefetch_related('offers').filter( + offers__isnull=False, offers__is_deleted=True ).distinct() serializer_class = serializers.OrderListForOfferSerializer filter_backends = [DjangoFilterBackend] @@ -91,7 +115,8 @@ class OfferDeleteApiView(views.APIView): def delete(self, request, id): offer = get_object_or_404(Offer, id=id) - offer.delete() + offer.is_deleted = True + offer.save() return Response({'success': True}, status=204) @@ -103,8 +128,12 @@ class DeleteMultipleOfferApiView(views.APIView): if not ids: return Response({"detail": "offer_ids kerak"}, status=400) - deleted_count, _ = Offer.objects.filter(id__in=ids).delete() - return Response({"deleted": deleted_count}, status=200) + count = 0 + for offer in Offer.objects.filter(id__in=ids): + offer.is_deleted = True + offer.save() + count += 1 + return Response({"deleted": count}, status=200) class ChangeOfferStatusApiView(views.APIView):