from apps.shop.models import Order as OrderModel 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 utils.get_cuser_role import get_cuser_role_uuid 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 apps.customer.models import Customer as CustomerModel from rest_framework.permissions import IsAuthenticated from utils import custom_permissions class OrderCreateApi(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceAdminPermission) class InputSerializer(serializers.Serializer): responsible_group_id = serializers.IntegerField(required=True) customer_id = serializers.IntegerField(required=True) total_amount = serializers.DecimalField(max_digits=20, decimal_places=2) factor_type = serializers.IntegerField(required=True) factor_status = serializers.IntegerField(required=True) class OutputSerializer(serializers.ModelSerializer): class Meta: model = OrderModel 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) order_obj = create_order(**serializer.validated_data, workspace=user_workspace) output = self.OutputSerializer(order_obj) return Response(data=output.data, status=status.HTTP_201_CREATED) class OrderAndItemCreateApi(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceCustomerPermission) class InputSerializer(serializers.Serializer): items = serializers.CharField(required=True) class OutputSerializer(serializers.ModelSerializer): class Meta: model = OrderModel 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_uuid = get_cuser_role_uuid(request) try: customer_obj = CustomerModel.objects.get(cuser_role__uuid=cuser_role_uuid) except Exception as exp: raise exceptions.ValidationError({'error': f'customer obj not found: {exp}'}) order_obj = create_order_and_items(**serializer.validated_data, customer=customer_obj, workspace=user_workspace) clean_cart(cuser_role_uuid=cuser_role_uuid,workspace_uuid=user_workspace.uuid) output = self.OutputSerializer(order_obj) return Response(data=output.data, status=status.HTTP_201_CREATED) class OrderRetrieveApi(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceCustomerPermission) class OutputSerializer(serializers.ModelSerializer): class Meta: model = OrderModel exclude = ('sys_ws', ) def get(self, request, order_id): user_workspace_uuid = get_user_workspace_uuid(request=request) cuser_role_uuid = get_cuser_role_uuid(request=request) request_user = request.user order_obj = retrieve_order(cuser_role_uuid=cuser_role_uuid, order_id=order_id, workspace_uuid=user_workspace_uuid) output = self.OutputSerializer(order_obj) return Response(data=output.data, status=status.HTTP_200_OK) class OrderUpdateApi(APIView): class InputSerializer(serializers.Serializer): responsible_group_id = serializers.IntegerField(required=False) customer_id = serializers.IntegerField(required=False) total_amount = serializers.DecimalField(max_digits=20, decimal_places=2, required=False) factor_type = serializers.IntegerField(required=False) factor_status = serializers.IntegerField(required=False) class OutputSerializer(serializers.ModelSerializer): class Meta: model = OrderModel exclude = ('sys_ws', ) def patch(self, request, order_id): serializer = self.InputSerializer(data=request.data) serializer.is_valid(raise_exception=True) user_workspace_uuid = get_user_workspace_uuid(request) order_obj = update_order(order_id=order_id, **serializer.validated_data, workspace_uuid=user_workspace_uuid) output = self.OutputSerializer(order_obj) return Response(data=output.data, status=status.HTTP_200_OK) class OrderDeleteApi(APIView): def delete(self, request, order_id: int): user_workspace_uuid = get_user_workspace_uuid(request=request) order_obj = delete_order(order_id=order_id, workspace_uuid=user_workspace_uuid) output = { 'order_id': order_id, 'message': 'deleted successfully' } return Response(data=output, status=status.HTTP_200_OK) class OrderListApi(generics.ListAPIView): class OutputSerializer(serializers.ModelSerializer): class Meta: model = OrderModel exclude = ('sys_ws', ) serializer_class = OutputSerializer def get_queryset(self): cuser_role_uuid = get_cuser_role_uuid(request=self.request) user_workspace_uuid = get_user_workspace_uuid(request=self.request) return list_order(cuser_role_uuid=cuser_role_uuid, workspace_uuid=user_workspace_uuid)