api: use date parameters to filter subscribed agendas more efficiently (#60064)

This commit is contained in:
Valentin Deniaud 2022-01-19 12:43:27 +01:00
parent a671b76471
commit 40b7329583
2 changed files with 18 additions and 7 deletions

View File

@ -172,13 +172,17 @@ class StatisticsFiltersSerializer(serializers.Serializer):
)
class DateRangeSerializer(serializers.Serializer):
class DateRangeMixin(metaclass=serializers.SerializerMetaclass):
datetime_formats = ['%Y-%m-%d', '%Y-%m-%d %H:%M', 'iso-8601']
date_start = serializers.DateTimeField(required=False, input_formats=datetime_formats)
date_end = serializers.DateTimeField(required=False, input_formats=datetime_formats)
class DateRangeSerializer(DateRangeMixin, serializers.Serializer):
pass
class DatetimesSerializer(DateRangeSerializer):
min_places = serializers.IntegerField(min_value=1, default=1)
user_external_id = serializers.CharField(required=False, max_length=250, allow_blank=True)
@ -200,7 +204,7 @@ class DatetimesSerializer(DateRangeSerializer):
return attrs
class AgendaOrSubscribedSlugsMixin(metaclass=serializers.SerializerMetaclass):
class AgendaOrSubscribedSlugsMixin(DateRangeMixin):
agendas = CommaSeparatedStringField(
required=False, child=serializers.SlugField(max_length=160, allow_blank=False)
)
@ -222,9 +226,16 @@ class AgendaOrSubscribedSlugsMixin(metaclass=serializers.SerializerMetaclass):
)
if 'subscribed' in attrs:
agendas = Agenda.objects.filter(subscriptions__user_external_id=user_external_id).distinct()
lookups = {'subscriptions__user_external_id': user_external_id}
if 'date_start' in attrs:
lookups['subscriptions__date_start__gte'] = attrs['date_start']
if 'date_end' in attrs:
lookups['subscriptions__date_end__lt'] = attrs['date_end']
agendas = Agenda.objects.filter(**lookups).distinct()
if attrs['subscribed'] != ['all']:
agendas = agendas.filter(category__slug__in=attrs['subscribed'])
attrs['agendas'] = agendas
attrs['agenda_slugs'] = [agenda.slug for agenda in agendas]
else:

View File

@ -1607,10 +1607,6 @@ class RecurringFillslots(APIView):
if not settings.ENABLE_RECURRING_EVENT_BOOKING:
raise Http404()
start_datetime, end_datetime = get_start_and_end_datetime_from_request(request)
if not start_datetime or start_datetime < now():
start_datetime = now()
serializer = serializers.RecurringFillslotsQueryStringSerializer(
data=request.query_params, context={'user_external_id': request.data.get('user_external_id')}
)
@ -1618,6 +1614,10 @@ class RecurringFillslots(APIView):
raise APIErrorBadRequest(N_('invalid payload'), errors=serializer.errors)
data = serializer.validated_data
start_datetime, end_datetime = data.get('date_start'), data.get('date_end')
if not start_datetime or start_datetime < now():
start_datetime = now()
context = {
'allowed_agenda_slugs': data['agenda_slugs'],
'agendas': Agenda.prefetch_recurring_events(data['agendas']),