def apply_cav_proposal(instance, content): if not isinstance(instance, mixins.customattributable.CustomAttributable): return cad_dict = {d.id: d for d in instance.custom_attribute_definitions} cav_dict = { i.custom_attribute_id: i for i in instance.custom_attribute_values } proposals = content.get("custom_attribute_values", {}) for cad_id, value in proposals.iteritems(): cad = cad_dict.get(int(cad_id)) if not cad: # looks like CAD was removed continue if value["attribute_object"]: attribute_object_id = value["attribute_object"]["id"] remove_cav = False else: attribute_object_id = None remove_cav = (cad.attribute_type.startswith("Map:") and value.get("remove_cav")) cav = cav_dict.get(cad.id) if remove_cav and cav: instance.custom_attribute_values.remove(cav) elif not remove_cav and cav: cav.attribute_value = value["attribute_value"] cav.attribute_object_id = attribute_object_id elif not remove_cav: cav = all_models.CustomAttributeValue( custom_attribute=cad, attributable=instance, attribute_value=value["attribute_value"], attribute_object_id=attribute_object_id, ) instance.custom_attribute_values.append(cav)
def apply_cav(instance, content): """Apply CAVs.""" any_cav_applied = False if not isinstance(instance, mixins.customattributable.CustomAttributable): return any_cav_applied cad_dict = {d.id: d for d in instance.custom_attribute_definitions} cav_dict = { i.custom_attribute_id: i for i in instance.custom_attribute_values } proposals = content.get("custom_attribute_values", {}) for cad_id, value in proposals.iteritems(): cad = cad_dict.get(int(cad_id)) if not cad: # looks like CAD was removed continue if value["attribute_object"]: attribute_object_id = value["attribute_object"]["id"] else: attribute_object_id = None cav = cav_dict.get(cad.id) any_cav_applied = True if cav: cav.attribute_value = value["attribute_value"] cav.attribute_object_id = attribute_object_id else: cav = all_models.CustomAttributeValue( custom_attribute=cad, attributable=instance, attribute_value=value["attribute_value"], attribute_object_id=attribute_object_id, ) instance.custom_attribute_values.append(cav) return any_cav_applied
def _create(cls, target_class, *args, **kwargs): """Create instance of model""" acls = kwargs.pop("access_control_list_", []) cavs = kwargs.pop("custom_attribute_values_", []) instance = target_class(**kwargs) db.session.add(instance) db.session.flush() if acls and isinstance(instance, roleable.Roleable): for acl in acls: db.session.add( all_models.AccessControlList( object=instance, ac_role_id=acl.get("ac_role_id"), person_id=acl.get("person_id"), )) for cav in cavs: if isinstance(instance, all_models.mixins.CustomAttributable): db.session.add( all_models.CustomAttributeValue( attributable=instance, attribute_value=cav.get("attribute_value"), attribute_object_id=cav.get("attribute_object_id"), custom_attribute_id=cav.get("custom_attribute_id"), )) elif isinstance(instance, all_models.mixins.ExternalCustomAttributable): db.session.add( all_models.ExternalCustomAttributeValue( attributable=instance, attribute_value=cav.get("attribute_value"), custom_attribute_id=cav.get("custom_attribute_id"), )) if isinstance(instance, (all_models.CustomAttributeValue, all_models.ExternalCustomAttributeValue)): cls._log_event(instance.attributable) if hasattr(instance, "log_json"): cls._log_event(instance) if getattr(db.session, "single_commit", True): db.session.commit() return instance