agent/authentic2: mark object for provisionning if transaction commit (#52355)

This commit is contained in:
Benjamin Dauvergne 2021-03-24 21:13:12 +01:00
parent 75ec113ec4
commit 1a02b24d14
1 changed files with 33 additions and 11 deletions

View File

@ -10,7 +10,7 @@ from authentic2.models import AttributeValue
from authentic2.saml.models import LibertyProvider
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import connection
from django.db import connection, transaction
from django.urls import reverse
from django.utils.encoding import force_text
from django.utils.six.moves.urllib.parse import urljoin
@ -48,6 +48,7 @@ class Provisionning(threading.local):
{
'saved': {},
'deleted': {},
'in_atomic_block': connection.in_atomic_block,
}
)
@ -59,11 +60,16 @@ class Provisionning(threading.local):
return
context = self.stack.pop()
context.pop('in_atomic_block')
if provision:
self.provision(**context)
if wait:
self.wait()
def callback():
self.provision(**context)
if wait:
self.wait()
transaction.on_commit(callback)
@property
def saved(self):
@ -81,18 +87,34 @@ class Provisionning(threading.local):
if not self.stack:
return
for instance in args:
klass = User if isinstance(instance, User) else Role
self.saved.setdefault(klass, set()).add(instance)
in_atomic_block = self.stack[-1]['in_atomic_block']
def callback():
for instance in args:
klass = User if isinstance(instance, User) else Role
self.saved.setdefault(klass, set()).add(instance)
if in_atomic_block:
callback()
else:
transaction.on_commit(callback)
def add_deleted(self, *args):
if not self.stack:
return
for instance in args:
klass = User if isinstance(instance, User) else Role
self.deleted.setdefault(klass, set()).add(instance)
self.saved.get(klass, set()).discard(instance)
in_atomic_block = self.stack[-1]['in_atomic_block']
def callback():
for instance in args:
klass = User if isinstance(instance, User) else Role
self.deleted.setdefault(klass, set()).add(instance)
self.saved.get(klass, set()).discard(instance)
if in_atomic_block:
callback()
else:
transaction.on_commit(callback)
def resolve_ou(self, instances, ous):
for instance in instances: