task.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. from flask import request, current_app, abort
  9. from walle.api.api import SecurityResource
  10. from walle.form.task import TaskForm
  11. from walle.model.task import TaskModel
  12. from walle.service.extensions import permission
  13. from walle.service.rbac.role import *
  14. class TaskAPI(SecurityResource):
  15. actions = ['audit', 'reject', 'rollback']
  16. def get(self, task_id=None):
  17. """
  18. fetch project list or one item
  19. /project/<int:project_id>
  20. :return:
  21. """
  22. super(TaskAPI, self).get()
  23. return self.item(task_id) if task_id else self.list()
  24. def list(self):
  25. """
  26. fetch project list
  27. :return:
  28. """
  29. page = int(request.args.get('page', 0))
  30. page = page - 1 if page else 0
  31. size = int(request.args.get('size', 10))
  32. kw = request.values.get('kw', '')
  33. user_id = request.values.get('user_id', '')
  34. user_id = user_id.split(',') if user_id else []
  35. task_list, count = TaskModel().list(page=page, size=size, kw=kw, space_id=self.space_id, user_id=user_id)
  36. return self.list_json(list=task_list, count=count, enable_create=permission.role_upper_reporter() and current_user.role != SUPER)
  37. def item(self, task_id):
  38. """
  39. 获取某个用户组
  40. :param id:
  41. :return:
  42. """
  43. task_model = TaskModel(id=task_id)
  44. task_info = task_model.item()
  45. if not task_info:
  46. return self.render_json(code=-1)
  47. return self.render_json(data=task_info)
  48. def post(self):
  49. """
  50. create a task
  51. /task/
  52. :return:
  53. """
  54. super(TaskAPI, self).post()
  55. form = TaskForm(request.form, csrf=False)
  56. if form.validate_on_submit():
  57. task_new = TaskModel()
  58. data = form.form2dict()
  59. task_new_info = task_new.add(data)
  60. if not task_new_info:
  61. return self.render_json(code=-1)
  62. return self.render_json(data=task_new_info)
  63. else:
  64. return self.render_error(code=Code.form_error, message=form.errors)
  65. def put(self, task_id, action=None):
  66. """
  67. update task
  68. /task/<int:id>
  69. :return:
  70. """
  71. super(TaskAPI, self).put()
  72. if action:
  73. if action in self.actions:
  74. self_action = getattr(self, action.lower(), None)
  75. return self_action(task_id=task_id)
  76. else:
  77. abort(404)
  78. else:
  79. return self.update(task_id=task_id)
  80. def update(self, task_id):
  81. form = TaskForm(request.form, csrf=False)
  82. form.set_id(task_id)
  83. if form.validate_on_submit():
  84. task = TaskModel().get_by_id(task_id)
  85. data = form.form2dict()
  86. # a new type to update a model
  87. ret = task.update(data)
  88. return self.render_json(data=task.item())
  89. else:
  90. return self.render_error(code=Code.form_error, message=form.errors)
  91. def delete(self, task_id):
  92. """
  93. remove an task
  94. /task/<int:id>
  95. :return:
  96. """
  97. super(TaskAPI, self).delete()
  98. task_model = TaskModel(id=task_id)
  99. task_model.remove(task_id)
  100. return self.render_json(message='')
  101. def audit(self, task_id):
  102. """
  103. 审核任务
  104. :param task_id:
  105. :return:
  106. """
  107. task = TaskModel().get_by_id(task_id)
  108. ret = task.update({'status': TaskModel.status_pass})
  109. return self.render_json(data=task.item(task_id))
  110. def reject(self, task_id):
  111. """
  112. 审核任务
  113. :param task_id:
  114. :return:
  115. """
  116. task = TaskModel().get_by_id(task_id)
  117. ret = task.update({'status': TaskModel.status_reject})
  118. return self.render_json(data=task.item(task_id))
  119. def rollback(self, task_id):
  120. """
  121. 回滚任务
  122. :param task_id:
  123. :return:
  124. """
  125. task = TaskModel.get_by_id(task_id).to_dict()
  126. filters = {
  127. TaskModel.link_id == task['ex_link_id'],
  128. TaskModel.id < task_id,
  129. }
  130. ex_task = TaskModel().query.filter(*filters).first()
  131. if not ex_task:
  132. raise WalleError(code=Code.rollback_error)
  133. task['id'] = None
  134. task['name'] = task['name'] + '-回滚此次上线'
  135. task['link_id'] = task['ex_link_id']
  136. task['ex_link_id'] = ''
  137. task['is_rollback'] = 1
  138. task['status'] = TaskModel.task_default_status(task['project_id'])
  139. # rewrite commit/tag/branch
  140. ex_task = ex_task.to_dict()
  141. task['commit_id'] = ex_task['commit_id']
  142. task['branch'] = ex_task['branch']
  143. task['tag'] = ex_task['tag']
  144. task_new = TaskModel()
  145. task_new_info = task_new.add(dict(task))
  146. return self.render_json(data=task_new_info)