from rest_framework.views import APIView from rest_framework import serializers from apps.customer.models import Customer as CustomerModel from apps.customer.selectors import retrieve_customer, list_customer, list_customer_v2 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 rest_framework.permissions import IsAuthenticated from utils import custom_permissions from rest_framework import generics from apps.customer.services import create_customer, update_customer, delete_customer, create_customer_v2 from apps.workspace.models import City as CityModel from utils.tools import inline_model_serializer, inline_serializer from utils.pagination import CustomPagination from django_filters import rest_framework as filters class CustomerRetrieveApi(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission) class OutputSerializer(serializers.ModelSerializer): class Meta: model = CustomerModel fields = '__all__' def get(self, request, customer_id: int): user_workspace_uuid = get_user_workspace_uuid(request=request) customer_obj = retrieve_customer(customer_id=customer_id, workspace_uuid=user_workspace_uuid) output = self.OutputSerializer(customer_obj) return Response(data=output.data, status=status.HTTP_200_OK) class CustomerListApi(generics.ListAPIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission) class OutputSerializer(serializers.ModelSerializer): class CitySerializer(serializers.ModelSerializer): class OstanSerializer(serializers.ModelSerializer): class Meta: model = CityModel fields = '__all__' ostan = OstanSerializer() class Meta: model = CityModel fields = '__all__' city = CitySerializer() class Meta: model = CustomerModel fields = '__all__' serializer_class = OutputSerializer def get_queryset(self): user_workspace_uuid = get_user_workspace_uuid(request=self.request) name_family = self.request.query_params.get('name_family') mobile = self.request.query_params.get('mobile') customer_objs = list_customer(workspace_uuid=user_workspace_uuid, name_family=name_family, mobile=mobile) return customer_objs class CustomerCreateApi(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission) class InputSerializer(serializers.ModelSerializer): class Meta: model = CustomerModel fields = '__all__' read_only_fields = ['sys_ws', ''] class OutputSerializer(serializers.ModelSerializer): class Meta: model = CustomerModel 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=request) customer_obj = create_customer(**serializer.validated_data, workspace=user_workspace) output = self.OutputSerializer(customer_obj) return Response(data=output.data, status=status.HTTP_201_CREATED) class CustomerUpdateApi(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission) class InputSerializer(serializers.ModelSerializer): class Meta: model = CustomerModel fields = '__all__' read_only_fields = ['sys_ws', ''] class OutputSerializer(serializers.ModelSerializer): class Meta: model = CustomerModel exclude = ('sys_ws', ) def patch(self, request, customer_id: int): serializer = self.InputSerializer(data=request.data) serializer.is_valid(raise_exception=True) user_workspace_uuid = get_user_workspace_uuid(request=request) customer_obj = update_customer(**serializer.validated_data, customer_id=customer_id, workspace_uuid=user_workspace_uuid) output = self.OutputSerializer(customer_obj) return Response(data=output.data, status=status.HTTP_200_OK) class CustomerDeleteApi(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission) class OutputSerializer(serializers.ModelSerializer): class Meta: model = CustomerModel exclude = ('sys_ws', ) def delete(self, request, customer_id: int): user_workspace_uuid = get_user_workspace_uuid(request=request) delete_customer(customer_id=customer_id, workspace_uuid=user_workspace_uuid) return Response(status=status.HTTP_200_OK) class CustomerListApiV2(generics.ListAPIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission) class Pagination(CustomPagination): page_size = 10 page_size_query_param = 'page_size' max_page_size = 20 class OutputSerializer(serializers.ModelSerializer): city = inline_serializer(fields={ 'id': serializers.IntegerField(), 'name': serializers.CharField(), 'ostan': inline_serializer(many=False, fields={ 'id': serializers.IntegerField(), 'name': serializers.CharField() }) }) shive_ashenaei = inline_serializer(fields={ 'id': serializers.IntegerField(), 'name': serializers.CharField(), }) responsible_group = inline_serializer(fields={ 'id': serializers.IntegerField(), 'name': serializers.CharField(), }) class Meta: model = CustomerModel fields = '__all__' class CustomerFilter(filters.FilterSet): class Meta: model = CustomerModel fields = { 'name_family': ['exact', 'contains'], 'mobile': ['exact', 'contains'], } serializer_class = OutputSerializer pagination_class = Pagination filter_backends = [filters.DjangoFilterBackend, ] filterset_class = CustomerFilter def get_queryset(self): customer_objs = list_customer_v2(request=self.request) return customer_objs class CustomerCreateApiV2(APIView): permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission) class InputSerializer(serializers.Serializer): name_family = serializers.CharField(max_length=25, required=True) mobile = serializers.IntegerField(required=True) phone = serializers.IntegerField(required=True) address = serializers.CharField(max_length=300, required=True) city = serializers.IntegerField(required=True) shive_ashenaei = serializers.IntegerField(required=True) responsible_group = serializers.IntegerField(required=True) def post(self, request): serializer = self.InputSerializer(data=request.data) serializer.is_valid(raise_exception=True) customer = create_customer_v2(request=request, **serializer.validated_data) return Response(data={'id': customer.id}, status=status.HTTP_201_CREATED)