from apps.shop.models import Product as ProductModel from rest_framework.views import APIView from rest_framework import serializers from utils.get_user_workspace import get_user_workspace_uuid, get_user_workspace from rest_framework.response import Response from rest_framework import status from apps.shop.services import * from apps.shop.selectors import * from rest_framework import generics from rest_framework.permissions import IsAuthenticated from utils import custom_permissions class ProductCreateApi(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceAdminPermission) class InputSerializer(serializers.Serializer): name = serializers.CharField(required=True, max_length=20) price = serializers.DecimalField(required=True, max_digits=20, decimal_places=2) category = serializers.IntegerField(required=True) acc_code = serializers.CharField(required=False) attr = serializers.CharField(required=False) class OutputSerializer(serializers.ModelSerializer): class Meta: model = ProductModel 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) product_obj = create_product(**serializer.validated_data, workspace=user_workspace) output = self.OutputSerializer(product_obj) return Response(data=output.data, status=status.HTTP_201_CREATED) class ProductRetrieveApi(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceCustomerPermission) class OutputSerializer(serializers.ModelSerializer): class Meta: model = ProductModel exclude = ('sys_ws', ) def get(self, request, product_id: int): user_workspace_uuid = get_user_workspace_uuid(request) product_obj = retrieve_product(product_id, workspace_uuid=user_workspace_uuid) output = self.OutputSerializer(product_obj) return Response(data=output.data, status=status.HTTP_200_OK) class ProductUpdateApi(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceAdminPermission) class InputSerializer(serializers.Serializer): name = serializers.CharField(required=True, max_length=20) price = serializers.DecimalField(required=True, max_digits=20, decimal_places=2) category = serializers.IntegerField(required=True) acc_code = serializers.CharField(required=False) attr = serializers.CharField(required=False) class OutputSerializer(serializers.ModelSerializer): class Meta: model = ProductModel exclude = ('sys_ws', ) def put(self, request, product_id: int): serializer = self.InputSerializer(data=request.data) serializer.is_valid(raise_exception=True) user_workspace_uuid = get_user_workspace_uuid(request) product_obj = update_product(product_id=product_id, **serializer.validated_data, workspace_uuid=user_workspace_uuid) output = self.OutputSerializer(product_obj) return Response(data=output.data, status=status.HTTP_200_OK) class ProductDeleteApi(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceAdminPermission) class OutputSerializer(serializers.ModelSerializer): class Meta: model = ProductModel exclude = ('sys_ws', ) def delete(self, request, product_id: int): user_workspace_uuid = get_user_workspace_uuid(request=request) product_obj = delete_product(product_id=product_id, workspace_uuid=user_workspace_uuid) output = { 'id': product_id, 'status': 'deleted successfully' } return Response(data=output, status=status.HTTP_200_OK) class ProductListApi(generics.ListAPIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceCustomerPermission) class OutputSerializer(serializers.ModelSerializer): class Meta: model = ProductCategoryModel exclude = ('sys_ws', ) def get_queryset(self): user_workspace_uuid = get_user_workspace_uuid(self.request) return list_product(workspace_uuid=user_workspace_uuid) serializer_class = OutputSerializer class ProductListCategoryApi(generics.ListAPIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceCustomerPermission) class OutputSerializer(serializers.Serializer): id = serializers.IntegerField() name = serializers.CharField() price = serializers.FloatField() view_only = serializers.BooleanField() class Meta: exclude = ('sys_ws', ) def list(self, request, category_id): # Note the use of `get_queryset()` instead of `self.queryset` queryset_data = self.get_queryset() serializer = self.get_serializer(queryset_data, many=True) workspace_uuid = get_user_workspace_uuid(request=request) category = retrieve_product_category(category_id=category_id, workspace_uuid=workspace_uuid) view_only_products = list_view_only_product_by_category(category_id=category_id, workspace_uuid=workspace_uuid) view_only_products_serializer = self.get_serializer(view_only_products, many=True) if len(serializer.data) == 0: return Response( status=404, ) data = { "category_name": category.name, "category_img": category.image.url, "products": serializer.data, } if len(view_only_products_serializer.data) >=1: data['view_only_products'] = view_only_products_serializer.data else: data['view_only_products'] = None return Response(data) def get_queryset(self): user_workspace_uuid = get_user_workspace_uuid(self.request) category_id = self.kwargs.get('category_id') return list_product_by_category(workspace_uuid=user_workspace_uuid, category_id=category_id) serializer_class = OutputSerializer