config.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from public import db
  2. from flask import Blueprint, abort
  3. from libs.tools import json_response, JsonParser, Argument
  4. from apps.configuration.models import ConfigKey, ConfigValue, Service
  5. from apps.deploy.models import App
  6. from libs.decorators import require_permission
  7. blueprint = Blueprint(__name__, __name__)
  8. def type_id_to_model_instance(owner_type, owner_id):
  9. if owner_type == 'ser':
  10. return Service.query.get_or_404(owner_id)
  11. elif owner_type == 'app':
  12. return App.query.get_or_404(owner_id)
  13. else:
  14. abort(404)
  15. def first_config_key(owner_type, owner_id, form):
  16. where = ConfigKey.query.filter_by(owner_type=owner_type, owner_id=owner_id, name=form.name)
  17. # 私有个公共属性之间不能相同
  18. if form.type in ['private', 'public']:
  19. where.filter(ConfigKey.type.in_(('private', 'public')))
  20. # 系统属性和服务配置不与自身已有的相同
  21. else:
  22. where.filter_by(type=form.type)
  23. return where.first()
  24. @blueprint.route('/<int:owner_id>', methods=['GET'])
  25. @require_permission('config_service_cfg_view | config_app_cfg_view')
  26. def get(owner_id):
  27. form, error = JsonParser(
  28. Argument('owner_type', filter=lambda x: x in ['app', 'ser']),
  29. Argument('cfg_type', required=False)
  30. ).parse()
  31. if error is None:
  32. result = []
  33. keys = ConfigKey.query.filter_by(owner_id=owner_id, owner_type=form.owner_type)
  34. if form.cfg_type:
  35. keys = keys.filter_by(type=form.cfg_type).all()[:]
  36. else:
  37. keys = keys.filter(ConfigKey.type != 'system').all()[:]
  38. values = ConfigValue.query.filter(ConfigValue.key_id.in_([x.id for x in keys])).all() if keys else []
  39. for key in [x.to_json() for x in keys]:
  40. key['value'] = {}
  41. for val in values:
  42. if val.key_id == key['id']:
  43. key['value'][val.env_id] = val.value
  44. result.append(key)
  45. return json_response(result)
  46. return json_response(message=error)
  47. @blueprint.route('/<int:owner_id>', methods=['POST'])
  48. @require_permission('config_service_cfg_add | config_app_cfg_add')
  49. def post(owner_id):
  50. form, error = JsonParser(
  51. Argument('type', default='', filter=lambda x: x in ['private', 'public']),
  52. 'owner_type', 'short_name', 'desc', 'value').parse()
  53. if error is None:
  54. owner = type_id_to_model_instance(form.owner_type, owner_id)
  55. form.owner_id = owner_id
  56. if form.type in ['private']:
  57. form.name = form.pop('short_name').upper()
  58. else:
  59. form.name = (owner.identify + '_' + form.pop('short_name')).upper()
  60. if first_config_key(form.owner_type, owner_id, form):
  61. return json_response(message='重复的变量名称!')
  62. values = form.pop('value')
  63. config = ConfigKey(**form).save()
  64. for k, v in values.items():
  65. ConfigValue(key_id=config.id, env_id=k, value=v).add()
  66. db.session.commit()
  67. return json_response(message=error)
  68. @blueprint.route('/<int:cfg_id>', methods=['PUT'])
  69. @require_permission('config_service_cfg_edit | config_app_cfg_edit')
  70. def put(cfg_id):
  71. form, error = JsonParser(
  72. Argument('type', default='', filter=lambda x: x in ['private', 'public']),
  73. 'short_name', 'desc', 'value').parse()
  74. if error is None:
  75. config_key = ConfigKey.query.get_or_404(cfg_id)
  76. owner = type_id_to_model_instance(config_key.owner_type, config_key.owner_id)
  77. if form.type in ['private']:
  78. form.name = form.pop('short_name').upper()
  79. else:
  80. form.name = (owner.identify + '_' + form.pop('short_name')).upper()
  81. exists_key = first_config_key(config_key.owner_type, config_key.owner_id, form)
  82. if exists_key and exists_key.id != cfg_id:
  83. return json_response(message='重复的变量名称!')
  84. for env_id, value in form.pop('value').items():
  85. config_value = ConfigValue.query.filter_by(env_id=env_id, key_id=config_key.id).first()
  86. if config_value:
  87. config_value.update(value=value)
  88. else:
  89. ConfigValue(key_id=config_key.id, env_id=env_id, value=value).save()
  90. config_key.update(**form)
  91. return json_response()
  92. return json_response(message=error)
  93. @blueprint.route('/<int:cfg_id>', methods=['DELETE'])
  94. @require_permission('config_service_cfg_del | config_app_cfg_del')
  95. def delete(cfg_id):
  96. config = ConfigKey.query.get_or_404(cfg_id)
  97. config.delete()
  98. return json_response()