From 94cf652331ab0699d90dc6996e987882f12cbe5c Mon Sep 17 00:00:00 2001 From: Aaron Reisman Date: Mon, 23 Mar 2026 07:16:36 +0700 Subject: [PATCH] feat: add filter fields to WorkItemQueryParams Add assignee_id__in, state_id__in, state_group__in, priority__in, label_id__in, created_by_id__in, is_draft, and is_archived fields to WorkItemQueryParams to support server-side filtering of work items. Add model_serializer to convert list fields to comma-separated strings for compatibility with django-filters BaseInFilter. --- plane/models/query_params.py | 44 +++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/plane/models/query_params.py b/plane/models/query_params.py index ae6d6ea..01b8187 100644 --- a/plane/models/query_params.py +++ b/plane/models/query_params.py @@ -1,6 +1,6 @@ """Query parameter DTOs for list/retrieve endpoints.""" -from pydantic import BaseModel, ConfigDict, Field +from pydantic import BaseModel, ConfigDict, Field, model_serializer class BaseQueryParams(BaseModel): @@ -62,6 +62,48 @@ class WorkItemQueryParams(PaginatedQueryParams): model_config = ConfigDict(extra="ignore", populate_by_name=True) + assignee_id__in: list[str] | None = Field( + None, + description="Filter by assignee UUIDs", + ) + state_id__in: list[str] | None = Field( + None, + description="Filter by state UUIDs", + ) + state_group__in: list[str] | None = Field( + None, + description="Filter by state groups (backlog, unstarted, started, completed, cancelled)", + ) + priority__in: list[str] | None = Field( + None, + description="Filter by priority levels (urgent, high, medium, low, none)", + ) + label_id__in: list[str] | None = Field( + None, + description="Filter by label UUIDs", + ) + created_by_id__in: list[str] | None = Field( + None, + description="Filter by creator user UUIDs", + ) + is_draft: bool | None = Field( + None, + description="Filter by draft status", + ) + is_archived: bool | None = Field( + None, + description="Filter by archived status", + ) + + @model_serializer(mode="wrap") + def _serialize(self, handler): # type: ignore[no-untyped-def] + """Serialize list fields as comma-separated strings for django-filters.""" + data = handler(self) + for key, value in data.items(): + if isinstance(value, list): + data[key] = ",".join(str(v) for v in value) + return data + class RetrieveQueryParams(BaseQueryParams): """Query parameters for retrieve endpoints."""