mirror of
https://github.com/ansible/awx.git
synced 2026-03-05 18:51:06 -03:30
Code de-dup
This commit is contained in:
@@ -243,18 +243,26 @@ class ImplicitRoleField(models.ForeignKey):
|
|||||||
|
|
||||||
def _calc_original_parents(self, instance):
|
def _calc_original_parents(self, instance):
|
||||||
if not hasattr(self, '__original_parent_roles'):
|
if not hasattr(self, '__original_parent_roles'):
|
||||||
setattr(self, '__original_parent_roles', []) # do not just self.__original_parent_roles=[], it's not the same here
|
setattr(self, '__original_parent_roles', set()) # do not just self.__original_parent_roles=[], it's not the same here, apparently.
|
||||||
paths = self.parent_role if type(self.parent_role) is list else [self.parent_role]
|
# NOTE: The above setattr is required to be called bofore
|
||||||
original_parent_roles = set()
|
# _resolve_parent_roles because we can end up recursing, so the enclosing
|
||||||
for path in paths:
|
# if not hasattr protects against this.
|
||||||
if path.startswith("singleton:"):
|
original_parent_roles = self._resolve_parent_roles(instance)
|
||||||
parents = [Role.singleton(path[10:])]
|
|
||||||
else:
|
|
||||||
parents = resolve_role_field(instance, path)
|
|
||||||
for parent in parents:
|
|
||||||
original_parent_roles.add(parent)
|
|
||||||
setattr(self, '__original_parent_roles', original_parent_roles)
|
setattr(self, '__original_parent_roles', original_parent_roles)
|
||||||
|
|
||||||
|
def _resolve_parent_roles(self, instance):
|
||||||
|
paths = self.parent_role if type(self.parent_role) is list else [self.parent_role]
|
||||||
|
parent_roles = set()
|
||||||
|
for path in paths:
|
||||||
|
if path.startswith("singleton:"):
|
||||||
|
parents = [Role.singleton(path[10:])]
|
||||||
|
else:
|
||||||
|
parents = resolve_role_field(instance, path)
|
||||||
|
for parent in parents:
|
||||||
|
parent_roles.add(parent)
|
||||||
|
return parent_roles
|
||||||
|
|
||||||
|
|
||||||
def _post_save(self, instance, created, *args, **kwargs):
|
def _post_save(self, instance, created, *args, **kwargs):
|
||||||
# Ensure that our field gets initialized after our first save
|
# Ensure that our field gets initialized after our first save
|
||||||
this_role = getattr(instance, self.name)
|
this_role = getattr(instance, self.name)
|
||||||
@@ -269,16 +277,8 @@ class ImplicitRoleField(models.ForeignKey):
|
|||||||
self._calc_original_parents(instance)
|
self._calc_original_parents(instance)
|
||||||
return
|
return
|
||||||
|
|
||||||
paths = self.parent_role if type(self.parent_role) is list else [self.parent_role]
|
|
||||||
original_parents = getattr(self, '__original_parent_roles')
|
original_parents = getattr(self, '__original_parent_roles')
|
||||||
new_parents = set()
|
new_parents = self._resolve_parent_roles(instance)
|
||||||
for path in paths:
|
|
||||||
if path.startswith("singleton:"):
|
|
||||||
parents = [Role.singleton(path[10:])]
|
|
||||||
else:
|
|
||||||
parents = resolve_role_field(instance, path)
|
|
||||||
for parent in parents:
|
|
||||||
new_parents.add(parent)
|
|
||||||
|
|
||||||
with batch_role_ancestor_rebuilding():
|
with batch_role_ancestor_rebuilding():
|
||||||
for role in original_parents - new_parents:
|
for role in original_parents - new_parents:
|
||||||
|
|||||||
Reference in New Issue
Block a user