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})