Files
crmApi/apps/lead/views.py
T

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)