Skip to content

Commit

Permalink
Sync modeladmin field ordering logic with django's
Browse files Browse the repository at this point in the history
Fixes #5992
  • Loading branch information
thatguystone committed Mar 18, 2021
1 parent ee71bd3 commit 3ebd58c
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions wagtail/contrib/modeladmin/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
SuspiciousOperation)
from django.core.paginator import InvalidPage, Paginator
from django.db import models
from django.db.models.expressions import Combinable
from django.db.models.fields.related import ManyToManyField, OneToOneRel
from django.shortcuts import get_object_or_404, redirect
from django.template.defaultfilters import filesizeformat
Expand Down Expand Up @@ -487,8 +488,16 @@ def get_ordering(self, request, queryset):
order_field = self.get_ordering_field(field_name)
if not order_field:
continue # No 'admin_order_field', skip it
if isinstance(order_field, models.OrderBy):
if pfx == '-':
order_field = order_field.copy()
order_field.reverse_ordering()
ordering.append(order_field)
elif hasattr(order_field, 'resolve_expression'):
# order_field is an expression.
ordering.append(order_field.desc() if pfx == '-' else order_field.asc())
# reverse order if order_field has already "-" as prefix
if order_field.startswith('-') and pfx == "-":
elif order_field.startswith('-') and pfx == '-':
ordering.append(order_field[1:])
else:
ordering.append(pfx + order_field)
Expand Down Expand Up @@ -523,7 +532,15 @@ def get_ordering_field_columns(self):
# know the right column numbers absolutely, because there might be
# morr than one column associated with that ordering, so we guess.
for field in ordering:
if field.startswith('-'):
if isinstance(field, (Combinable, models.OrderBy)):
if not isinstance(field, models.OrderBy):
field = field.asc()
if isinstance(field.expression, models.F):
order_type = 'desc' if field.descending else 'asc'
field = field.expression.name
else:
continue
elif field.startswith('-'):
field = field[1:]
order_type = 'desc'
else:
Expand Down

0 comments on commit 3ebd58c

Please sign in to comment.