Add new functionality to InvenTreeOrderingFilter

- Allow ordering by multiple field aliases
- Simply way to implement "integer ordering" functionality
This commit is contained in:
Oliver 2021-10-14 14:25:39 +11:00
parent 0cdc82a4b3
commit 233672d822
2 changed files with 43 additions and 7 deletions

View File

@ -34,18 +34,49 @@ class InvenTreeOrderingFilter(OrderingFilter):
Ordering fields should be mapped to separate fields Ordering fields should be mapped to separate fields
""" """
for idx, field in enumerate(ordering): idx = 0
reverse = False ordering_initial = ordering
ordering = []
if field.startswith('-'): for field in ordering_initial:
reverse = field.startswith('-')
if reverse:
field = field[1:] field = field[1:]
reverse = True
# Are aliases defined for this field?
if field in aliases: if field in aliases:
ordering[idx] = aliases[field] alias = aliases[field]
else:
alias = field
"""
Potentially, a single field could be "aliased" to multiple field,
(For example to enforce a particular ordering sequence)
e.g. to filter first by the integer value...
ordering_field_aliases = {
"reference": ["integer_ref", "reference"]
}
"""
if type(alias) is str:
alias = [alias]
elif type(alias) in [list, tuple]:
pass
else:
# Unsupported alias type
continue
for a in alias:
if reverse: if reverse:
ordering[idx] = '-' + ordering[idx] a = '-' + a
ordering.append(a)
return ordering return ordering

View File

@ -17,6 +17,7 @@ from django_filters import rest_framework as rest_filters
from InvenTree.api import AttachmentMixin from InvenTree.api import AttachmentMixin
from InvenTree.helpers import str2bool, isNull from InvenTree.helpers import str2bool, isNull
from InvenTree.filters import InvenTreeOrderingFilter
from InvenTree.status_codes import BuildStatus from InvenTree.status_codes import BuildStatus
from .models import Build, BuildItem, BuildOrderAttachment from .models import Build, BuildItem, BuildOrderAttachment
@ -68,7 +69,7 @@ class BuildList(generics.ListCreateAPIView):
filter_backends = [ filter_backends = [
DjangoFilterBackend, DjangoFilterBackend,
filters.SearchFilter, filters.SearchFilter,
filters.OrderingFilter, InvenTreeOrderingFilter,
] ]
ordering_fields = [ ordering_fields = [
@ -83,6 +84,10 @@ class BuildList(generics.ListCreateAPIView):
'responsible', 'responsible',
] ]
ordering_field_aliases = {
'reference': ['integer_ref', 'reference'],
}
search_fields = [ search_fields = [
'reference', 'reference',
'part__name', 'part__name',