+ More info about client in statistics/clients

This commit is contained in:
Phil Zhitnikov 2023-08-19 20:02:19 +04:00
parent edf1118f9f
commit 2fe77442c3

View File

@ -2,8 +2,7 @@ import calendar
from datetime import timedelta from datetime import timedelta
from django.conf import settings from django.conf import settings
from django.contrib.auth import login from django.db.models import F, Count, Sum, OuterRef, Subquery
from django.db.models import F, Count, Sum
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import generics, permissions, mixins, status, viewsets from rest_framework import generics, permissions, mixins, status, viewsets
from rest_framework.decorators import action from rest_framework.decorators import action
@ -270,7 +269,7 @@ class StatisticsAPI(viewsets.GenericViewSet):
} }
def _create_empty_stats(): def _create_empty_stats():
return {k: set() for k in options.keys()} return {k: [] for k in options.keys()}
qs = self.get_queryset() \ qs = self.get_queryset() \
.filter(buyer_phone__isnull=False) \ .filter(buyer_phone__isnull=False) \
@ -279,6 +278,26 @@ class StatisticsAPI(viewsets.GenericViewSet):
.filter(order_count__gt=1) \ .filter(order_count__gt=1) \
.order_by('month') .order_by('month')
# Temporary hack: collect the most recent info about client
# mapping buyer_phone -> buyer info (name, telegram)
client_mapping = {}
recent_created_at = Checklist.objects.all() \
.filter(buyer_phone=OuterRef('buyer_phone')) \
.order_by('-created_at') \
.values('created_at')[:1]
client_qs = Checklist.objects.filter(
created_at=Subquery(recent_created_at),
buyer_phone=F('buyer_phone')
).distinct()
for checklist in client_qs:
client_mapping[checklist.buyer_phone] = {
'phone': checklist.buyer_phone,
'name': checklist.buyer_name,
'telegram': checklist.buyer_telegram}
result = {} result = {}
# Add empty stats # Add empty stats
for i in range(1, 13): for i in range(1, 13):
@ -291,7 +310,8 @@ class StatisticsAPI(viewsets.GenericViewSet):
for key, size in reversed(options.items()): for key, size in reversed(options.items()):
if stat['order_count'] > size: if stat['order_count'] > size:
result[month_name][key].add(stat['buyer_phone']) client_info = client_mapping[stat['buyer_phone']]
result[month_name][key].append(client_info)
break break
return Response(result) return Response(result)