github.com/ismailbayram/bigpicture@v0.0.0-20231225173155-e4b21f5efcff/internal/browser/pyproject/baskets/resources/views.py (about) 1 from rest_framework import status 2 from rest_framework import viewsets 3 from rest_framework.decorators import action 4 from rest_framework.response import Response 5 6 from api.permissions import HasGroupPermission 7 from users.enums import GroupType 8 from baskets.enums import PromotionType 9 from baskets.models import Campaign 10 from baskets.service import BasketService 11 from baskets.resources.serializers import (BasketSerializer, CreateBasketItemSerializer, 12 CampaignSerializer) 13 from reservations.enums import ReservationStatus 14 15 16 class BasketViewSet(viewsets.ViewSet): 17 permission_classes = (HasGroupPermission,) 18 permission_groups = { 19 'view_basket': [GroupType.customer], 20 'add_item': [GroupType.customer], 21 'delete_item': [GroupType.customer], 22 } 23 service = BasketService() 24 25 @action(methods=['GET'], detail=False) 26 def view_basket(self, request, *args, **kwargs): 27 basket = self.service.get_or_create_basket(request.user.customer_profile) 28 self.service.apply_discounts(basket) 29 serializer = BasketSerializer(instance=basket) 30 return Response({'basket': serializer.data}, status=status.HTTP_200_OK) 31 32 @action(methods=['POST'], detail=False) 33 def add_item(self, request, *args, **kwargs): 34 serializer = CreateBasketItemSerializer(data=request.data) 35 serializer.is_valid(raise_exception=True) 36 basket = self.service.get_or_create_basket(request.user.customer_profile) 37 self.service.add_basket_item(basket, **serializer.validated_data) 38 self.service.apply_discounts(basket) 39 serializer = BasketSerializer(instance=basket) 40 return Response({'basket': serializer.data}, status=status.HTTP_201_CREATED) 41 42 @action(methods=['DELETE'], detail=False) 43 def delete_item(self, request, *args, **kwargs): 44 serializer = CreateBasketItemSerializer(data=request.data) 45 serializer.is_valid(raise_exception=True) 46 basket = self.service.get_or_create_basket(request.user.customer_profile) 47 self.service.delete_basket_item(basket, **serializer.validated_data) 48 self.service.apply_discounts(basket) 49 serializer = BasketSerializer(instance=basket) 50 return Response({'basket': serializer.data}, status=status.HTTP_204_NO_CONTENT) 51 52 53 class CampaignViewSet(viewsets.ReadOnlyModelViewSet): 54 queryset = Campaign.objects.filter(is_active=True) 55 serializer_class = CampaignSerializer 56 permission_classes = (HasGroupPermission,) 57 permission_groups = { 58 'retrieve': [GroupType.customer], 59 } 60 61 def retrieve(self, request, *args, **kwargs): 62 campaign = self.get_object() 63 customer_profile = request.user.customer_profile 64 res_count = customer_profile.reservation_set.filter(status=ReservationStatus.completed).count() % 9 65 if campaign.promotion_type == PromotionType.one_free_in_nine: 66 return Response({'completed': res_count})