project.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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_enabled=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_enabled=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. # TODO login for group id
  122. group_model = MemberModel(project_id=project_id)
  123. ret = group_model.update_project(project_id=project_id, members=members)
  124. item, count, user_ids = group_model.members()
  125. return self.render_json(data=item)
  126. def copy(self, project_id):
  127. """
  128. :param project_id:
  129. :return:
  130. """
  131. project = ProjectModel.get_by_id(project_id).to_dict()
  132. project['id'] = None
  133. project['name'] = project['name'] + '-copy'
  134. project_new = ProjectModel()
  135. project_new_info = project_new.add(dict(project))
  136. return self.render_json(data=project_new_info)
  137. def detection(self, project_id):
  138. """
  139. :param project_id:
  140. :return:
  141. """
  142. # walle LOCAL_SERVER_USER => walle user
  143. # show ssh_rsa.pub
  144. # LOCAL_SERVER_USER => git
  145. # LOCAL_SERVER_USER => target_servers
  146. # webroot is directory
  147. # remote release directory
  148. errors = Deployer(project_id=project_id).project_detection()
  149. return self.render_json(data=errors)