Projet

Général

Profil

0008-rbac-add-direct-parameter-to-parents-and-children-me.patch

Benjamin Dauvergne, 13 mai 2022 17:27

Télécharger (3,68 ko)

Voir les différences:

Subject: [PATCH 8/9] rbac: add direct parameter to parents and children
 methods (#62013)

It will limit the parents/children roles returned to those with a direct inheritance relation.
 src/django_rbac/managers.py | 34 ++++++++++++++++++++++++----------
 src/django_rbac/models.py   | 12 ++++++++----
 2 files changed, 32 insertions(+), 14 deletions(-)
src/django_rbac/managers.py
107 107
    def for_user(self, user):
108 108
        return self.filter(members=user).parents().distinct()
109 109

  
110
    def parents(self, include_self=True, annotate=False):
111
        qs = self.model.objects.filter(
112
            child_relation__deleted__isnull=True,
113
            child_relation__child__in=self,
114
        )
110
    def parents(self, include_self=True, annotate=False, direct=None):
111
        if direct is None:
112
            qs = self.model.objects.filter(
113
                child_relation__deleted__isnull=True,
114
                child_relation__child__in=self,
115
            )
116
        else:
117
            qs = self.model.objects.filter(
118
                child_relation__deleted__isnull=True,
119
                child_relation__child__in=self,
120
                child_relation__direct=direct,
121
            )
115 122
        if include_self:
116 123
            qs = self | qs
117 124
        qs = qs.distinct()
......
119 126
            qs = qs.annotate(direct=models.Max(IntCast('child_relation__direct')))
120 127
        return qs
121 128

  
122
    def children(self, include_self=True, annotate=False):
123
        qs = self.model.objects.filter(
124
            parent_relation__deleted__isnull=True,
125
            parent_relation__parent__in=self,
126
        )
129
    def children(self, include_self=True, annotate=False, direct=None):
130
        if direct is None:
131
            qs = self.model.objects.filter(
132
                parent_relation__deleted__isnull=True,
133
                parent_relation__parent__in=self,
134
            )
135
        else:
136
            qs = self.model.objects.filter(
137
                parent_relation__deleted__isnull=True,
138
                parent_relation__parent__in=self,
139
                parent_relation__direct=direct,
140
            )
127 141
        if include_self:
128 142
            qs = self | qs
129 143
        qs = qs.distinct()
src/django_rbac/models.py
209 209
        RoleParenting = utils.get_role_parenting_model()
210 210
        RoleParenting.objects.soft_delete(parent, self)
211 211

  
212
    def parents(self, include_self=True, annotate=False):
213
        return self.__class__.objects.filter(pk=self.pk).parents(include_self=include_self, annotate=annotate)
212
    def parents(self, include_self=True, annotate=False, direct=None):
213
        return self.__class__.objects.filter(pk=self.pk).parents(
214
            include_self=include_self, annotate=annotate, direct=None
215
        )
214 216

  
215
    def children(self, include_self=True, annotate=False):
217
    def children(self, include_self=True, annotate=False, direct=None):
216 218
        return self.__class__.objects.filter(pk=self.pk).children(
217
            include_self=include_self, annotate=annotate
219
            include_self=include_self,
220
            annotate=annotate,
221
            direct=direct,
218 222
        )
219 223

  
220 224
    def all_members(self):
221
-