api: add agenda filter in booking statistics (#55267)

This commit is contained in:
Valentin Deniaud 2021-06-30 16:56:40 +02:00
parent a6c154077b
commit fc79c17012
2 changed files with 27 additions and 1 deletions

View File

@ -2231,6 +2231,10 @@ class StatisticsList(APIView):
category_options = [{'id': '_all', 'label': _('All')}] + [
{'id': x.slug, 'label': x.label} for x in categories
]
agendas = Agenda.objects.all()
agenda_options = [{'id': '_all', 'label': _('All')}] + [
{'id': x.slug, 'label': x.label} for x in agendas
]
return Response(
{
'data': [
@ -2253,6 +2257,13 @@ class StatisticsList(APIView):
'required': False,
'default': '_all',
},
{
'id': 'agenda',
'label': _('Agenda'),
'options': agenda_options,
'required': False,
'default': '_all',
},
],
}
]
@ -2268,6 +2279,7 @@ class StatisticsFiltersSerializer(serializers.Serializer):
start = serializers.DateTimeField(required=False, input_formats=['iso-8601', '%Y-%m-%d'])
end = serializers.DateTimeField(required=False, input_formats=['iso-8601', '%Y-%m-%d'])
category = serializers.SlugField(required=False, allow_blank=False, max_length=256)
agenda = serializers.SlugField(required=False, allow_blank=False, max_length=256)
class BookingsStatistics(APIView):
@ -2293,6 +2305,9 @@ class BookingsStatistics(APIView):
if 'category' in data and data['category'] != '_all':
bookings = bookings.filter(event__agenda__category__slug=data['category'])
if 'agenda' in data and data['agenda'] != '_all':
bookings = bookings.filter(event__agenda__slug=data['agenda'])
bookings = bookings.annotate(day=TruncDay('event__start_datetime'))
bookings = bookings.values('day', 'user_was_present').annotate(total=Count('id')).order_by('day')

View File

@ -9,6 +9,8 @@ pytestmark = pytest.mark.django_db
def test_statistics_list(app, user):
Agenda.objects.create(label='Foo bar')
Agenda.objects.create(label='Bar foo')
Category.objects.create(label='Category A')
Category.objects.create(label='Category B')
@ -19,6 +21,8 @@ def test_statistics_list(app, user):
resp = app.get('/api/statistics/')
category_filter = [x for x in resp.json['data'][0]['filters'] if x['id'] == 'category'][0]
assert len(category_filter['options']) == 3
agenda_filter = [x for x in resp.json['data'][0]['filters'] if x['id'] == 'agenda'][0]
assert len(agenda_filter['options']) == 3
def test_statistics_bookings(app, user, freezer):
@ -54,7 +58,7 @@ def test_statistics_bookings(app, user, freezer):
}
category = Category.objects.create(label='Category A', slug='category-a')
agenda = Agenda.objects.create(label='Foo bar', kind='events', category=category)
agenda = Agenda.objects.create(label='Bar foo', kind='events', category=category)
event3 = Event.objects.create(start_datetime=now().replace(day=25), places=5, agenda=agenda)
Booking.objects.create(event=event3)
@ -65,6 +69,13 @@ def test_statistics_bookings(app, user, freezer):
'series': [{'label': 'Bookings Count', 'data': [1]}],
}
# agenda filter
resp = app.get(url + '?agenda=bar-foo')
assert resp.json['data'] == {
'x_labels': ['2020-10-25'],
'series': [{'label': 'Bookings Count', 'data': [1]}],
}
# invalid time_interval
resp = app.get(url + '?time_interval=month', status=400)
assert resp.json['err'] == 1