248 lines
8.2 KiB
Python
248 lines
8.2 KiB
Python
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
|
|
from django.core.exceptions import ValidationError as DjangoValidationError
|
|
from utils.validations.mobile import normalize_mobile
|
|
|
|
|
|
class MobileField(serializers.CharField):
|
|
def to_internal_value(self, data):
|
|
value = super().to_internal_value(data)
|
|
try:
|
|
return normalize_mobile(value)
|
|
except DjangoValidationError:
|
|
raise serializers.ValidationError('شماره موبایل معتبر وارد کنید.')
|
|
|
|
|
|
|
|
|
|
class CustomerRetrieveApi(APIView):
|
|
|
|
permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission)
|
|
|
|
class OutputSerializer(serializers.ModelSerializer):
|
|
cuser_role = inline_serializer(fields={
|
|
'id': serializers.IntegerField(required=False),
|
|
'cuser': inline_serializer(fields={
|
|
'id': serializers.IntegerField(),
|
|
'mobile': serializers.IntegerField(),
|
|
}),
|
|
'customer_panel': serializers.BooleanField(required=False)
|
|
})
|
|
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):
|
|
mobile = MobileField(required=False, allow_null=True)
|
|
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):
|
|
mobile = MobileField(required=False, allow_null=True)
|
|
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, partial=True)
|
|
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 = MobileField(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)
|
|
|
|
|