import json from django.utils import timezone from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from rest_framework.decorators import api_view from rest_framework import viewsets from rest_framework.permissions import IsAuthenticated from rest_framework.decorators import permission_classes # from django_filters.rest_framework import DjangoFilterBackend from .serializers import ( PackageSerializer, VehicleTypeSerializer, ExtraServiceSerializer, BookingSerializer ) from .models import ( PackageDetails, VehicleType, ExtraService, Booking, BookingState ) # PACKAGE & SERVICE VIEWS # ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––# class PackageViewSet(viewsets.ModelViewSet): serializer_class = PackageSerializer permission_classes = (IsAuthenticated,) def get_queryset(self): return PackageDetails.objects.filter( pk=self.kwargs['pk']) class VehicleTypeViewSet(viewsets.ModelViewSet): queryset = VehicleType.objects.all() serializer_class = VehicleTypeSerializer permission_classes = (IsAuthenticated,) class ExtraServiceViewSet(viewsets.ModelViewSet): queryset = ExtraService.objects.all() serializer_class = ExtraServiceSerializer permission_classes = (IsAuthenticated,) # BOOKING & CART VIEWS # ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––# class BookingViewSet(viewsets.ModelViewSet): serializer_class = BookingSerializer # permission_classes = (IsAuthenticated,) queryset = ( Booking.objects .select_related('client') .prefetch_related('service') ) # filter_backends = (DjangoFilterBackend,) # filterset_fields = ('booking_status', 'client__name',) def dispatch(self, *args, **kwargs): response = super().dispatch(*args, **kwargs) return response @api_view(['GET']) @permission_classes((IsAuthenticated, )) def driver_get_ready_bookings(request): bookings = BookingSerializer( Booking.objects.filter(booking_status=BookingState.PENDING, driver=None).order_by("-id"), many=True ).data return JsonResponse({"driver_bookings": bookings}) @csrf_exempt # POST # params: access_token, order_id def driver_pick_booking(request): if request.method == "POST": # Get driver driver = request.user.driver # Check that driver only has one order if Booking.objects.filter(driver=driver).exclude( booking_status=BookingState.ON_THE_WAY ): return JsonResponse({ "status": "failed", "error": "You can only cater for one booking at a time." }) try: booking = Booking.objects.get( id=request.POST["booking_id"], driver=None, booking_status=BookingState.IN_PROGRESS ) booking.driver = driver booking.booking_status = BookingState.ON_THE_WAY booking.pickedup_at = timezone.now() booking.save() return JsonResponse({"status": "success"}) except Booking.DoesNotExist: return JsonResponse({ "status": "failed", "error": "This order has been picked up by another driver." }) return JsonResponse({}) # GET params: access_token @api_view(['GET']) @permission_classes((IsAuthenticated, )) def driver_get_latest_booking(request): # Get driver driver = request.user.driver booking = BookingSerializer( Booking.objects.filter(driver=driver).order_by("booked_at").last() ).data return JsonResponse({"next_jobs": booking}) # POST params: access_token, order_id @csrf_exempt def driver_complete_booking(request): # Get driver driver = request.user.driver booking = Booking.objects.get(id=request.POST["booking_id"], driver=driver) booking.status = BookingState.COMPLETE booking.save() return JsonResponse({"status": "success"})