From a4807bc966bca83960f7071ee7080e72e208f76c Mon Sep 17 00:00:00 2001 From: Valentin Rigal <rigal@teklia.com> Date: Tue, 15 Dec 2020 11:47:27 +0100 Subject: [PATCH] Allow custom order_by --- arkindex/project/mixins.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/arkindex/project/mixins.py b/arkindex/project/mixins.py index 2ec9f0a1d4..cda2c95e87 100644 --- a/arkindex/project/mixins.py +++ b/arkindex/project/mixins.py @@ -21,9 +21,11 @@ class ACLMixin(object): Access control mixin using the generic Right table. """ _user = None + mixin_order_by_fields = () - def __init__(self, user=None): + def __init__(self, user=None, order_by_fields=()): self._user = user + self.mixin_order_by_fields = order_by_fields @property def user(self): @@ -72,15 +74,18 @@ class ACLMixin(object): 'memberships__group__memberships__level' ) ) - # Ensure one of the right has an adequate level - queryset = queryset.filter(max_level__gte=level) + + # Order by decreasing max_level to make sure we keep the max among all rights + queryset = queryset.filter(max_level__gte=level) \ + .order_by(*self.mixin_order_by_fields, 'id', '-max_level') \ + .distinct(*self.mixin_order_by_fields, 'id') # Use a join to add public instances as this is the more elegant solution if include_public: queryset = queryset.union(self.get_public_instances(model, Role.Guest.value)) # Return distinct corpus with the max right level among matching rights - return queryset.order_by('id', '-max_level').distinct('id') + return queryset.order_by(*self.mixin_order_by_fields, 'id') def has_access(self, instance, level): self._check_level(level) -- GitLab