# -*- coding:utf-8 -*- from flask import jsonify from flask import request from flask import Blueprint from flask import abort from flask import current_app from lib.attribute import AttributeManager from lib.ci_type import CITypeAttributeManager from lib.decorator import argument_required from lib.exception import InvalidUsageError from lib.auth import auth_with_key attribute = Blueprint("attribute", __name__) @attribute.route("", methods=["GET"]) def get_attributes(): q = request.values.get("q") attrs = AttributeManager().get_attributes(name=q) count = len(attrs) return jsonify(numfound=count, attributes=attrs) @attribute.route("/", methods=["GET"]) @attribute.route("/", methods=["GET"]) def get_attribute(attr_name=None, attr_id=None): attr_manager = AttributeManager() attr_dict = None if attr_name is not None: attr_dict = attr_manager.get_attribute_by_name(attr_name) if attr_dict is None: attr_dict = attr_manager.get_attribute_by_alias(attr_name) elif attr_id is not None: attr_dict = attr_manager.get_attribute_by_id(attr_id) if attr_dict is not None: return jsonify(attribute=attr_dict) abort(404, "attribute not found") @attribute.route("", methods=["POST"]) @auth_with_key def create_attribute(): with argument_required("attr_name"): attr_name = request.values.get("attr_name") current_app.logger.info(attr_name) attr_alias = request.values.get("attr_alias", attr_name) choice_value = request.values.get("choice_value") is_multivalue = request.values.get("is_multivalue", False) is_uniq = request.values.get("is_uniq", False) is_index = request.values.get("is_index", False) value_type = request.values.get("value_type", "text") try: is_multivalue = int(is_multivalue) is_uniq = int(is_uniq) is_index = int(is_index) except ValueError: raise InvalidUsageError("argument format is error") attr_manager = AttributeManager() kwargs = {"choice_value": choice_value, "is_multivalue": is_multivalue, "is_uniq": is_uniq, "value_type": value_type, "is_index": is_index} ret, res = attr_manager.add(attr_name, attr_alias, **kwargs) if not ret: return abort(500, res) return jsonify(attr_id=res) @attribute.route("/", methods=["PUT"]) @auth_with_key def update_attribute(attr_id=None): with argument_required("attr_name"): attr_name = request.values.get("attr_name") attr_alias = request.values.get("attr_alias", attr_name) choice_value = request.values.get("choice_value") is_multivalue = request.values.get("is_multivalue", False) is_uniq = request.values.get("is_uniq", False) value_type = request.values.get("value_type", "text") try: is_multivalue = int(is_multivalue) is_uniq = int(is_uniq) except ValueError: raise InvalidUsageError("argument format is error") attr_manager = AttributeManager() kwargs = {"choice_value": choice_value, "is_multivalue": is_multivalue, "is_uniq": is_uniq, "value_type": value_type} ret, res = attr_manager.update(attr_id, attr_name, attr_alias, **kwargs) if not ret: return abort(500, res) return jsonify(attr_id=res) @attribute.route("/", methods=["DELETE"]) @auth_with_key def delete_attribute(attr_id=None): attr_manager = AttributeManager() res = attr_manager.delete(attr_id) return jsonify(message="attribute {0} deleted".format(res)) @attribute.route("/citype/", methods=["GET"]) def get_attributes_by_type(type_id=None): manager = CITypeAttributeManager() from models.cmdb import CITypeCache, CIAttributeCache t = CITypeCache.get(type_id) if not t: return abort(400, "CIType {0} is not existed".format(type_id)) uniq_id = t.uniq_id unique = CIAttributeCache.get(uniq_id).attr_name return jsonify(attributes=manager.get_attributes_by_type_id(type_id), type_id=type_id, uniq_id=uniq_id, unique=unique) @attribute.route("/citype/", methods=["POST"]) @auth_with_key def create_attributes_to_citype(type_id=None): with argument_required("attr_id"): attr_ids = request.values.get("attr_id", "") is_required = request.values.get("is_required", False) attr_id_list = attr_ids.strip().split(",") if "" in attr_id_list: attr_id_list.remove("") attr_id_list = map(int, attr_id_list) try: is_required = int(is_required) except ValueError: abort(500, "argument format is error") manager = CITypeAttributeManager() manager.add(type_id, attr_id_list, is_required=is_required) return jsonify(attributes=attr_id_list) @attribute.route("/citype/", methods=["DELETE"]) @auth_with_key def delete_attribute_in_type(type_id=None): with argument_required("attr_id"): attr_ids = request.values.get("attr_id", "") attr_id_list = attr_ids.strip().split(",") manager = CITypeAttributeManager() manager.delete(type_id, attr_id_list) return jsonify(attributes=attr_id_list)