Skip to content

Commit b3de6f3

Browse files
authored
Merge pull request #903 from srow90/codex/issue-888-api-score-sort
Support API sorting by user score
2 parents 48cd27c + 8ae6e1a commit b3de6f3

2 files changed

Lines changed: 36 additions & 0 deletions

File tree

src/api/helpers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@
124124

125125

126126
MEDIA_EXISTING_SORTS = [
127+
"score",
127128
"start_date",
128129
"end_date",
129130
] + [f.name for f in Item._meta.fields]
@@ -725,6 +726,9 @@ def apply_manual_sort_for_type(results, sort):
725726
"itemid": itemid_key_compare,
726727
"mediaid": _sort_mediaid,
727728
"progress": lambda media: int(getattr(media, "progress", 0) or 0),
729+
"score": lambda media: _sort_nullable(
730+
getattr(media, "aggregated_score", getattr(media, "score", None)),
731+
),
728732
"release_datetime": lambda media: _sort_nullable(
729733
getattr(_item_from_result(media), "release_datetime", None),
730734
),

src/api/tests/test_media_core.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,38 @@ def test_media_list_get_with_sort_filter_returns_sorted_results(self):
153153
titles = [item["item"]["title"] for item in payload["results"]]
154154
self.assertEqual(titles, sorted(titles, reverse=True))
155155

156+
def test_media_list_get_sorts_by_user_score(self):
157+
"""Media list accepts score as a tracked-media sort field."""
158+
for media, score in zip(self.movie_medias, (7, 9, 8), strict=True):
159+
media.score = score
160+
media.save(update_fields=["score"])
161+
162+
response = self.call_api(
163+
"get",
164+
"api_media_list",
165+
params={"media_type": MediaTypes.MOVIE.value, "sort": "score_desc"},
166+
headers=self.auth_headers,
167+
)
168+
169+
self.assertEqual(response.status_code, 200)
170+
self.assertEqual(
171+
[item["score"] for item in response.json()["results"]],
172+
[9, 8, 7],
173+
)
174+
175+
response = self.call_api(
176+
"get",
177+
"api_media_list",
178+
params={"sort": "score_desc"},
179+
headers=self.auth_headers,
180+
)
181+
182+
self.assertEqual(response.status_code, 200)
183+
self.assertEqual(
184+
[item["score"] for item in response.json()["results"][:3]],
185+
[9, 8, 7],
186+
)
187+
156188
def test_media_list_get_with_exclude_filter_excludes_type(self):
157189
"""Media list endpoint should exclude requested media types."""
158190
response = self.call_api(

0 commit comments

Comments
 (0)