diff --git a/polyphonic/library/templates/library/work_list.html b/polyphonic/library/templates/library/work_list.html index d6f27a1..b668aee 100644 --- a/polyphonic/library/templates/library/work_list.html +++ b/polyphonic/library/templates/library/work_list.html @@ -30,7 +30,7 @@
_ {% for letter in letters %} -{{ letter }}  +{{ letter }}  {% endfor %}
{% endif %} @@ -38,8 +38,8 @@ - - + + {% if not collection %}{% endif %} diff --git a/polyphonic/library/views/__init__.py b/polyphonic/library/views/__init__.py index e36dc5d..9b80e41 100644 --- a/polyphonic/library/views/__init__.py +++ b/polyphonic/library/views/__init__.py @@ -200,13 +200,8 @@ class WorkListView(CollectionMixin, TemplateView): data["meta"] = qs.meta # data["page_range"] = data["page_obj"]["paginator"] else: - qs = self.get_queryset() - - start = self.request.GET.get("start") - if start: - start = start.upper() - qs = qs.filter(name__gte=start, name__lt=start + "~") - data["start"] = start + qs, ctx = self.get_filtered_queryset() + data.update(ctx) data["letters"] = string.ascii_uppercase @@ -223,9 +218,27 @@ class WorkListView(CollectionMixin, TemplateView): def get_collections(self): raise NotImplementedError - def get_queryset(self): + def get_filtered_queryset(self): works = self.get_works() - return works.order_by("name", "composer", "edition", "pk").distinct() + ctx = {} + + sort = self.request.GET.get("sort", "name").lower() + + order = ["name", "composer", "edition"] + if sort not in order: + raise KeyError(f"Cannot sort by {sort}") + order.remove(sort) + order = [sort] + order + ["pk"] + ctx["sort"] = sort + + start = self.request.GET.get("start") + if start: + start = start.upper() + filters = {f"{sort}__gte": start, f"{sort}__lt": start + "~"} + works = works.filter(**filters) + ctx["start"] = start + + return works.order_by(*order).distinct(), ctx def get_results(self, query, page): try:
WorkComposerWork {{ "list_arrow"|icon }}Composer {{ "list_arrow"|icon }} EditionCollection