From 26552f54b4abda75bf429c5541a65700852ae98d Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 16 Oct 2026 13:00:38 -0800 Subject: [PATCH] Ah, need a backend filter for wf type --- src/documents/filters.py | 12 ++++++++++++ src/documents/tests/test_api_workflows.py | 24 +++++++++++++++++++++++ src/documents/views.py | 3 +++ 3 files changed, 39 insertions(+) diff --git a/src/documents/filters.py b/src/documents/filters.py index 2c6cfb2699..8f4e06db38 100644 --- a/src/documents/filters.py +++ b/src/documents/filters.py @@ -35,6 +35,7 @@ from django_filters.rest_framework import DateTimeFilter from django_filters.rest_framework import Filter from django_filters.rest_framework import FilterSet from django_filters.rest_framework import MultipleChoiceFilter +from django_filters.rest_framework import NumberFilter from drf_spectacular.utils import extend_schema_field from guardian.utils import get_group_obj_perms_model from guardian.utils import get_user_obj_perms_model @@ -52,6 +53,7 @@ from documents.models import ShareLink from documents.models import ShareLinkBundle from documents.models import StoragePath from documents.models import Tag +from documents.models import Workflow from documents.permissions import annotate_authorizing_fields from documents.permissions import permitted_document_ids from documents.permissions import permitted_object_ids @@ -249,6 +251,16 @@ class CustomFieldFilterSet(FilterSet): } +class WorkflowFilterSet(FilterSet): + trigger_type = NumberFilter(field_name="triggers__type", distinct=True) + + class Meta: + model = Workflow + fields = { + "id": ID_KWARGS, + } + + @extend_schema_field(serializers.CharField) class CustomFieldsFilter(Filter): def filter(self, qs, value): diff --git a/src/documents/tests/test_api_workflows.py b/src/documents/tests/test_api_workflows.py index 4b5e6eb48d..8ce554a225 100644 --- a/src/documents/tests/test_api_workflows.py +++ b/src/documents/tests/test_api_workflows.py @@ -100,6 +100,30 @@ class TestApiWorkflows(DirectoriesMixin, APITestCase): self.action.assign_correspondent.pk, ) + def test_api_get_workflows_filter_trigger_type(self) -> None: + """ + GIVEN: + - A consumption workflow and a manual workflow + WHEN: + - Workflows are requested filtered by trigger_type + THEN: + - Only workflows with a matching trigger are returned + """ + manual_trigger = WorkflowTrigger.objects.create( + type=WorkflowTrigger.WorkflowTriggerType.MANUAL, + ) + manual_workflow = Workflow.objects.create(name="Manual", order=1) + manual_workflow.triggers.add(manual_trigger) + + response = self.client.get( + f"{self.ENDPOINT}?trigger_type={WorkflowTrigger.WorkflowTriggerType.MANUAL}", + format="json", + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + self.assertEqual(response.data["results"][0]["id"], manual_workflow.id) + def test_api_get_workflow_actions_ordered(self) -> None: """ GIVEN: diff --git a/src/documents/views.py b/src/documents/views.py index 5f568e0744..d8d7e218d6 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -140,6 +140,7 @@ from documents.filters import ShareLinkFilterSet from documents.filters import StoragePathFilterSet from documents.filters import TagFilterSet from documents.filters import TitleContentFilter +from documents.filters import WorkflowFilterSet from documents.mail import EmailAttachment from documents.mail import send_email from documents.matching import match_correspondents @@ -5191,6 +5192,8 @@ class WorkflowViewSet(ModelViewSet[Workflow]): serializer_class = WorkflowSerializer pagination_class = StandardPagination + filter_backends = (DjangoFilterBackend,) + filterset_class = WorkflowFilterSet model = Workflow