from rest_framework import generics, views from apps.shop.models import Cart as CartModel, Product as ProductModel from utils.get_user_workspace import get_user_workspace_uuid from utils.get_cuser_role import get_cuser_role_uuid from apps.shop.selectors import list_cart from rest_framework import serializers from rest_framework.permissions import IsAuthenticated from utils import custom_permissions from utils.get_user_workspace import get_user_workspace_uuid, get_user_workspace from utils.get_cuser_role import get_cuser_role from rest_framework.response import Response from apps.shop.services import add_to_cart, delete_cart_iteam from rest_framework import status class CartListApi(generics.ListAPIView): class OutputSerializer(serializers.ModelSerializer): class ProductSerializer(serializers.ModelSerializer): class CategorySerializer(serializers.Serializer): name = serializers.CharField() category = CategorySerializer() class Meta: model = ProductModel exclude = ('sys_ws', 'created_at', 'updated_at', 'acc_code', 'attr') product = ProductSerializer() class Meta: model = CartModel exclude = ('sys_ws', 'created_at', 'updated_at', 'cuser_role') serializer_class = OutputSerializer def get_queryset(self): user_workspace_uuid = get_user_workspace_uuid(self.request) cuser_role_uuid = get_cuser_role_uuid(self.request) return list_cart(workspace_uuid=user_workspace_uuid, cuser_role_uuid=cuser_role_uuid) class CartCreateApi(views.APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceCustomerPermission) class InputSerializer(serializers.Serializer): product_id = serializers.IntegerField(required=True) quantity = serializers.IntegerField(required=True) class OutputSerializer(serializers.ModelSerializer): class Meta: model = CartModel exclude = ('sys_ws', ) def post(self, request): serializer = self.InputSerializer(data=request.data) serializer.is_valid(raise_exception=True) user_workspace = get_user_workspace(request) cuser_role = get_cuser_role(request) cart_obj = add_to_cart(**serializer.validated_data, workspace=user_workspace, cuser_role=cuser_role) output = self.OutputSerializer(cart_obj) return Response(data=output.data, status=status.HTTP_201_CREATED) class CartDeleteApi(views.APIView): def delete(self, request, cart_id: int): user_workspace_uuid = get_user_workspace_uuid(request=request) cuser_role_uuid = get_cuser_role_uuid(request=request) cart_obj = delete_cart_iteam(cart_id=cart_id, cuser_role_uuid=cuser_role_uuid, workspace_uuid=user_workspace_uuid) output = { 'order_id': cart_obj, 'message': 'deleted successfully' } return Response(data=output, status=status.HTTP_200_OK)