project.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. # -*- coding: utf-8 -*-
  2. """
  3. walle-web
  4. :copyright: © 2015-2017 walle-web.io
  5. :created time: 2017-03-25 11:15:01
  6. :author: wushuiyong@walle-web.io
  7. """
  8. import json
  9. from flask import request, abort
  10. from walle.api.api import SecurityResource
  11. from walle.form.project import ProjectForm
  12. from walle.model.member import MemberModel
  13. from walle.model.project import ProjectModel
  14. from walle.service.extensions import permission
  15. from walle.service.rbac.role import *
  16. from walle.service.deployer import Deployer
  17. class ProjectAPI(SecurityResource):
  18. actions = ['members', 'copy', 'detection']
  19. @permission.upper_reporter
  20. def get(self, action=None, project_id=None):
  21. """
  22. fetch project list or one item
  23. /project/<int:project_id>
  24. :return:
  25. """
  26. super(ProjectAPI, self).get()
  27. return self.item(project_id) if project_id else self.list()
  28. def list(self):
  29. """
  30. fetch project list
  31. :return:
  32. """
  33. page = int(request.args.get('page', 0))
  34. page = page - 1 if page else 0
  35. size = int(request.args.get('size', 10))
  36. kw = request.values.get('kw', '')
  37. environment_id = request.values.get('environment_id', '')
  38. project_model = ProjectModel()
  39. project_list, count = project_model.list(page=page, size=size, kw=kw, environment_id=environment_id,
  40. space_id=self.space_id)
  41. return self.list_json(list=project_list, count=count,
  42. enable_create=permission.role_upper_master() and current_user.role != SUPER)
  43. def item(self, project_id):
  44. """
  45. 获取某个用户组
  46. :param id:
  47. :return:
  48. """
  49. project_model = ProjectModel(id=project_id)
  50. current_app.logger.info(project_id)
  51. project_info = project_model.item(id=project_id)
  52. current_app.logger.info(project_info)
  53. if not project_info:
  54. return self.render_json(code=-1)
  55. project_info['members'], count, project_info['user_uids'] = MemberModel().members(project_id=project_id)
  56. return self.render_json(data=project_info)
  57. @permission.upper_developer
  58. def post(self, action=None, project_id=None):
  59. """
  60. create a project
  61. /environment/
  62. :return:
  63. """
  64. super(ProjectAPI, self).post()
  65. if action is None:
  66. return self.create()
  67. if action in self.actions:
  68. self_action = getattr(self, action.lower(), None)
  69. return self_action(project_id)
  70. else:
  71. abort(404)
  72. def create(self):
  73. form = ProjectForm(request.form, csrf=False)
  74. if form.validate_on_submit():
  75. # add project
  76. project = ProjectModel()
  77. data = form.form2dict()
  78. project_new = project.add(data)
  79. if not project_new:
  80. return self.render_json(code=-1)
  81. return self.render_json(data=project_new)
  82. else:
  83. return self.render_error(code=Code.form_error, message=form.errors)
  84. @permission.upper_developer
  85. def put(self, project_id, action=None):
  86. """
  87. update project
  88. /project/<int:id>
  89. :return:
  90. """
  91. super(ProjectAPI, self).put()
  92. if action and action == 'members':
  93. return self.members(project_id, members=json.loads(request.data))
  94. form = ProjectForm(request.form, csrf=False)
  95. form.set_id(project_id)
  96. if form.validate_on_submit():
  97. server = ProjectModel().get_by_id(project_id)
  98. data = form.form2dict()
  99. # a new type to update a model
  100. ret = server.update(data)
  101. return self.render_json(data=server.item())
  102. else:
  103. return self.render_error(code=Code.form_error, message=form.errors)
  104. @permission.upper_developer
  105. def delete(self, project_id):
  106. """
  107. remove an project
  108. /project/<int:id>
  109. :return:
  110. """
  111. super(ProjectAPI, self).delete()
  112. project_model = ProjectModel(id=project_id)
  113. project_model.remove(project_id)
  114. return self.render_json(message='')
  115. def members(self, project_id, members):
  116. """
  117. :param project_id:
  118. :param members:
  119. :return:
  120. """
  121. group_model = MemberModel(project_id=project_id)
  122. ret = group_model.update_project(project_id=project_id, members=members)
  123. item, count, user_ids = group_model.members()
  124. return self.render_json(data=item)
  125. def copy(self, project_id):
  126. """
  127. :param project_id:
  128. :return:
  129. """
  130. project = ProjectModel.get_by_id(project_id).to_dict()
  131. project['id'] = None
  132. project['name'] = project['name'] + '-copy'
  133. project_new = ProjectModel()
  134. project_new_info = project_new.add(dict(project))
  135. return self.render_json(data=project_new_info)
  136. def detection(self, project_id):
  137. """
  138. :param project_id:
  139. :return:
  140. """
  141. # walle LOCAL_SERVER_USER => walle user
  142. # show ssh_rsa.pub
  143. # LOCAL_SERVER_USER => git
  144. # LOCAL_SERVER_USER => target_servers
  145. # webroot is directory
  146. # remote release directory
  147. errors = Deployer(project_id=project_id).project_detection()
  148. message = ''
  149. if not errors:
  150. message = '配置检测通过,恭喜:)开始你的上线之旅吧'
  151. return self.render_json(data=errors, message=message)