api: use date parameters to filter subscribed agendas more efficiently (#60064)
This commit is contained in:
parent
a671b76471
commit
40b7329583
|
@ -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:
|
||||
|
|
|
@ -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']),
|
||||
|
|
Loading…
Reference in New Issue