api: add agenda filter in booking statistics (#55267)
This commit is contained in:
parent
a6c154077b
commit
fc79c17012
|
@ -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')
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue