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
"""
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:]
reverse = True
# Are aliases defined for this field?
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:
ordering[idx] = '-' + ordering[idx]
a = '-' + a
ordering.append(a)
return ordering

View File

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