Skip to content

Commit 2c13ec9

Browse files
authored
feat: refine package search to display the most recent versions first (#504)
Signed-off-by: tdruez <tdruez@aboutcode.org>
1 parent e5bf448 commit 2c13ec9

File tree

3 files changed

+14
-5
lines changed

3 files changed

+14
-5
lines changed

component_catalog/filters.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,13 @@ class PackageFilterSet(DataspacedFilterSet):
205205
"sha1",
206206
"md5",
207207
],
208+
ordering=[
209+
"type",
210+
"namespace",
211+
"name",
212+
# In a search context, we want to display the most recent versions first
213+
"-version",
214+
],
208215
search_fields=[
209216
"type",
210217
"namespace",

component_catalog/tests/test_filters.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,8 +377,8 @@ def test_package_filterset_search_match_order_on_purl_fields(self):
377377

378378
data = {"q": "django"}
379379
filterset = PackageFilterSet(dataspace=self.dataspace, data=data)
380-
expected = ["pkg:pypi/django@4.0", "pkg:pypi/django@5.0"]
381-
self.assertEqual(sorted(expected), self.sorted_results(filterset.qs))
380+
expected = ["pkg:pypi/django@5.0", "pkg:pypi/django@4.0"]
381+
self.assertEqual([str(package) for package in filterset.qs], expected)
382382

383383
def test_package_filterset_is_vulnerable_filter(self):
384384
package1 = make_package(self.dataspace, is_vulnerable=True)

dje/filters.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,10 @@ class MatchOrderedSearchFilter(SearchRankFilter):
230230
https://www.postgresql.org/docs/10/static/functions-matching.html#POSIX-CONSTRAINT-ESCAPES-TABLE
231231
"""
232232

233-
def __init__(self, match_order_fields, *args, **kwargs):
233+
def __init__(self, match_order_fields, ordering=None, *args, **kwargs):
234234
super().__init__(*args, **kwargs)
235235
self.match_order_fields = match_order_fields
236+
self.ordering = ordering
236237

237238
def get_match_order_lookups(self, lookup_type, value):
238239
or_queries = [
@@ -258,12 +259,13 @@ def filter(self, qs, value):
258259
output_field=IntegerField(),
259260
)
260261

261-
default_ordering = self.model._meta.ordering
262+
ordering = self.ordering or self.model._meta.ordering
262263

263264
simple_search_qs = (
264265
qs.filter(self.get_match_order_lookups("icontains", value))
265266
.annotate(match_order=match_order)
266-
.order_by("match_order", *default_ordering)
267+
# Sort by match pertiance first, then by field values
268+
.order_by("match_order", *ordering)
267269
)
268270

269271
if simple_search_qs.exists():

0 commit comments

Comments
 (0)