Merge pull request #1151 from wwitzel3/release_3.3.0

Fix issue with adding new RBAC fields
This commit is contained in:
Wayne Witzel III
2018-04-04 08:03:52 -04:00
committed by GitHub

View File

@@ -273,35 +273,40 @@ class ImplicitRoleField(models.ForeignKey):
Role_ = utils.get_current_apps().get_model('main', 'Role') Role_ = utils.get_current_apps().get_model('main', 'Role')
ContentType_ = utils.get_current_apps().get_model('contenttypes', 'ContentType') ContentType_ = utils.get_current_apps().get_model('contenttypes', 'ContentType')
ct_id = ContentType_.objects.get_for_model(instance).id ct_id = ContentType_.objects.get_for_model(instance).id
Model = utils.get_current_apps().get_model('main', instance.__class__.__name__)
latest_instance = Model.objects.get(pk=instance.pk)
with batch_role_ancestor_rebuilding(): with batch_role_ancestor_rebuilding():
# Create any missing role objects # Create any missing role objects
missing_roles = [] missing_roles = []
for implicit_role_field in getattr(instance.__class__, '__implicit_role_fields'): for implicit_role_field in getattr(latest_instance.__class__, '__implicit_role_fields'):
cur_role = getattr(instance, implicit_role_field.name, None) cur_role = getattr(latest_instance, implicit_role_field.name, None)
if cur_role is None: if cur_role is None:
missing_roles.append( missing_roles.append(
Role_( Role_(
role_field=implicit_role_field.name, role_field=implicit_role_field.name,
content_type_id=ct_id, content_type_id=ct_id,
object_id=instance.id object_id=latest_instance.id
) )
) )
if len(missing_roles) > 0: if len(missing_roles) > 0:
Role_.objects.bulk_create(missing_roles) Role_.objects.bulk_create(missing_roles)
updates = {} updates = {}
role_ids = [] role_ids = []
for role in Role_.objects.filter(content_type_id=ct_id, object_id=instance.id): for role in Role_.objects.filter(content_type_id=ct_id, object_id=latest_instance.id):
setattr(instance, role.role_field, role) setattr(latest_instance, role.role_field, role)
updates[role.role_field] = role.id updates[role.role_field] = role.id
role_ids.append(role.id) role_ids.append(role.id)
type(instance).objects.filter(pk=instance.pk).update(**updates) type(latest_instance).objects.filter(pk=latest_instance.pk).update(**updates)
Role.rebuild_role_ancestor_list(role_ids, []) Role.rebuild_role_ancestor_list(role_ids, [])
# Update parentage if necessary # Update parentage if necessary
for implicit_role_field in getattr(instance.__class__, '__implicit_role_fields'): for implicit_role_field in getattr(latest_instance.__class__, '__implicit_role_fields'):
cur_role = getattr(instance, implicit_role_field.name) cur_role = getattr(latest_instance, implicit_role_field.name)
original_parents = set(json.loads(cur_role.implicit_parents)) original_parents = set(json.loads(cur_role.implicit_parents))
new_parents = implicit_role_field._resolve_parent_roles(instance) new_parents = implicit_role_field._resolve_parent_roles(latest_instance)
cur_role.parents.remove(*list(original_parents - new_parents)) cur_role.parents.remove(*list(original_parents - new_parents))
cur_role.parents.add(*list(new_parents - original_parents)) cur_role.parents.add(*list(new_parents - original_parents))
new_parents_list = list(new_parents) new_parents_list = list(new_parents)
@@ -310,6 +315,7 @@ class ImplicitRoleField(models.ForeignKey):
if cur_role.implicit_parents != new_parents_json: if cur_role.implicit_parents != new_parents_json:
cur_role.implicit_parents = new_parents_json cur_role.implicit_parents = new_parents_json
cur_role.save() cur_role.save()
instance.refresh_from_db()
def _resolve_parent_roles(self, instance): def _resolve_parent_roles(self, instance):