def _post_save(self, instance, created, *args, **kwargs): 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(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=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=latest_instance.id): setattr(latest_instance, role.role_field, role) updates[role.role_field] = role.id role_ids.append(role.id) type(latest_instance).objects.filter(pk=latest_instance.pk).update(**updates) Role.rebuild_role_ancestor_list(role_ids, []) update_role_parentage_for_instance(latest_instance) instance.refresh_from_db()
def _resolve_parent_roles(self, instance): if not self.parent_role: return set() 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:"): singleton_name = path[10:] Role_ = utils.get_current_apps().get_model('main', 'Role') qs = Role_.objects.filter(singleton_name=singleton_name) if qs.count() >= 1: role = qs[0] else: role = Role_.objects.create(singleton_name=singleton_name, role_field=singleton_name) parents = [role.id] else: parents = resolve_role_field(instance, path) for parent in parents: parent_roles.add(parent) return parent_roles
def resolve_role_field(obj, field): ret = [] field_components = field.split('.', 1) if hasattr(obj, field_components[0]): obj = getattr(obj, field_components[0]) else: return [] if obj is None: return [] if len(field_components) == 1: role_cls = str(utils.get_current_apps().get_model('main', 'Role')) if not str(type(obj)) == role_cls: raise Exception( smart_text('{} refers to a {}, not a Role'.format( field, type(obj)))) ret.append(obj.id) else: if type(obj) is ManyToManyDescriptor: for o in obj.all(): ret += resolve_role_field(o, field_components[1]) else: ret += resolve_role_field(obj, field_components[1]) return ret
def _post_delete(self, instance, *args, **kwargs): role_ids = [] for implicit_role_field in getattr(instance.__class__, '__implicit_role_fields'): role_ids.append(getattr(instance, implicit_role_field.name + '_id')) Role_ = utils.get_current_apps().get_model('main', 'Role') child_ids = [x for x in Role_.parents.through.objects.filter(to_role_id__in=role_ids).distinct().values_list('from_role_id', flat=True)] Role_.objects.filter(id__in=role_ids).delete() Role.rebuild_role_ancestor_list([], child_ids)
def _post_save(self, instance, created, *args, **kwargs): 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 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) if cur_role is None: missing_roles.append( Role_(role_field=implicit_role_field.name, content_type_id=ct_id, object_id=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) updates[role.role_field] = role.id role_ids.append(role.id) type(instance).objects.filter(pk=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) original_parents = set(json.loads(cur_role.implicit_parents)) new_parents = implicit_role_field._resolve_parent_roles( 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) new_parents_list.sort() new_parents_json = json.dumps(new_parents_list) if cur_role.implicit_parents != new_parents_json: cur_role.implicit_parents = new_parents_json cur_role.save()
def get_activity_stream_class(): if 'migrate' in sys.argv: return get_current_apps().get_model('main', 'ActivityStream') else: return ActivityStream