Projet

Général

Profil

0007-rbac-update_or_create-roleparenting-for-update_trans.patch

Paul Marillonnet, 15 octobre 2021 10:42

Télécharger (1,87 ko)

Voir les différences:

Subject: [PATCH 7/8] rbac: update_or_create roleparenting for
 update_transitive_closure (#57500)

 src/django_rbac/managers.py | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)
src/django_rbac/managers.py
198 198
            self.tls.CLOSURE_UPDATED = True
199 199
            return
200 200

  
201
        old = ris = self.filter(deleted__isnull=True)
201 202
        # existing indirect paths
202
        old = set(self.filter(direct=False).values_list('parent_id', 'child_id'))
203
        old = old.filter(direct=False)
203 204
        # existing direct paths
204
        ris = set(self.filter(direct=True).values_list('parent_id', 'child_id'))
205
        ris = ris.filter(direct=True)
206
        old = set(old.values_list('parent_id', 'child_id'))
207
        ris = set(ris.values_list('parent_id', 'child_id'))
208

  
205 209
        add = set()
206 210
        new = set()
207 211
        old_new = ris
......
224 228
            old_new = new
225 229
            new = set()
226 230
        # Create new relations
227
        self.model.objects.bulk_create(
228
            self.model(parent_id=a, child_id=b, direct=False) for a, b in add - old
229
        )
231
        for a, b in add - old:
232
            rp, created = self.model.objects.get_or_create(parent_id=a, child_id=b, direct=False)
233
            if not created:
234
                rp.created = datetime.datetime.now()
235
                rp.deleted = None
236
                rp.save(update_fields=['created', 'deleted'])
230 237
        # Delete old ones
231 238
        obsolete = old - add
232 239
        if obsolete:
233
-