From 8d7ee9739a0e9d9ca3da12b4a3d5c63398817389 Mon Sep 17 00:00:00 2001 From: duckduckgrayduck <102841251+duckduckgrayduck@users.noreply.github.com> Date: Mon, 18 May 2026 15:21:27 -0500 Subject: [PATCH 1/2] Filter by message --- documentcloud/addons/tests/test_views.py | 23 +++++++++++++++++++++++ documentcloud/addons/views.py | 6 ++++++ 2 files changed, 29 insertions(+) diff --git a/documentcloud/addons/tests/test_views.py b/documentcloud/addons/tests/test_views.py index 34a4a888..21a285f4 100644 --- a/documentcloud/addons/tests/test_views.py +++ b/documentcloud/addons/tests/test_views.py @@ -350,3 +350,26 @@ def test_filter_site_no_match(self, client): ) assert response.status_code == status.HTTP_200_OK assert response.json()["results"] == [] + + def test_filter_message(self, client): + """Filter runs by message""" + user = UserFactory() + matching_run = AddOnRunFactory(user=user, message="data changed") + AddOnRunFactory(user=user, message="no changes detected") + AddOnRunFactory(user=user, message="") + client.force_authenticate(user=user) + response = client.get("/api/addon_runs/", {"message": "data changed"}) + assert response.status_code == status.HTTP_200_OK + uuids = [r["uuid"] for r in response.json()["results"]] + assert uuids == [str(matching_run.uuid)] + + def test_filter_message_absent_is_noop(self, client): + """Omitting the message filter returns all viewable runs""" + user = UserFactory() + AddOnRunFactory(user=user, message="data changed") + AddOnRunFactory(user=user, message="no changes detected") + AddOnRunFactory(user=user, message="") + client.force_authenticate(user=user) + response = client.get("/api/addon_runs/") + assert response.status_code == status.HTTP_200_OK + assert len(response.json()["results"]) == 3 diff --git a/documentcloud/addons/views.py b/documentcloud/addons/views.py index 809d752b..c8d8f483 100644 --- a/documentcloud/addons/views.py +++ b/documentcloud/addons/views.py @@ -745,6 +745,12 @@ class Filter(django_filters.FilterSet): lookup_expr="exact", help_text="Filter runs by the `site` value in the event's parameters.", ) + message = django_filters.CharFilter( + field_name="message", + lookup_expr="exact", + label="Message", + help_text="Filter runs by their progress message.", + ) class Meta: model = AddOnRun From 90567a949ea6ee51b23c2685826ca1f0da255c10 Mon Sep 17 00:00:00 2001 From: duckduckgrayduck <102841251+duckduckgrayduck@users.noreply.github.com> Date: Mon, 18 May 2026 15:36:06 -0500 Subject: [PATCH 2/2] Fix labels for site --- documentcloud/addons/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/documentcloud/addons/views.py b/documentcloud/addons/views.py index c8d8f483..5639626c 100644 --- a/documentcloud/addons/views.py +++ b/documentcloud/addons/views.py @@ -743,6 +743,7 @@ class Filter(django_filters.FilterSet): site = django_filters.CharFilter( field_name="event__parameters__site", lookup_expr="exact", + label="Site", help_text="Filter runs by the `site` value in the event's parameters.", ) message = django_filters.CharFilter( @@ -984,6 +985,7 @@ class Filter(django_filters.FilterSet): site = django_filters.CharFilter( field_name="parameters__site", lookup_expr="exact", + label="Site", help_text="Filter events by the `site` value in their parameters.", )