From 5f888d8400507827acd4df2c7bffdf0a6ce7c06e Mon Sep 17 00:00:00 2001 From: Wayne Witzel III Date: Wed, 28 Mar 2018 14:52:44 -0400 Subject: [PATCH 1/2] Fix issue with adding new RBAC fields --- awx/main/fields.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/awx/main/fields.py b/awx/main/fields.py index d0f6081693..c39cea014c 100644 --- a/awx/main/fields.py +++ b/awx/main/fields.py @@ -273,35 +273,40 @@ class ImplicitRoleField(models.ForeignKey): Role_ = utils.get_current_apps().get_model('main', 'Role') ContentType_ = utils.get_current_apps().get_model('contenttypes', 'ContentType') 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(): # Create any missing role objects missing_roles = [] - for implicit_role_field in getattr(instance.__class__, '__implicit_role_fields'): - cur_role = getattr(instance, implicit_role_field.name, None) + for implicit_role_field in getattr(latest_instance.__class__, '__implicit_role_fields'): + cur_role = getattr(latest_instance, implicit_role_field.name, None) if cur_role is None: missing_roles.append( Role_( role_field=implicit_role_field.name, content_type_id=ct_id, - object_id=instance.id + object_id=latest_instance.id ) ) + if len(missing_roles) > 0: Role_.objects.bulk_create(missing_roles) updates = {} role_ids = [] - for role in Role_.objects.filter(content_type_id=ct_id, object_id=instance.id): - setattr(instance, role.role_field, role) + for role in Role_.objects.filter(content_type_id=ct_id, object_id=latest_instance.id): + setattr(latest_instance, role.role_field, role) updates[role.role_field] = 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, []) # Update parentage if necessary - for implicit_role_field in getattr(instance.__class__, '__implicit_role_fields'): - cur_role = getattr(instance, implicit_role_field.name) + for implicit_role_field in getattr(latest_instance.__class__, '__implicit_role_fields'): + cur_role = getattr(latest_instance, implicit_role_field.name) 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.add(*list(new_parents - original_parents)) new_parents_list = list(new_parents) From bab27453924286411c085077ccc78b9f54772070 Mon Sep 17 00:00:00 2001 From: Wayne Witzel III Date: Wed, 4 Apr 2018 07:47:13 -0400 Subject: [PATCH 2/2] Refresh the old instance so the returned obj is up-to-date --- awx/main/fields.py | 1 + 1 file changed, 1 insertion(+) diff --git a/awx/main/fields.py b/awx/main/fields.py index c39cea014c..d53f00a0c3 100644 --- a/awx/main/fields.py +++ b/awx/main/fields.py @@ -315,6 +315,7 @@ class ImplicitRoleField(models.ForeignKey): if cur_role.implicit_parents != new_parents_json: cur_role.implicit_parents = new_parents_json cur_role.save() + instance.refresh_from_db() def _resolve_parent_roles(self, instance):