From 328906401aa9c6233ba82a5d325669ed75813a0b Mon Sep 17 00:00:00 2001 From: dermotduffy Date: Mon, 19 Jan 2026 14:33:50 -0800 Subject: [PATCH] fix: 'reviewed' filter should be tristate --- frigate/api/review.py | 17 +++++++++-------- frigate/test/http_api/test_http_review.py | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/frigate/api/review.py b/frigate/api/review.py index 76619dcb2..09c20fd3f 100644 --- a/frigate/api/review.py +++ b/frigate/api/review.py @@ -138,14 +138,15 @@ async def review( .where(reduce(operator.and_, clauses)) ) - # Filter unreviewed items without subquery - if reviewed == 0: - review_query = review_query.where( - (UserReviewStatus.has_been_reviewed == False) - | (UserReviewStatus.has_been_reviewed.is_null()) - ) - elif reviewed == 1: - review_query = review_query.where(UserReviewStatus.has_been_reviewed == True) + # Filter by reviewed status (None = all, 0 = unreviewed only, 1 = reviewed only) + if reviewed is not None: + if reviewed == 0: + review_query = review_query.where( + (UserReviewStatus.has_been_reviewed == False) + | (UserReviewStatus.has_been_reviewed.is_null()) + ) + elif reviewed == 1: + review_query = review_query.where(UserReviewStatus.has_been_reviewed == True) # Apply ordering and limit review_query = ( diff --git a/frigate/test/http_api/test_http_review.py b/frigate/test/http_api/test_http_review.py index ca73c8706..f587d7964 100644 --- a/frigate/test/http_api/test_http_review.py +++ b/frigate/test/http_api/test_http_review.py @@ -240,6 +240,28 @@ class TestHttpReview(BaseTestHttp): assert len(response_json) == 1 assert response_json[0]["id"] == id_reviewed + def test_get_review_with_no_reviewed_filter(self): + """Test that omitting 'reviewed' parameter returns both reviewed and unreviewed items.""" + now = datetime.now().timestamp() + + with AuthTestClient(self.app) as client: + id_unreviewed = "123456.unreviewed" + id_reviewed = "123456.reviewed" + super().insert_mock_review_segment(id_unreviewed, now, now + 2) + super().insert_mock_review_segment(id_reviewed, now, now + 2) + self._insert_user_review_status(id_reviewed, reviewed=True) + + params = { + "after": now - 1, + "before": now + 3, + } + response = client.get("/review", params=params) + assert response.status_code == 200 + response_json = response.json() + assert len(response_json) == 2 + returned_ids = {item["id"] for item in response_json} + assert returned_ids == {id_unreviewed, id_reviewed} + #################################################################################################################### ################################### GET /review/summary Endpoint ################################################# ####################################################################################################################