Files
crmApi/apps/shop/views/product.py
T
2026-10-08 16:37:45 +03:30

181 lines
6.7 KiB
Python

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=200)
price = serializers.IntegerField(required=True, min_value=0, max_value=9223372036854775807)
category = serializers.IntegerField(required=True)
acc_code = serializers.CharField(required=False)
attr = serializers.JSONField(required=False, allow_null=True)
order_prd = serializers.IntegerField(required=False, allow_null=True, min_value=0, max_value=2147483647)
excel_order = serializers.IntegerField(required=False, allow_null=True, min_value=0, max_value=2147483647)
view_only = serializers.BooleanField(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=200)
price = serializers.IntegerField(required=True, min_value=0, max_value=9223372036854775807)
category = serializers.IntegerField(required=True)
acc_code = serializers.CharField(required=False)
attr = serializers.JSONField(required=False, allow_null=True)
order_prd = serializers.IntegerField(required=False, allow_null=True, min_value=0, max_value=2147483647)
excel_order = serializers.IntegerField(required=False, allow_null=True, min_value=0, max_value=2147483647)
view_only = serializers.BooleanField(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, partial=True)
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 = ProductModel
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 if category.image else None,
"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