from django_filters.rest_framework import DjangoFilterBackend from rest_framework import serializers from rest_framework.generics import ListAPIView from rest_framework.views import APIView from apps.lead.models import Lead as LeadModel from rest_framework.response import Response from rest_framework import status from apps.report.selector import user_lead_report_count_by_date from apps.cuser.models import CuserRole as CuserRoleModel from datetime import datetime from apps.report.selector import list_leads_api from utils.pagination import CustomPagination from utils.tools import inline_serializer class ReportApiView(APIView): class ResultSerializer(serializers.Serializer): class OperatorSerializer(serializers.Serializer): cuser_role__name_family = serializers.CharField() count = serializers.IntegerField() su = OperatorSerializer(many=True) un = OperatorSerializer(many=True) fa = OperatorSerializer(many=True) all = OperatorSerializer(many=True) def get(self, request): date_format = "%Y-%m-%d" start_datetime = request.query_params.get('start_datetime', None) if start_datetime: start_datetime = start_datetime.replace(" ", "") end_datetime = request.query_params.get('end_datetime', None) if end_datetime: end_datetime = end_datetime.replace(" ", "") #example start_datetime : 2024-03-20T14:31:16 03:30 if start_datetime and end_datetime: start_dt = datetime.strptime(start_datetime, date_format) end_dt = datetime.strptime(end_datetime, date_format) else: start_dt = datetime.now() end_dt = datetime.now() # status = request.query_params.get('status') #همه users_all_lead_count = user_lead_report_count_by_date(start_datetime=start_dt, end_datetime=end_dt) #موفق users_su_lead_count = user_lead_report_count_by_date(status='SU', start_datetime=start_dt, end_datetime=end_dt) #شکست users_fa_lead_count = user_lead_report_count_by_date(status='FA', start_datetime=start_dt, end_datetime=end_dt) #نا معلوم users_un_lead_count = user_lead_report_count_by_date(status='UN', start_datetime=start_dt, end_datetime=end_dt) result = { 'su': users_su_lead_count, 'fa': users_fa_lead_count, 'un': users_un_lead_count, 'all': users_all_lead_count, } output_serializer = self.ResultSerializer(result) return Response(output_serializer.data) 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_api()