From d2e8d100996d902010c4bfab1716c5da87dbff00 Mon Sep 17 00:00:00 2001 From: sanjibani Date: Fri, 26 Jun 2026 09:59:09 +0530 Subject: [PATCH] fix(api): filter "Updated At" by updated_at column, not created_at filter_updated_at was passing `created_at__date` as the date_term to date_filter, so the "Updated At -> is -> today" filter checked the issue's creation date instead of its last-modified date. Work items created earlier but updated today silently disappeared from the results. Fix the typo in both the GET and POST branches and add a focused unit test that pins the column name. Refs #9316 --- .../tests/unit/utils/test_issue_filters.py | 51 +++++++++++++++++++ apps/api/plane/utils/issue_filters.py | 4 +- 2 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 apps/api/plane/tests/unit/utils/test_issue_filters.py diff --git a/apps/api/plane/tests/unit/utils/test_issue_filters.py b/apps/api/plane/tests/unit/utils/test_issue_filters.py new file mode 100644 index 00000000000..203c7078b17 --- /dev/null +++ b/apps/api/plane/tests/unit/utils/test_issue_filters.py @@ -0,0 +1,51 @@ +# Copyright (c) 2023-present Plane Software, Inc. and contributors +# SPDX-License-Identifier: AGPL-3.0-only +# See the LICENSE file for details. + +import pytest + +from plane.utils.issue_filters import filter_updated_at + + +@pytest.mark.unit +class TestFilterUpdatedAt: + """Regression test for the "Updated At" filter bug — the filter was + applying to the `created_at` column instead of `updated_at`, so work + items updated today but created earlier never showed up under + `Updated At -> is -> today`. See issue #9316.""" + + def test_get_method_targets_updated_at_column(self): + issue_filter = {} + params = {"updated_at": "2026-06-26"} + filter_updated_at(params, issue_filter, method="GET") + # The filter must key on updated_at, not created_at. + assert "updated_at__date" in issue_filter + assert not any("created_at" in key for key in issue_filter) + + def test_get_method_with_csv_targets_updated_at_column(self): + issue_filter = {} + params = {"updated_at": "2026-06-25,2026-06-26"} + filter_updated_at(params, issue_filter, method="GET") + assert all("updated_at" in key for key in issue_filter) + assert not any("created_at" in key for key in issue_filter) + + def test_post_method_targets_updated_at_column(self): + issue_filter = {} + params = {"updated_at": ["2026-06-26"]} + filter_updated_at(params, issue_filter, method="POST") + assert all("updated_at" in key for key in issue_filter) + assert not any("created_at" in key for key in issue_filter) + + def test_get_method_with_prefix_targets_updated_at_column(self): + issue_filter = {} + params = {"updated_at": "2026-06-26"} + filter_updated_at(params, issue_filter, method="GET", prefix="cycle_issue__") + keys = list(issue_filter) + assert any("cycle_issue__updated_at" in k for k in keys) + assert not any("created_at" in k for k in keys) + + def test_empty_get_filter_is_noop(self): + issue_filter = {} + params = {"updated_at": ""} + filter_updated_at(params, issue_filter, method="GET") + assert issue_filter == {} \ No newline at end of file diff --git a/apps/api/plane/utils/issue_filters.py b/apps/api/plane/utils/issue_filters.py index ea31a529bb4..3669d8a1ad8 100644 --- a/apps/api/plane/utils/issue_filters.py +++ b/apps/api/plane/utils/issue_filters.py @@ -231,14 +231,14 @@ def filter_updated_at(params, issue_filter, method, prefix=""): if len(updated_ats) and "" not in updated_ats: date_filter( issue_filter=issue_filter, - date_term=f"{prefix}created_at__date", + date_term=f"{prefix}updated_at__date", queries=updated_ats, ) else: if params.get("updated_at", None) and len(params.get("updated_at")): date_filter( issue_filter=issue_filter, - date_term=f"{prefix}created_at__date", + date_term=f"{prefix}updated_at__date", queries=params.get("updated_at", []), ) return issue_filter