menu.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from flask import Blueprint
  2. from public import db
  3. from libs.tools import json_response, JsonParser, Argument, AttrDict
  4. from apps.deploy.models import App, DeployMenu, AppMenuRel
  5. from libs.decorators import require_permission
  6. blueprint = Blueprint(__name__, __name__)
  7. args = AttrDict(
  8. name=Argument('name', help='请输入菜单名称'),
  9. desc=Argument('desc', help='请输入菜单描述'),
  10. posistion=Argument('position', type=int, filter=lambda x: x in (1, 2), help='请输入合法的展示位置'),
  11. display_type=Argument('display_type', type=int, filter=lambda x: x in (1, 2), help='请输入合法的展示方式'),
  12. command=Argument('command', help='请输入执行的内容'),
  13. required_args=Argument('required_args', type=bool),
  14. required_confirm=Argument('required_confirm', type=bool)
  15. )
  16. @blueprint.route('/', methods=['GET'])
  17. @require_permission('publish_menu_view')
  18. def get():
  19. menus = DeployMenu.query.filter(DeployMenu.app_id.is_(None)).all()
  20. return json_response(menus)
  21. @blueprint.route('/', methods=['POST'])
  22. @require_permission('publish_menu_add')
  23. def post():
  24. form, error = JsonParser(*args.values()).parse()
  25. if error is None:
  26. DeployMenu(**form).save()
  27. return json_response(message=error)
  28. @blueprint.route('/<int:menu_id>', methods=['PUT'])
  29. @require_permission('publish_menu_edit')
  30. def put(menu_id):
  31. form, error = JsonParser(*args.values()).parse()
  32. if error is None:
  33. menu = DeployMenu.query.get_or_404(menu_id)
  34. menu.update(**form)
  35. return json_response(message=error)
  36. @blueprint.route('/<int:menu_id>', methods=['DELETE'])
  37. @require_permission('publish_menu_del')
  38. def delete(menu_id):
  39. menu = DeployMenu.query.get_or_404(menu_id)
  40. rel = AppMenuRel.query.filter_by(menu_id=menu_id).first()
  41. if rel:
  42. rel_app = App.query.get_or_404(rel.app_id)
  43. return json_response(message='应用 <%s> 使用了该菜单,请解除关联后再尝试删除该菜单!' % rel_app.name)
  44. menu.delete()
  45. return json_response()
  46. @blueprint.route('/<int:menu_id>/apps', methods=['GET'])
  47. @require_permission('publish_menu_rel_view')
  48. def fetch_apps(menu_id):
  49. field = DeployMenu.query.get_or_404(menu_id)
  50. return json_response(field.apps)
  51. @blueprint.route('/<int:menu_id>/bind/apps', methods=['POST'])
  52. @require_permission('publish_menu_rel_edit')
  53. def bind_apps(menu_id):
  54. form, error = JsonParser(Argument('app_ids', type=list)).parse()
  55. if error is None:
  56. old_relationships = AppMenuRel.query.filter_by(menu_id=menu_id).all()[:]
  57. for app_id in form.app_ids:
  58. rel = AppMenuRel(menu_id=menu_id, app_id=app_id)
  59. if rel in old_relationships:
  60. old_relationships.remove(rel)
  61. else:
  62. rel.add()
  63. for old_rel in old_relationships:
  64. old_rel.delete(commit=False)
  65. db.session.commit()
  66. return json_response(message=error)