diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index fe939674b3..802e5a9b34 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -163,6 +163,10 @@ last_modified datetime Last modificati The ``exclude`` and ``subevent_after`` query parameter has been added. +.. versionchanged:: 3.13 + + The ``subevent_before`` query parameter has been added. + .. _order-position-resource: @@ -490,7 +494,8 @@ List of all orders recommend using this in combination with ``testmode=false``, since test mode orders can vanish at any time and you will not notice it using this method. :query datetime created_since: Only return orders that have been created since the given date. - :query datetime subevent_after: Only return orders that contain a ticket for a subevent taking place after the given date. + :query datetime subevent_after: Only return orders that contain a ticket for a subevent taking place after the given date. This is an exclusive after, and it considers the **end** of the subevent (or its start, if the end is not set). + :query datetime subevent_before: Only return orders that contain a ticket for a subevent taking place after the given date. This is an exclusive before, and it considers the **start** of the subevent. :query string exclude: Exclude a field from the output, e.g. ``fees`` or ``positions.downloads``. Can be used as a performance optimization. Can be passed multiple times. :param organizer: The ``slug`` field of the organizer to fetch :param event: The ``slug`` field of the event to fetch diff --git a/src/pretix/api/views/order.py b/src/pretix/api/views/order.py index 181171d966..0d06711cde 100644 --- a/src/pretix/api/views/order.py +++ b/src/pretix/api/views/order.py @@ -65,6 +65,7 @@ with scopes_disabled(): modified_since = django_filters.IsoDateTimeFilter(field_name='last_modified', lookup_expr='gte') created_since = django_filters.IsoDateTimeFilter(field_name='datetime', lookup_expr='gte') subevent_after = django_filters.IsoDateTimeFilter(method='subevent_after_qs') + subevent_before = django_filters.IsoDateTimeFilter(method='subevent_before_qs') search = django_filters.CharFilter(method='search_qs') class Meta: @@ -84,6 +85,19 @@ with scopes_disabled(): ).filter(has_se_after=True) return qs + def subevent_before_qs(self, qs, name, value): + qs = qs.annotate( + has_se_before=Exists( + OrderPosition.all.filter( + subevent_id__in=SubEvent.objects.filter( + Q(date_from__lt=value), event=OuterRef(OuterRef('event_id')) + ).values_list('id'), + order_id=OuterRef('pk'), + ) + ) + ).filter(has_se_before=True) + return qs + def search_qs(self, qs, name, value): u = value if "-" in value: diff --git a/src/tests/api/test_orders.py b/src/tests/api/test_orders.py index e771b3ad40..6567f9708b 100644 --- a/src/tests/api/test_orders.py +++ b/src/tests/api/test_orders.py @@ -282,6 +282,19 @@ def test_order_list_filter_subevent_date(token_client, organizer, event, order, assert resp.status_code == 200 assert [res] == resp.data['results'] + resp = token_client.get('/api/v1/organizers/{}/events/{}/orders/?subevent_before={}'.format( + organizer.slug, event.slug, + (subevent.date_from - datetime.timedelta(hours=1)).isoformat().replace('+00:00', 'Z') + )) + assert resp.status_code == 200 + assert [] == resp.data['results'] + resp = token_client.get('/api/v1/organizers/{}/events/{}/orders/?subevent_before={}'.format( + organizer.slug, event.slug, + (subevent.date_from + datetime.timedelta(hours=1)).isoformat().replace('+00:00', 'Z') + )) + assert resp.status_code == 200 + assert [res] == resp.data['results'] + @pytest.mark.django_db def test_order_list(token_client, organizer, event, order, item, taxrule, question):