diff --git a/plane/api/work_items/base.py b/plane/api/work_items/base.py index 6b91017..0b7c730 100644 --- a/plane/api/work_items/base.py +++ b/plane/api/work_items/base.py @@ -181,7 +181,7 @@ def update( """ response = self._patch( f"{workspace_slug}/projects/{project_id}/work-items/{work_item_id}", - data.model_dump(exclude_none=True), + data.model_dump(exclude_unset=True), ) return WorkItem.model_validate(response) diff --git a/tests/unit/test_work_items.py b/tests/unit/test_work_items.py index 53a2328..7362d13 100644 --- a/tests/unit/test_work_items.py +++ b/tests/unit/test_work_items.py @@ -204,6 +204,28 @@ def test_advanced_search_with_nested_filters( class TestWorkItemsAPICRUD: """Test WorkItems API CRUD operations.""" + def test_update_work_item_preserves_explicit_null_fields( + self, monkeypatch: pytest.MonkeyPatch + ) -> None: + """Explicit nulls clear fields while omitted fields stay absent.""" + client = PlaneClient(base_url="https://plane.example.com", api_key="secret") + observed: dict[str, object] = {} + + def fake_patch(endpoint: str, data: dict[str, object]) -> dict[str, object]: + observed.update({"endpoint": endpoint, "data": data}) + return {} + + monkeypatch.setattr(client.work_items, "_patch", fake_patch) + + client.work_items.update( + "team", + "project-1", + "item-1", + UpdateWorkItem(start_date=None, target_date=None), + ) + + assert observed["data"] == {"start_date": None, "target_date": None} + @pytest.fixture def work_item_data(self) -> CreateWorkItem: """Create test work item data."""