project.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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. class ProjectAPI(SecurityResource):
  17. actions = ['members', 'copy']
  18. @permission.upper_reporter
  19. def get(self, action=None, project_id=None):
  20. """
  21. fetch project list or one item
  22. /project/<int:project_id>
  23. :return:
  24. """
  25. super(ProjectAPI, self).get()
  26. return self.item(project_id) if project_id else self.list()
  27. def list(self):
  28. """
  29. fetch project list
  30. :return:
  31. """
  32. page = int(request.args.get('page', 0))
  33. page = page - 1 if page else 0
  34. size = int(request.args.get('size', 10))
  35. kw = request.values.get('kw', '')
  36. environment_id = request.values.get('environment_id', '')
  37. project_model = ProjectModel()
  38. project_list, count = project_model.list(page=page, size=size, kw=kw, environment_id=environment_id,
  39. space_id=self.space_id)
  40. return self.list_json(list=project_list, count=count,
  41. enable_create=permission.role_upper_master() and current_user.role != SUPER)
  42. def item(self, project_id):
  43. """
  44. 获取某个用户组
  45. :param id:
  46. :return:
  47. """
  48. project_model = ProjectModel(id=project_id)
  49. current_app.logger.info(project_id)
  50. project_info = project_model.item(id=project_id)
  51. current_app.logger.info(project_info)
  52. if not project_info:
  53. return self.render_json(code=-1)
  54. project_info['members'], count, project_info['user_uids'] = MemberModel().members(project_id=project_id)
  55. return self.render_json(data=project_info)
  56. @permission.upper_developer
  57. def post(self, action=None, project_id=None):
  58. """
  59. create a project
  60. /environment/
  61. :return:
  62. """
  63. super(ProjectAPI, self).post()
  64. if action is None:
  65. return self.create()
  66. if action in self.actions:
  67. self_action = getattr(self, action.lower(), None)
  68. return self_action(project_id)
  69. else:
  70. abort(404)
  71. def create(self):
  72. form = ProjectForm(request.form, csrf_enabled=False)
  73. if form.validate_on_submit():
  74. # add project
  75. project = ProjectModel()
  76. data = form.form2dict()
  77. project_new = project.add(data)
  78. if not project_new:
  79. return self.render_json(code=-1)
  80. return self.render_json(data=project_new)
  81. else:
  82. return self.render_error(code=Code.form_error, message=form.errors)
  83. @permission.upper_developer
  84. def put(self, project_id, action=None):
  85. """
  86. update project
  87. /project/<int:id>
  88. :return:
  89. """
  90. super(ProjectAPI, self).put()
  91. if action and action == 'members':
  92. return self.members(project_id, members=json.loads(request.data))
  93. form = ProjectForm(request.form, csrf_enabled=False)
  94. form.set_id(project_id)
  95. if form.validate_on_submit():
  96. server = ProjectModel().get_by_id(project_id)
  97. data = form.form2dict()
  98. # a new type to update a model
  99. ret = server.update(data)
  100. return self.render_json(data=server.item())
  101. else:
  102. return self.render_error(code=Code.form_error, message=form.errors)
  103. @permission.upper_developer
  104. def delete(self, project_id):
  105. """
  106. remove an project
  107. /project/<int:id>
  108. :return:
  109. """
  110. super(ProjectAPI, self).delete()
  111. project_model = ProjectModel(id=project_id)
  112. project_model.remove(project_id)
  113. return self.render_json(message='')
  114. def members(self, project_id, members):
  115. """
  116. :param project_id:
  117. :param members:
  118. :return:
  119. """
  120. # TODO login for group id
  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)