Exemple #1
0
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)
Exemple #2
0
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
Exemple #3
0
    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