From 233672d822eb170a064dcddfd203a1fd4178f7e4 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 14 Oct 2021 14:25:39 +1100 Subject: [PATCH] Add new functionality to InvenTreeOrderingFilter - Allow ordering by multiple field aliases - Simply way to implement "integer ordering" functionality --- InvenTree/InvenTree/filters.py | 43 +++++++++++++++++++++++++++++----- InvenTree/build/api.py | 7 +++++- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/InvenTree/InvenTree/filters.py b/InvenTree/InvenTree/filters.py index cd1b769646..fbd1e53fe0 100644 --- a/InvenTree/InvenTree/filters.py +++ b/InvenTree/InvenTree/filters.py @@ -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 diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py index 7920003d8b..ea177c1570 100644 --- a/InvenTree/build/api.py +++ b/InvenTree/build/api.py @@ -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',