Projet

Général

Profil

0001-api-use-date-parameters-to-filter-subscribed-agendas.patch

Valentin Deniaud, 19 janvier 2022 14:07

Télécharger (3,7 ko)

Voir les différences:

Subject: [PATCH] api: use date parameters to filter subscribed agendas more
 efficiently (#60064)

 chrono/api/serializers.py | 17 ++++++++++++++---
 chrono/api/views.py       |  8 ++++----
 2 files changed, 18 insertions(+), 7 deletions(-)
chrono/api/serializers.py
172 172
    )
173 173

  
174 174

  
175
class DateRangeSerializer(serializers.Serializer):
175
class DateRangeMixin(metaclass=serializers.SerializerMetaclass):
176 176
    datetime_formats = ['%Y-%m-%d', '%Y-%m-%d %H:%M', 'iso-8601']
177 177

  
178 178
    date_start = serializers.DateTimeField(required=False, input_formats=datetime_formats)
179 179
    date_end = serializers.DateTimeField(required=False, input_formats=datetime_formats)
180 180

  
181 181

  
182
class DateRangeSerializer(DateRangeMixin, serializers.Serializer):
183
    pass
184

  
185

  
182 186
class DatetimesSerializer(DateRangeSerializer):
183 187
    min_places = serializers.IntegerField(min_value=1, default=1)
184 188
    user_external_id = serializers.CharField(required=False, max_length=250, allow_blank=True)
......
200 204
        return attrs
201 205

  
202 206

  
203
class AgendaOrSubscribedSlugsMixin(metaclass=serializers.SerializerMetaclass):
207
class AgendaOrSubscribedSlugsMixin(DateRangeMixin):
204 208
    agendas = CommaSeparatedStringField(
205 209
        required=False, child=serializers.SlugField(max_length=160, allow_blank=False)
206 210
    )
......
222 226
            )
223 227

  
224 228
        if 'subscribed' in attrs:
225
            agendas = Agenda.objects.filter(subscriptions__user_external_id=user_external_id).distinct()
229
            lookups = {'subscriptions__user_external_id': user_external_id}
230
            if 'date_start' in attrs:
231
                lookups['subscriptions__date_start__gte'] = attrs['date_start']
232
            if 'date_end' in attrs:
233
                lookups['subscriptions__date_end__lt'] = attrs['date_end']
234
            agendas = Agenda.objects.filter(**lookups).distinct()
235

  
226 236
            if attrs['subscribed'] != ['all']:
227 237
                agendas = agendas.filter(category__slug__in=attrs['subscribed'])
238

  
228 239
            attrs['agendas'] = agendas
229 240
            attrs['agenda_slugs'] = [agenda.slug for agenda in agendas]
230 241
        else:
chrono/api/views.py
1603 1603
        if not settings.ENABLE_RECURRING_EVENT_BOOKING:
1604 1604
            raise Http404()
1605 1605

  
1606
        start_datetime, end_datetime = get_start_and_end_datetime_from_request(request)
1607
        if not start_datetime or start_datetime < now():
1608
            start_datetime = now()
1609

  
1610 1606
        serializer = serializers.RecurringFillslotsQueryStringSerializer(
1611 1607
            data=request.query_params, context={'user_external_id': request.data.get('user_external_id')}
1612 1608
        )
......
1614 1610
            raise APIErrorBadRequest(N_('invalid payload'), errors=serializer.errors)
1615 1611
        data = serializer.validated_data
1616 1612

  
1613
        start_datetime, end_datetime = data.get('date_start'), data.get('date_end')
1614
        if not start_datetime or start_datetime < now():
1615
            start_datetime = now()
1616

  
1617 1617
        context = {
1618 1618
            'allowed_agenda_slugs': data['agenda_slugs'],
1619 1619
            'agendas': Agenda.prefetch_recurring_events(data['agendas']),
1620
-