31 lines
855 B
Python
31 lines
855 B
Python
"""Marketplace filters."""
|
|
|
|
from django.db.models import F
|
|
from django_filters import rest_framework as filters
|
|
|
|
EMPTY_VALUES = ([], (), {}, '', None)
|
|
|
|
|
|
class NullsAlwaysLastOrderingFilter(filters.OrderingFilter):
|
|
""" Use Django 1.11 nulls_last feature to force nulls to bottom in all orderings. """
|
|
|
|
def filter(self, qs, value):
|
|
if value in EMPTY_VALUES:
|
|
return qs
|
|
|
|
ordering = [self.get_ordering_value(param) for param in value]
|
|
|
|
if ordering:
|
|
f_ordering = []
|
|
for o in ordering:
|
|
if not o:
|
|
continue
|
|
if o[0] == '-':
|
|
f_ordering.append(F(o[1:]).desc(nulls_last=True))
|
|
else:
|
|
f_ordering.append(F(o).asc(nulls_last=True))
|
|
|
|
return qs.order_by(*f_ordering)
|
|
|
|
return qs
|