import logging from datetime import timedelta from django.utils.translation import gettext as _ from django.utils import timezone from django.db.models import Q from rest_framework.response import Response from rest_framework.exceptions import ParseError from pingcap_sso.api.base import AdminEndpoint from pingcap_sso.api.permissions import AskTUGModeratorOrStaffWithMethodPermission from pingcap_sso.models import ( FXCRMLeads, ) from pingcap_sso.utils import time as ptime logger = logging.getLogger(__name__) class LeadsListEndpoint(AdminEndpoint): permission_classes = (AskTUGModeratorOrStaffWithMethodPermission, ) perms_map = { 'GET': ['pingcap_sso.view_fxcrmleads'] } def get(self, request): """audit_log: 查看了商机线索列表""" try: cur_page = int(request.GET.get('currentPage', 1)) per_page = int(request.GET.get('perPage', 10)) per_page = min(per_page, 100) user_ids = request.GET.get('user_ids', None) if user_ids: user_ids = user_ids.split(',') staff_ids = request.GET.get('staff_ids', None) if staff_ids: staff_ids = staff_ids.split(',') company = request.GET.get('company', None) except Exception: raise ParseError qs = FXCRMLeads.objects.filter( Q(related_user__isnull=False) | Q(leads_poll_id=FXCRMLeads.LEADS_POLL_COMMUNITY) ) all_count = qs.count() now = timezone.now() recent_7days_count = qs.filter( created_at__gte=(now - timedelta(days=7))).count() recent_30days_count = qs.filter( created_at__gte=(now - timedelta(days=30))).count() # finance year is from April 1st to March 31st of the next year if now.month >= 4: finance_year_start = now.replace( month=4, day=1, hour=0, minute=0, second=0, microsecond=0) else: finance_year_start = now.replace( month=4, day=1, year=now.year - 1, hour=0, minute=0, second=0, microsecond=0) finance_year_count = qs.filter( created_at__gte=finance_year_start).count() if user_ids: qs = qs.filter(related_user_id__in=user_ids) if staff_ids: qs = qs.filter(creator_id__in=staff_ids) if company: qs = qs.filter(company__icontains=company) qs = qs.order_by('-created_at') filter_count = qs.count() qs = qs[(cur_page - 1) * per_page:cur_page * per_page] leads = [] for l in qs: d = { 'id': l.id, 'leads_poll_id': l.leads_poll_id, 'leads_poll_id_display': l.get_leads_poll_id_display(), 'source': l.source_text, 'name': l.name, 'company': l.company, 'phone': l.phone, 'cql': l.cql_text, 'sync_status': l.sync_status, 'sync_status_display': l.get_sync_status_display(), 'related_user': None, 'creator': None, 'created_at': ptime.local_time_format(l.created_at), } if l.related_user: d['related_user'] = { 'id': l.related_user_id, 'username': l.related_user.username, } if l.creator: d['creator'] = { 'id': l.creator_id, 'username': l.creator.username, } leads.append(d) return Response({ 'detail': 'success', 'data': { 'all_count': all_count, 'recent_7days_count': recent_7days_count, 'recent_30days_count': recent_30days_count, 'finance_year_count': finance_year_count, 'filter_total_num': filter_count, 'leads': leads }, })