Skip to content

Commit 7e5d98d

Browse files
authored
fix: Correctly apply API filter for "reviewed" (#21600)
1 parent d952a97 commit 7e5d98d

File tree

4 files changed

+64
-7
lines changed

4 files changed

+64
-7
lines changed

frigate/api/review.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ async def review(
144144
(UserReviewStatus.has_been_reviewed == False)
145145
| (UserReviewStatus.has_been_reviewed.is_null())
146146
)
147+
elif reviewed == 1:
148+
review_query = review_query.where(UserReviewStatus.has_been_reviewed == True)
147149

148150
# Apply ordering and limit
149151
review_query = (

frigate/test/http_api/base_http_test.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,15 +171,20 @@ async def mock_get_allowed_cameras_for_filter(request: Request):
171171
def insert_mock_event(
172172
self,
173173
id: str,
174-
start_time: float = datetime.datetime.now().timestamp(),
175-
end_time: float = datetime.datetime.now().timestamp() + 20,
174+
start_time: float | None = None,
175+
end_time: float | None = None,
176176
has_clip: bool = True,
177177
top_score: int = 100,
178178
score: int = 0,
179179
data: Json = {},
180180
camera: str = "front_door",
181181
) -> Event:
182182
"""Inserts a basic event model with a given id."""
183+
if start_time is None:
184+
start_time = datetime.datetime.now().timestamp()
185+
if end_time is None:
186+
end_time = start_time + 20
187+
183188
return Event.insert(
184189
id=id,
185190
label="Mock",
@@ -229,11 +234,16 @@ def insert_mock_review_segment(
229234
def insert_mock_recording(
230235
self,
231236
id: str,
232-
start_time: float = datetime.datetime.now().timestamp(),
233-
end_time: float = datetime.datetime.now().timestamp() + 20,
237+
start_time: float | None = None,
238+
end_time: float | None = None,
234239
motion: int = 0,
235240
) -> Event:
236241
"""Inserts a recording model with a given id."""
242+
if start_time is None:
243+
start_time = datetime.datetime.now().timestamp()
244+
if end_time is None:
245+
end_time = start_time + 20
246+
237247
return Recordings.insert(
238248
id=id,
239249
path=id,

frigate/test/http_api/test_http_event.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,17 @@ def test_get_event_list_no_match_min_length(self):
9696
assert len(events) == 0
9797

9898
def test_get_event_list_limit(self):
99+
now = datetime.now().timestamp()
99100
id = "123456.random"
100101
id2 = "54321.random"
101102

102103
with AuthTestClient(self.app) as client:
103-
super().insert_mock_event(id)
104+
super().insert_mock_event(id, start_time=now + 1)
104105
events = client.get("/events").json()
105106
assert len(events) == 1
106107
assert events[0]["id"] == id
107108

108-
super().insert_mock_event(id2)
109+
super().insert_mock_event(id2, start_time=now)
109110
events = client.get("/events").json()
110111
assert len(events) == 2
111112

@@ -144,7 +145,7 @@ def test_get_event_list_sort_score(self):
144145
assert events[0]["id"] == id2
145146
assert events[1]["id"] == id
146147

147-
events = client.get("/events", params={"sort": "score_des"}).json()
148+
events = client.get("/events", params={"sort": "score_desc"}).json()
148149
assert len(events) == 2
149150
assert events[0]["id"] == id
150151
assert events[1]["id"] == id2

frigate/test/http_api/test_http_review.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,50 @@ def test_get_review_with_all_filters(self):
196196
assert len(response_json) == 1
197197
assert response_json[0]["id"] == id
198198

199+
def test_get_review_with_reviewed_filter_unreviewed(self):
200+
"""Test that reviewed=0 returns only unreviewed items."""
201+
now = datetime.now().timestamp()
202+
203+
with AuthTestClient(self.app) as client:
204+
id_unreviewed = "123456.unreviewed"
205+
id_reviewed = "123456.reviewed"
206+
super().insert_mock_review_segment(id_unreviewed, now, now + 2)
207+
super().insert_mock_review_segment(id_reviewed, now, now + 2)
208+
self._insert_user_review_status(id_reviewed, reviewed=True)
209+
210+
params = {
211+
"reviewed": 0,
212+
"after": now - 1,
213+
"before": now + 3,
214+
}
215+
response = client.get("/review", params=params)
216+
assert response.status_code == 200
217+
response_json = response.json()
218+
assert len(response_json) == 1
219+
assert response_json[0]["id"] == id_unreviewed
220+
221+
def test_get_review_with_reviewed_filter_reviewed(self):
222+
"""Test that reviewed=1 returns only reviewed items."""
223+
now = datetime.now().timestamp()
224+
225+
with AuthTestClient(self.app) as client:
226+
id_unreviewed = "123456.unreviewed"
227+
id_reviewed = "123456.reviewed"
228+
super().insert_mock_review_segment(id_unreviewed, now, now + 2)
229+
super().insert_mock_review_segment(id_reviewed, now, now + 2)
230+
self._insert_user_review_status(id_reviewed, reviewed=True)
231+
232+
params = {
233+
"reviewed": 1,
234+
"after": now - 1,
235+
"before": now + 3,
236+
}
237+
response = client.get("/review", params=params)
238+
assert response.status_code == 200
239+
response_json = response.json()
240+
assert len(response_json) == 1
241+
assert response_json[0]["id"] == id_reviewed
242+
199243
####################################################################################################################
200244
################################### GET /review/summary Endpoint #################################################
201245
####################################################################################################################

0 commit comments

Comments
 (0)