mirror of
https://github.com/ansible/awx.git
synced 2026-05-07 01:17:37 -02:30
Merge pull request #1151 from wwitzel3/release_3.3.0
Fix issue with adding new RBAC fields
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user