api: count secondary booking presence from primary booking in stats (#81986)
This commit is contained in:
parent
1fd95681fe
commit
9b315f4be3
|
@ -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(
|
||||
|
|
|
@ -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]},
|
||||
]
|
||||
|
|
Loading…
Reference in New Issue