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, LeadEventSerializers 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_event = LeadEventSerializers(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(required=True) mobile1 = serializers.IntegerField(required=True) mobile2 = serializers.IntegerField(required=False) lead_event_id = serializers.IntegerField(required=False) phone = serializers.IntegerField(required=False) 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(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)