Support ordering on search results

pull/11032/head
Matt Westcott 2023-10-11 00:22:55 +01:00
rodzic de59c75d10
commit a7943bf83a
1 zmienionych plików z 45 dodań i 27 usunięć

Wyświetl plik

@ -117,19 +117,31 @@ class BaseIndexView(PermissionCheckedMixin, BaseListingView):
return super().get(request) return super().get(request)
def get_ordering(self): def get_ordering(self):
ordering = self.request.GET.get("ordering", "-latest_revision_created_at") valid_orderings = [
if ordering not in [
"title", "title",
"-title", "-title",
"content_type",
"-content_type",
"live", "live",
"-live", "-live",
"latest_revision_created_at", "latest_revision_created_at",
"-latest_revision_created_at", "-latest_revision_created_at",
"ord", ]
]:
ordering = "-latest_revision_created_at" if self.query_string:
# default to ordering by relevance
default_ordering = None
else:
default_ordering = "-latest_revision_created_at"
# ordering by page order is only available when not searching
valid_orderings.append("ord")
# ordering by content type not currently available when searching, due to
# https://github.com/wagtail/wagtail/issues/6616
valid_orderings.append("content_type")
valid_orderings.append("-content_type")
ordering = self.request.GET.get("ordering", default_ordering)
if ordering not in valid_orderings:
ordering = default_ordering
return ordering return ordering
@ -146,6 +158,7 @@ class BaseIndexView(PermissionCheckedMixin, BaseListingView):
self.ordering = self.get_ordering() self.ordering = self.get_ordering()
if not is_searching:
if self.ordering == "ord": if self.ordering == "ord":
# preserve the native ordering from get_children() # preserve the native ordering from get_children()
pass pass
@ -180,6 +193,11 @@ class BaseIndexView(PermissionCheckedMixin, BaseListingView):
pages = pages.annotate_site_root_state().annotate_approved_schedule() pages = pages.annotate_site_root_state().annotate_approved_schedule()
if is_searching: if is_searching:
if self.ordering:
pages = pages.order_by(self.ordering).autocomplete(
self.query_string, order_by_relevance=False
)
else:
pages = pages.autocomplete(self.query_string) pages = pages.autocomplete(self.query_string)
return pages return pages