This commit is contained in:
Tris Forster 2026-08-05 08:24:50 +10:00
commit 56827fa6b2
2 changed files with 26 additions and 13 deletions

View File

@ -30,7 +30,7 @@
<div class="has-text-centered"> <div class="has-text-centered">
<a href="?">_</a> <a href="?">_</a>
{% for letter in letters %} {% for letter in letters %}
<a href="?start={{ letter }}">{{ letter }}</a>&nbsp; <a href="?start={{ letter }}&sort={{ sort }}">{{ letter }}</a>&nbsp;
{% endfor %} {% endfor %}
</div> </div>
{% endif %} {% endif %}
@ -38,9 +38,9 @@
<table class="table is-striped is-fullwidth"> <table class="table is-striped is-fullwidth">
<thead> <thead>
<tr> <tr>
<th>Work</th> <th>Work <span class="icon-text"><a href="?start={{ start }}&sort=name">{{ "list_arrow"|icon }}</a></span></th>
<th>Composer</th> <th>Composer <span class="icon-text"><a href="?start={{ start }}&sort=composer">{{ "list_arrow"|icon }}</a></span></th>
<th class="is-hidden-mobile">Edition</th> <th class="is-hidden-mobile">Edition</th>
{% if not collection and not project %}<th class="is-hidden-touch">Collection</th>{% endif %} {% if not collection and not project %}<th class="is-hidden-touch">Collection</th>{% endif %}
{% if project %}<th/>{% endif %} {% if project %}<th/>{% endif %}
</tr> </tr>

View File

@ -205,13 +205,8 @@ class WorkListView(CollectionMixin, TemplateView):
data["meta"] = qs.meta data["meta"] = qs.meta
# data["page_range"] = data["page_obj"]["paginator"] # data["page_range"] = data["page_obj"]["paginator"]
else: else:
qs = self.get_queryset() qs, ctx = self.get_filtered_queryset()
data.update(ctx)
start = self.request.GET.get("start")
if start:
start = start.upper()
qs = qs.filter(name__gte=start, name__lt=start + "~")
data["start"] = start
data["letters"] = string.ascii_uppercase data["letters"] = string.ascii_uppercase
@ -228,9 +223,27 @@ class WorkListView(CollectionMixin, TemplateView):
def get_collections(self): def get_collections(self):
raise NotImplementedError raise NotImplementedError
def get_queryset(self): def get_filtered_queryset(self):
works = self.get_works() 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): def get_results(self, query, page):
try: try: