Merge branch 'search-ordering' into 'develop'

Show short entries first in search results to improve UX

See merge request funkwhale/funkwhale!513
This commit is contained in:
Eliot Berriot 2019-01-03 17:40:14 +01:00
commit a5143cb295
3 changed files with 19 additions and 9 deletions

View File

@ -9,7 +9,7 @@ from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit
from django.conf import settings from django.conf import settings
from django import urls from django import urls
from django.db import transaction from django.db import models, transaction
def rename_file(instance, field_name, new_name, allow_missing_file=False): def rename_file(instance, field_name, new_name, allow_missing_file=False):
@ -139,3 +139,11 @@ def parse_meta(html):
meta = [elem for elem in tree.iter() if elem.tag in ["meta", "link"]] meta = [elem for elem in tree.iter() if elem.tag in ["meta", "link"]]
return [dict([("tag", elem.tag)] + list(elem.items())) for elem in meta] return [dict([("tag", elem.tag)] + list(elem.items())) for elem in meta]
def order_for_search(qs, field):
"""
When searching, it's often more useful to have short results first,
this function will order the given qs based on the length of the given field
"""
return qs.annotate(__size=models.functions.Length(field)).order_by("__size")

View File

@ -448,28 +448,29 @@ class Search(views.APIView):
"artist__name__unaccent", "artist__name__unaccent",
] ]
query_obj = utils.get_query(query, search_fields) query_obj = utils.get_query(query, search_fields)
return ( qs = (
models.Track.objects.all() models.Track.objects.all()
.filter(query_obj) .filter(query_obj)
.select_related("artist", "album__artist") .select_related("artist", "album__artist")
)[: self.max_results] )
return common_utils.order_for_search(qs, "title")[: self.max_results]
def get_albums(self, query): def get_albums(self, query):
search_fields = ["mbid", "title__unaccent", "artist__name__unaccent"] search_fields = ["mbid", "title__unaccent", "artist__name__unaccent"]
query_obj = utils.get_query(query, search_fields) query_obj = utils.get_query(query, search_fields)
return ( qs = (
models.Album.objects.all() models.Album.objects.all()
.filter(query_obj) .filter(query_obj)
.select_related() .select_related()
.prefetch_related("tracks") .prefetch_related("tracks__artist")
)[: self.max_results] )
return common_utils.order_for_search(qs, "title")[: self.max_results]
def get_artists(self, query): def get_artists(self, query):
search_fields = ["mbid", "name__unaccent"] search_fields = ["mbid", "name__unaccent"]
query_obj = utils.get_query(query, search_fields) query_obj = utils.get_query(query, search_fields)
return (models.Artist.objects.all().filter(query_obj).with_albums())[ qs = models.Artist.objects.all().filter(query_obj).with_albums()
: self.max_results return common_utils.order_for_search(qs, "name")[: self.max_results]
]
def get_tags(self, query): def get_tags(self, query):
search_fields = ["slug", "name__unaccent"] search_fields = ["slug", "name__unaccent"]

View File

@ -0,0 +1 @@
Show short entries first in search results to improve UX