Skip to content

Commit 8b5cd62

Browse files
committed
Table headers pick up the ordering from the QuerySet/Model automatically
1 parent aae1352 commit 8b5cd62

3 files changed

Lines changed: 50 additions & 3 deletions

File tree

iommi/edit_table__tests.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,7 @@ def parent_form_save_test(abort_on_fail):
744744
<table class="table" data-new-row-endpoint="/new_row" data-next-virtual-pk="-3">
745745
<thead>
746746
<tr>
747-
<th class="first_column iommi_sort_header subheader"><a href="?albums%2Forder=name">Name</a></th>
747+
<th class="ascending first_column iommi_sort_header sorted subheader"><a href="?albums%2Forder=-name">Name</a></th>
748748
<th class="first_column iommi_sort_header subheader"><a href="?albums%2Forder=year">Year</a></th>
749749
</tr>
750750
</thead>
@@ -793,7 +793,7 @@ def parent_form_save_test(abort_on_fail):
793793
<table class="table" data-new-row-endpoint="/new_row" data-next-virtual-pk="-3">
794794
<thead>
795795
<tr>
796-
<th class="first_column iommi_sort_header subheader"><a href="?albums%2Forder=name">Name</a></th>
796+
<th class="ascending first_column iommi_sort_header sorted subheader"><a href="?albums%2Forder=-name">Name</a></th>
797797
<th class="first_column iommi_sort_header subheader"><a href="?albums%2Forder=year">Year</a></th>
798798
</tr>
799799
</thead>

iommi/table.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ def prepare_headers(table):
196196
if column.sortable:
197197
params = params_of_request(request)
198198
param_path = path_join(table.iommi_path, 'order')
199-
order = request.GET.get(param_path) or table.default_sort_order
199+
order = table.current_sort_order
200200
start_sort_desc = column.sort_default_desc
201201
params[param_path] = name if not start_sort_desc else '-' + name
202202
column.is_sorting = False
@@ -1729,6 +1729,24 @@ def __html__(self):
17291729
return mark_safe('\n'.join([cells.__html__() for cells in self.table.cells_for_rows()]))
17301730

17311731

1732+
def get_queryset_ordering(queryset):
1733+
# Check if queryset has default_ordering flag set to False
1734+
# (This happens when .order_by() is called with no arguments)
1735+
if not queryset.query.default_ordering:
1736+
return ()
1737+
1738+
# Get explicit ordering if it exists
1739+
if queryset.query.order_by:
1740+
return queryset.query.order_by
1741+
1742+
# Fall back to model's Meta.ordering
1743+
model = queryset.model
1744+
if hasattr(model, '_meta') and model._meta.ordering:
1745+
return tuple(model._meta.ordering)
1746+
1747+
return ()
1748+
1749+
17321750
@declarative(Column, '_columns_dict', add_init_kwargs=False)
17331751
class Table(Part, Tag):
17341752
# language=rst
@@ -2332,6 +2350,7 @@ def _prepare_sorting(self):
23322350
"""
23332351
# TODO: Sorting less values is faster then sorting more values, so we should
23342352
# filter first and then sort.
2353+
self.current_sort_order = None
23352354
self.sorted_rows = self.initial_rows
23362355
self.rows = self.sorted_rows
23372356
request = self.get_request()
@@ -2340,6 +2359,7 @@ def _prepare_sorting(self):
23402359

23412360
# `or self.default_sort_order` is on purpose here, because an empty string should go to default_sort_order too
23422361
order = request.GET.get(path_join(self.iommi_path, 'order')) or self.default_sort_order
2362+
23432363
if order is not None:
23442364
descending = order.startswith('-')
23452365
order_field = order[1:] if descending else order
@@ -2356,6 +2376,14 @@ def _prepare_sorting(self):
23562376
)
23572377
self.rows = self.sorted_rows
23582378

2379+
if order is None and isinstance(self.sorted_rows, QuerySet):
2380+
# order = self.sorted_rows
2381+
ordering = get_queryset_ordering(self.sorted_rows)
2382+
if len(ordering) == 1:
2383+
order = ordering[0]
2384+
2385+
self.current_sort_order = order
2386+
23592387
@staticmethod
23602388
@refinable
23612389
def sorter(

iommi/table__tests.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4644,3 +4644,22 @@ def test_table_list_custom_query():
46444644
query__filter=lambda rows, **_: rows,
46454645
query__filters__foo=Filter(),
46464646
).bind(request=req('get'))
4647+
4648+
4649+
def test_table_headers_pick_up_sorting_from_queryset():
4650+
t = Table(
4651+
auto__model=Album,
4652+
rows=Album.objects.order_by('year'),
4653+
).bind(request=req('get'))
4654+
4655+
assert t.current_sort_order == 'year'
4656+
4657+
4658+
def test_table_headers_pick_up_sorting_from_model():
4659+
assert Album._meta.ordering == ('name',)
4660+
t = Table(
4661+
auto__model=Album,
4662+
rows=Album.objects.all(),
4663+
).bind(request=req('get'))
4664+
4665+
assert t.current_sort_order == 'name'

0 commit comments

Comments
 (0)