324 lines
11 KiB
Python
324 lines
11 KiB
Python
from django.shortcuts import render
|
|
from rest_framework.views import APIView
|
|
from rest_framework.generics import ListAPIView
|
|
from rest_framework.response import Response
|
|
from rest_framework import serializers
|
|
from apps.lead.serializers import LeadTypeSerializers, ProductTypeSerializers,\
|
|
LeadSourceSerializers, LeadStepSerializers, ShahrSerializers
|
|
from apps.lead.selectors import fields_new_lead_form
|
|
from apps.lead.services import create_new_lead, update_lead, update_lead_status,\
|
|
update_lead_comment, delete_lead_comment, create_lead_comment
|
|
from apps.lead.models import Lead as LeadModel
|
|
from rest_framework import status
|
|
from apps.lead.selectors import list_leads, retrieve_lead, retrieve_summary_lead
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from utils import custom_permissions
|
|
from utils.tools import inline_serializer
|
|
from utils.pagination import CustomPagination
|
|
from django_filters.rest_framework import DjangoFilterBackend
|
|
# Create your views here.
|
|
|
|
|
|
class LeadFormItemsApi(APIView):
|
|
|
|
class OutputSerializer(serializers.Serializer):
|
|
lead_types = LeadTypeSerializers(many=True)
|
|
product_types = ProductTypeSerializers(many=True)
|
|
lead_source = LeadSourceSerializers(many=True)
|
|
lead_steps = LeadStepSerializers(many=True)
|
|
shahr = ShahrSerializers(many=True)
|
|
|
|
def get(self, request):
|
|
|
|
fields_value = fields_new_lead_form(request)
|
|
serializer = self.OutputSerializer(fields_value)
|
|
|
|
return Response(data=serializer.data)
|
|
|
|
|
|
class LeadCreateApi(APIView):
|
|
|
|
class InputSerializer(serializers.Serializer):
|
|
title = serializers.CharField(max_length=100, required=True)
|
|
customer_id = serializers.IntegerField(required=True)
|
|
desc = serializers.CharField(max_length=200, required=True)
|
|
lead_type_id = serializers.IntegerField(required=True)
|
|
product_type_id = serializers.IntegerField(required=True)
|
|
lead_source_id = serializers.IntegerField(required=True)
|
|
lead_step_id = serializers.IntegerField(required=True)
|
|
city_id = serializers.IntegerField(required=True)
|
|
|
|
class OutputSerializer(serializers.Serializer):
|
|
id = serializers.IntegerField(required=True)
|
|
|
|
def post(self, request):
|
|
|
|
serializer = self.InputSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
new_lead = create_new_lead(request=request, **serializer.validated_data)
|
|
|
|
output = self.OutputSerializer(new_lead)
|
|
|
|
return Response(data=output.data, status=status.HTTP_201_CREATED)
|
|
|
|
|
|
class LeadUpdateApi(APIView):
|
|
|
|
class InputSerializer(serializers.Serializer):
|
|
title = serializers.CharField(max_length=100, required=True)
|
|
customer_id = serializers.IntegerField(required=True)
|
|
desc = serializers.CharField(max_length=200, required=True)
|
|
lead_type_id = serializers.IntegerField(required=True)
|
|
product_type_id = serializers.IntegerField(required=True)
|
|
lead_source_id = serializers.IntegerField(required=True)
|
|
lead_step_id = serializers.IntegerField(required=True)
|
|
city_id = serializers.IntegerField(required=True)
|
|
|
|
class OutputSerializer(serializers.Serializer):
|
|
id = serializers.IntegerField(required=True)
|
|
|
|
def patch(self, request, lead_id):
|
|
|
|
serializer = self.InputSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
lead = update_lead(request=request, lead_id=lead_id, **serializer.validated_data)
|
|
|
|
output = self.OutputSerializer(lead)
|
|
|
|
return Response(data=output.data, status=status.HTTP_201_CREATED)
|
|
|
|
|
|
class LeadUpdateStatusApi(APIView):
|
|
|
|
class InputSerializer(serializers.Serializer):
|
|
status = serializers.CharField(max_length=2, required=True)
|
|
|
|
class OutputSerializer(serializers.Serializer):
|
|
id = serializers.IntegerField(required=True)
|
|
|
|
def patch(self, request, lead_id):
|
|
|
|
serializer = self.InputSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
lead = update_lead_status(request=request, lead_id=lead_id, **serializer.validated_data)
|
|
|
|
output = self.OutputSerializer(lead)
|
|
|
|
return Response(data=output.data, status=status.HTTP_201_CREATED)
|
|
|
|
|
|
class LeadListApi(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):
|
|
|
|
customer = inline_serializer(many=False, fields={'name_family': serializers.CharField(), })
|
|
|
|
product_type = inline_serializer(many=False, fields={'name': serializers.CharField(), })
|
|
|
|
type = inline_serializer(many=False, fields={'title': serializers.CharField(), })
|
|
|
|
source = inline_serializer(many=False, fields={'title': serializers.CharField(), })
|
|
|
|
step = inline_serializer(many=False, fields={
|
|
'id': serializers.IntegerField(),
|
|
'name': serializers.CharField(),
|
|
})
|
|
|
|
city = inline_serializer(many=False, fields={
|
|
'name': serializers.CharField(),
|
|
'ostan': inline_serializer(many=False, fields={'name': serializers.CharField() })
|
|
})
|
|
|
|
cuser_role = inline_serializer(many=False, fields={
|
|
'id': serializers.IntegerField(),
|
|
'name_family': serializers.CharField()
|
|
})
|
|
|
|
class Meta:
|
|
model = LeadModel
|
|
fields = '__all__'
|
|
|
|
serializer_class = OutputSerializer
|
|
pagination_class = Pagination
|
|
|
|
filter_backends = [DjangoFilterBackend]
|
|
filterset_fields = ['step', 'status', ]
|
|
|
|
def get_queryset(self):
|
|
return list_leads(request=self.request)
|
|
|
|
|
|
class LeadRetrieveApi(APIView):
|
|
|
|
permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission)
|
|
|
|
class OutputSerializer(serializers.ModelSerializer):
|
|
|
|
customer = inline_serializer(many=False, fields={
|
|
'id': serializers.IntegerField(),
|
|
'name_family': serializers.CharField(),
|
|
})
|
|
|
|
product_type = inline_serializer(many=False, fields={
|
|
'id': serializers.IntegerField(),
|
|
'name': serializers.CharField(),
|
|
})
|
|
|
|
type = inline_serializer(many=False, fields={
|
|
'id': serializers.IntegerField(),
|
|
'title': serializers.CharField(),
|
|
})
|
|
|
|
source = inline_serializer(many=False, fields={
|
|
'id': serializers.IntegerField(),
|
|
'title': serializers.CharField(),
|
|
})
|
|
|
|
step = inline_serializer(many=False, fields={
|
|
'id': serializers.IntegerField(),
|
|
'name': serializers.CharField(),
|
|
})
|
|
|
|
city = inline_serializer(many=False, fields={
|
|
'id': serializers.IntegerField(),
|
|
'name': serializers.CharField(),
|
|
'ostan': inline_serializer(many=False, fields={
|
|
'id': serializers.IntegerField(),
|
|
'name': serializers.CharField()
|
|
})
|
|
})
|
|
|
|
lead_comment = inline_serializer(many=True, fields={
|
|
'id': serializers.IntegerField(),
|
|
'created_at': serializers.DateTimeField(),
|
|
'desc': serializers.CharField()
|
|
})
|
|
|
|
lead_reminder = inline_serializer(many=False, fields={
|
|
'id': serializers.IntegerField(),
|
|
'created_at': serializers.DateTimeField(),
|
|
'datetime': serializers.DateTimeField(),
|
|
'desc': serializers.CharField()
|
|
})
|
|
|
|
class Meta:
|
|
model = LeadModel
|
|
fields = '__all__'
|
|
|
|
serializer_class = OutputSerializer
|
|
|
|
def get(self, request, lead_id):
|
|
|
|
lead = retrieve_lead(request=request, id=lead_id)
|
|
output = self.OutputSerializer(lead, many=False)
|
|
|
|
return Response(data=output.data)
|
|
|
|
|
|
class LeadCommentCreateApi(APIView):
|
|
|
|
class InputSerializer(serializers.Serializer):
|
|
desc = serializers.CharField(max_length=200, required=True)
|
|
|
|
class OutputSerializer(serializers.Serializer):
|
|
id = serializers.IntegerField(required=True)
|
|
|
|
def post(self, request, lead_id):
|
|
|
|
serializer = self.InputSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
lead = create_lead_comment(request=request, lead_id=lead_id, **serializer.validated_data)
|
|
|
|
output = self.OutputSerializer(lead)
|
|
|
|
return Response(data=output.data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class LeadCommentUpdateApi(APIView):
|
|
|
|
class InputSerializer(serializers.Serializer):
|
|
desc = serializers.CharField(max_length=200, required=True)
|
|
|
|
class OutputSerializer(serializers.Serializer):
|
|
id = serializers.IntegerField(required=True)
|
|
|
|
def patch(self, request, lead_comment_id):
|
|
|
|
serializer = self.InputSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
lead = update_lead_comment(request=request, lead_comment_id=lead_comment_id, **serializer.validated_data)
|
|
|
|
output = self.OutputSerializer(lead)
|
|
|
|
return Response(data=output.data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class LeadCommentDeleteApi(APIView):
|
|
|
|
class OutputSerializer(serializers.Serializer):
|
|
id = serializers.IntegerField(required=True)
|
|
|
|
def delete(self, request, lead_comment_id):
|
|
|
|
lead = delete_lead_comment(request=request, lead_comment_id=lead_comment_id)
|
|
|
|
output = self.OutputSerializer(lead)
|
|
|
|
return Response(data=output.data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class LeadSummaryApi(APIView):
|
|
|
|
permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission)
|
|
|
|
class OutputSerializer(serializers.Serializer):
|
|
|
|
mozakere = inline_serializer(many=True, fields={
|
|
'id': serializers.IntegerField(),
|
|
'customer': inline_serializer(fields={
|
|
'id': serializers.IntegerField(),
|
|
'name_family': serializers.CharField(),
|
|
}),
|
|
'title': serializers.CharField(),
|
|
'created_at': serializers.DateTimeField()
|
|
})
|
|
|
|
pishfactor = inline_serializer(many=True, fields={
|
|
'id': serializers.IntegerField(),
|
|
'customer': inline_serializer(fields={
|
|
'id': serializers.IntegerField(),
|
|
'name_family': serializers.CharField(),
|
|
}),
|
|
'title': serializers.CharField(),
|
|
'created_at': serializers.DateTimeField()
|
|
})
|
|
|
|
kharid = inline_serializer(many=True, fields={
|
|
'id': serializers.IntegerField(),
|
|
'customer': inline_serializer(fields={
|
|
'id': serializers.IntegerField(),
|
|
'name_family': serializers.CharField(),
|
|
}),
|
|
'title': serializers.CharField(),
|
|
'created_at': serializers.DateTimeField()
|
|
})
|
|
|
|
def get(self, request):
|
|
|
|
leads = retrieve_summary_lead(request=request)
|
|
output = self.OutputSerializer(leads, many=False)
|
|
|
|
return Response(data=output.data, status=status.HTTP_200_OK)
|