0001-api-use-date-parameters-to-filter-subscribed-agendas.patch
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 |
- |