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

232 lines
8.0 KiB
Python

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
import pandas as pd
from utils.tools import inline_serializer
from io import BytesIO
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):
permission_classes = (IsAuthenticated,)
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):
permission_classes = (IsAuthenticated,)
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)
class OrderListOperatorApi(generics.ListAPIView):
permission_classes = (IsAuthenticated,)
class OutputSerializer(serializers.ModelSerializer):
customer = inline_serializer(fields={
'id': serializers.IntegerField(),
'name_family': serializers.CharField(),
})
class Meta:
model = OrderModel
exclude = ('sys_ws', )
serializer_class = OutputSerializer
def get_queryset(self):
return list_order_operators(self.request)
class OrderRetrieveOperatorApi(APIView):
permission_classes = (IsAuthenticated,)
class OutputSerializer(serializers.ModelSerializer):
customer = inline_serializer(fields={
'id': serializers.IntegerField(),
'name_family': serializers.CharField(),
})
order_item = inline_serializer(many=True, fields={
'id': serializers.IntegerField(),
'product': inline_serializer(fields={
'id': serializers.IntegerField(),
'name': serializers.CharField(),
'category': inline_serializer(fields={
'id': serializers.IntegerField(),
'name': serializers.CharField(),
})
}),
'product_name': serializers.CharField(),
'price': serializers.IntegerField(),
'amount': serializers.IntegerField(),
})
class Meta:
model = OrderModel
exclude = ('sys_ws', )
serializer_class = OutputSerializer
def get(self, request, order_id):
order = retrieve_order_operators(request, order_id=order_id)
output = self.OutputSerializer(order)
return Response(data=output.data, status=status.HTTP_200_OK)
class OrderRetrieveOperatorExcelApi(APIView):
permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission)
def get(self, request, order_id):
order_df = retrieve_order_item_excel(request=request, order_id=order_id)
excel_file = BytesIO()
with pd.ExcelWriter(excel_file, engine='xlsxwriter', engine_kwargs={'options': {'strings_to_formulas': False, 'strings_to_urls': False}}) as writer:
order_df.to_excel(writer, index=False)
excel_file.seek(0)
response = HttpResponse(excel_file.read(), content_type='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename="output.xlsx"'
return response