api: count secondary booking presence from primary booking in stats (#81986)

This commit is contained in:
Valentin Deniaud 2023-10-04 13:51:44 +02:00
parent 1fd95681fe
commit 9b315f4be3
2 changed files with 17 additions and 8 deletions

View File

@ -23,7 +23,7 @@ import uuid
import vobject
from django.conf import settings
from django.db import IntegrityError, transaction
from django.db.models import BooleanField, Count, ExpressionWrapper, F, Func, Prefetch, Q
from django.db.models import BooleanField, Case, Count, ExpressionWrapper, F, Func, Prefetch, Q, When
from django.db.models.expressions import RawSQL
from django.db.models.functions import TruncDay
from django.http import Http404, HttpResponse
@ -3238,9 +3238,17 @@ class BookingsStatistics(APIView):
if not isinstance(group_by, list): # legacy support
group_by = [group_by]
lookups = [
'extra_data__%s' % field if field != 'user_was_present' else field for field in group_by
]
lookups = []
if 'user_was_present' in group_by:
bookings = bookings.annotate(
presence=Case(
When(primary_booking__isnull=True, then=F('user_was_present')),
When(primary_booking__isnull=False, then=F('primary_booking__user_was_present')),
)
)
lookups.append('presence')
lookups += ['extra_data__%s' % field for field in group_by if field != 'user_was_present']
bookings = bookings.values('day', *lookups).annotate(total=Count('id')).order_by('day')
days = bookings_by_day = collections.OrderedDict(

View File

@ -124,14 +124,15 @@ def test_statistics_bookings(app, user, freezer):
Booking.objects.create(event=event3, user_was_present=bool(i % 2))
event4 = Event.objects.create(start_datetime=now().replace(month=11, day=1), places=5, agenda=agenda)
Booking.objects.create(event=event4, user_was_present=True)
booking = Booking.objects.create(event=event4, user_was_present=True)
Booking.objects.create(event=event4, primary_booking=booking)
resp = app.get(url + '?group_by=user_was_present')
assert resp.json['data']['x_labels'] == ['2020-10-10', '2020-10-15', '2020-10-25', '2020-11-01']
assert resp.json['data']['series'] == [
{'label': 'Absent', 'data': [None, None, 5, None]},
{'label': 'Booked', 'data': [10, 1, 1, None]},
{'label': 'Present', 'data': [None, None, 5, 1]},
{'label': 'Present', 'data': [None, None, 5, 2]},
]
for i in range(9):
@ -146,7 +147,7 @@ def test_statistics_bookings(app, user, freezer):
resp = app.get(url + '?group_by=menu')
assert resp.json['data']['x_labels'] == ['2020-10-10', '2020-10-15', '2020-10-25', '2020-11-01']
assert resp.json['data']['series'] == [
{'label': 'None', 'data': [10, 1, 11, 1]},
{'label': 'None', 'data': [10, 1, 11, 2]},
{'label': 'meet', 'data': [None, None, 2, 3]},
{'label': 'vegetables', 'data': [None, None, 4, 5]},
]
@ -158,7 +159,7 @@ def test_statistics_bookings(app, user, freezer):
{'label': 'Absent / meet', 'data': [None, None, 1, 1]},
{'label': 'Absent / vegetables', 'data': [None, None, 1, 2]},
{'label': 'Booked / None', 'data': [10, 1, 1, None]},
{'label': 'Present / None', 'data': [None, None, 5, 1]},
{'label': 'Present / None', 'data': [None, None, 5, 2]},
{'label': 'Present / meet', 'data': [None, None, 1, 2]},
{'label': 'Present / vegetables', 'data': [None, None, 3, 3]},
]