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