diff --git a/tecken/api/forms.py b/tecken/api/forms.py index e00d9efa3..f5a8df004 100644 --- a/tecken/api/forms.py +++ b/tecken/api/forms.py @@ -154,6 +154,9 @@ def _clean_dates(self, values): rest = operators.sub('', block).strip() if rest.lower() in ('null', 'incomplete'): date_obj = None + elif rest.lower() == 'cancelled': + # Exceptional exception + date_obj = 'cancelled' else: try: date_obj = dateutil.parser.parse(rest) diff --git a/tecken/api/views.py b/tecken/api/views.py index 538802cc2..d6b1f73f4 100644 --- a/tecken/api/views.py +++ b/tecken/api/views.py @@ -328,7 +328,9 @@ def uploads(request): qs = qs.filter(**{orm_operator: value}) for key in ('created_at', 'completed_at'): for operator, value in form.cleaned_data.get(key, []): - if value is None: + if value == 'cancelled': + qs = qs.filter(cancelled_at__isnull=False) + elif value is None: orm_operator = f'{key}__isnull' qs = qs.filter(**{orm_operator: True}) elif operator == '=' and value.hour == 0 and value.minute == 0: diff --git a/tests/test_api.py b/tests/test_api.py index 7f44c4d18..109da4449 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -616,6 +616,22 @@ def test_uploads(client): data = response.json() assert not data['uploads'] + # Filter by cancelled + response = client.get(url, { + 'completed_at': 'Cancelled', + }) + assert response.status_code == 200 + data = response.json() + assert not data['uploads'] + upload.cancelled_at = timezone.now() + upload.save() + response = client.get(url, { + 'completed_at': 'Cancelled', + }) + assert response.status_code == 200 + data = response.json() + assert data['uploads'] + @pytest.mark.django_db def test_upload(client):