Code de-dup

This commit is contained in:
Akita Noek
2016-03-17 13:25:04 -04:00
parent d997e93aa1
commit ccfb73766c

View File

@@ -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: