151 lines
5.4 KiB
Python
151 lines
5.4 KiB
Python
from django.shortcuts import get_object_or_404
|
|
|
|
from rest_framework import generics, views
|
|
from rest_framework.response import Response
|
|
|
|
from django_filters.rest_framework.backends import DjangoFilterBackend
|
|
|
|
from core.apps.shared.paginations.custom import PageNumberPagination
|
|
from core.apps.accounts.permissions.permissions import HasRolePermission
|
|
from core.apps.orders.serializers import offer as serializers
|
|
from core.apps.orders.models import Offer, Order
|
|
from core.apps.orders.filters.order import OrderFilter
|
|
|
|
|
|
class OffersCreateApiView(generics.GenericAPIView):
|
|
permission_classes = [HasRolePermission]
|
|
queryset = Offer.objects.all()
|
|
serializer_class = serializers.MultipleOfferCreateSerializer
|
|
|
|
def post(self, request):
|
|
serializer = self.serializer_class(data=request.data)
|
|
if serializer.is_valid(raise_exception=True):
|
|
serializer.save()
|
|
return Response(
|
|
{
|
|
"success": True,
|
|
"message": "Offers created!"
|
|
},
|
|
status=201
|
|
)
|
|
|
|
|
|
class OfferListApiView(generics.GenericAPIView):
|
|
permission_classes = [HasRolePermission]
|
|
queryset = Order.objects.select_related('product', 'unity').prefetch_related('offers').filter(
|
|
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]
|
|
filterset_class = OrderFilter
|
|
|
|
def get(self, request):
|
|
offer_status = request.query_params.get('status', None)
|
|
search = request.query_params.get('q', None)
|
|
orders = self.filter_queryset(self.get_queryset())
|
|
page = self.paginate_queryset(orders)
|
|
if page is not None:
|
|
serializer = self.serializer_class(page, many=True, context={'status': offer_status, 'search': search})
|
|
return self.get_paginated_response(serializer.data)
|
|
serializer = self.serializer_class(offers, many=True)
|
|
return Response(serializer.data, status=200)
|
|
|
|
|
|
class OfferUpdateApiView(generics.GenericAPIView):
|
|
serializer_class = serializers.OfferUpdateSerializer
|
|
queryset = Offer.objects.all()
|
|
lookup_field = 'id'
|
|
permission_classes = [HasRolePermission]
|
|
|
|
def put(self, request, id):
|
|
offer = get_object_or_404(Offer, id=id)
|
|
serializer = self.serializer_class(data=request.data, instance=offer)
|
|
if serializer.is_valid(raise_exception=True):
|
|
serializer.save()
|
|
return Response(
|
|
{
|
|
'success': True,
|
|
"message": "Offer successfully updated!"
|
|
},
|
|
status=200
|
|
)
|
|
|
|
def patch(self, request, id):
|
|
offer = get_object_or_404(Offer, id=id)
|
|
serializer = self.serializer_class(data=request.data, instance=offer, partial=True)
|
|
if serializer.is_valid(raise_exception=True):
|
|
serializer.save()
|
|
return Response(
|
|
{
|
|
'success': True,
|
|
"message": "Offer successfully updated!"
|
|
},
|
|
status=200
|
|
)
|
|
|
|
|
|
class OfferDeleteApiView(views.APIView):
|
|
permission_classes = [HasRolePermission]
|
|
|
|
def delete(self, request, id):
|
|
offer = get_object_or_404(Offer, id=id)
|
|
offer.is_deleted = True
|
|
offer.save()
|
|
return Response({'success': True}, status=204)
|
|
|
|
|
|
class DeleteMultipleOfferApiView(views.APIView):
|
|
permission_classes = [HasRolePermission]
|
|
|
|
def delete(self, request):
|
|
ids = request.data.get("offer_ids", [])
|
|
if not ids:
|
|
return Response({"detail": "offer_ids kerak"}, status=400)
|
|
|
|
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):
|
|
permission_classes = [HasRolePermission]
|
|
|
|
def post(self, request, id):
|
|
offer = get_object_or_404(Offer, id=id)
|
|
status = request.data.get('status')
|
|
if not status:
|
|
return Response({'success': False, 'message': 'status field is required'}, status=400)
|
|
offer.status = status
|
|
offer.save()
|
|
return Response(
|
|
{'success': True, 'message': 'status updated'},
|
|
status=200
|
|
)
|
|
|