task.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. # -*- coding: utf-8 -*-
  2. """
  3. walle-web
  4. :copyright: © 2015-2019 walle-web.io
  5. :created time: 2018-11-24 06:22:04
  6. :author: wushuiyong@walle-web.io
  7. """
  8. from datetime import datetime
  9. from sqlalchemy import String, Integer, DateTime, Text
  10. from walle import model
  11. from walle.model.database import db, Model, SurrogatePK
  12. from walle.service.extensions import permission
  13. from walle.service.rbac.role import *
  14. # 上线单
  15. class TaskModel(SurrogatePK, Model):
  16. __tablename__ = 'tasks'
  17. current_time = datetime.now()
  18. # 状态:0新建提交,1审核通过,2审核拒绝,3上线中,4上线完成,5上线失败
  19. status_new = 0
  20. status_pass = 1
  21. status_reject = 2
  22. status_doing = 3
  23. status_success = 4
  24. status_fail = 5
  25. status_memo = {
  26. status_new: '新建提交',
  27. status_pass: '审核通过',
  28. status_reject: '审核拒绝',
  29. status_doing: '上线中',
  30. status_success: '上线完成',
  31. status_fail: '上线失败',
  32. }
  33. # 表的结构:
  34. id = db.Column(Integer, primary_key=True, autoincrement=True)
  35. name = db.Column(String(100))
  36. user_id = db.Column(Integer)
  37. user_name = db.Column(String(10))
  38. project_id = db.Column(Integer)
  39. action = db.Column(Integer)
  40. status = db.Column(Integer)
  41. link_id = db.Column(String(100))
  42. ex_link_id = db.Column(String(100))
  43. servers = db.Column(Text)
  44. commit_id = db.Column(String(40))
  45. branch = db.Column(String(100))
  46. tag = db.Column(String(100))
  47. file_transmission_mode = db.Column(Integer)
  48. file_list = db.Column(Text)
  49. enable_rollback = db.Column(Integer)
  50. created_at = db.Column(DateTime, default=current_time)
  51. updated_at = db.Column(DateTime, default=current_time, onupdate=current_time)
  52. taskMdl = None
  53. def table_name(self):
  54. return self.__tablename__
  55. #
  56. # def list(self, page=0, size=10, kw=''):
  57. # data = Task.query.order_by('id').offset(int(size) * int(page)).limit(size).all()
  58. # return [p.to_json() for p in data]
  59. #
  60. # def one(self):
  61. # project_info = Project.query.filter_by(id=self.taskMdl.get('project_id')).one().to_json()
  62. # return dict(project_info, **self.taskMdl)
  63. #
  64. def list(self, page=0, size=10, space_id=None, kw=None):
  65. """
  66. 获取分页列表
  67. :param page:
  68. :param size:
  69. :param kw:
  70. :return:
  71. """
  72. query = TaskModel.query.filter(TaskModel.status.notin_([self.status_remove]))
  73. if kw:
  74. query = query.filter(TaskModel.name.like('%' + kw + '%'))
  75. # 关联 projects
  76. ProjectModel = model.project.ProjectModel
  77. query = query.join(ProjectModel, TaskModel.project_id == ProjectModel.id)
  78. query = query.filter(ProjectModel.status.notin_([self.status_remove]))
  79. # 关联 environments
  80. EnvironmentModel = model.environment.EnvironmentModel
  81. query = query.join(EnvironmentModel, EnvironmentModel.id == ProjectModel.environment_id)
  82. query = query.filter(EnvironmentModel.status.notin_([self.status_remove]))
  83. if space_id:
  84. query = query.filter(ProjectModel.space_id == space_id)
  85. query = query.add_columns(ProjectModel.name, EnvironmentModel.name)
  86. count = query.count()
  87. data = query.order_by(TaskModel.id.desc()) \
  88. .offset(int(size) * int(page)).limit(size) \
  89. .all()
  90. task_list = []
  91. for p in data:
  92. item = p[0].to_json()
  93. item['project_name'] = p[1]
  94. item['environment_name'] = p[2]
  95. task_list.append(item)
  96. return task_list, count
  97. def item(self, id=None):
  98. """
  99. 获取单条记录
  100. :param role_id:
  101. :return:
  102. """
  103. id = id if id else self.id
  104. data = self.query.filter(TaskModel.status.notin_([self.status_remove])).filter_by(id=id).first()
  105. if not data:
  106. return []
  107. task = data.to_json()
  108. ProjectModel = model.project.ProjectModel
  109. project = ProjectModel().item(task['project_id'])
  110. task['project_name'] = project['name'] if project else u'未知项目'
  111. task['project_info'] = project
  112. return task
  113. def add(self, *args, **kwargs):
  114. # todo permission_ids need to be formated and checked
  115. data = dict(*args)
  116. project = TaskModel(**data)
  117. db.session.add(project)
  118. db.session.commit()
  119. if project.id:
  120. self.id = project.id
  121. return project.id
  122. def update(self, *args, **kwargs):
  123. # todo permission_ids need to be formated and checked
  124. # a new type to update a model
  125. update_data = dict(*args)
  126. return super(TaskModel, self).update(**update_data)
  127. def remove(self, id=None):
  128. """
  129. :param role_id:
  130. :return:
  131. """
  132. id = id if id else self.id
  133. self.query.filter_by(id=id).update({'status': self.status_remove})
  134. ret = db.session.commit()
  135. return ret
  136. def to_json(self):
  137. ServerModel = model.server.ServerModel
  138. item = {
  139. 'id': self.id,
  140. 'name': self.name,
  141. 'user_id': int(self.user_id),
  142. 'user_name': self.user_name,
  143. 'project_id': int(self.project_id),
  144. 'project_name': self.project_id if self.project_id else '',
  145. 'action': self.action,
  146. 'status': self.status,
  147. 'link_id': self.link_id,
  148. 'ex_link_id': self.ex_link_id,
  149. 'servers': self.servers,
  150. 'servers_info': ServerModel.fetch_by_id(self.servers.split(',')) if self.servers else '',
  151. 'commit_id': self.commit_id,
  152. 'branch': self.branch,
  153. 'tag': self.tag,
  154. 'file_transmission_mode': self.file_transmission_mode,
  155. 'file_list': self.file_list,
  156. 'enable_rollback': self.enable_rollback,
  157. 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
  158. 'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S'),
  159. }
  160. item.update(self.enable())
  161. return item
  162. def enable(self):
  163. is_project_master = self.project_id in session['project_master']
  164. return {
  165. 'enable_view': True,
  166. 'enable_update': (permission.enable_uid(self.user_id) or permission.role_upper_developer() or is_project_master) and (self.status in [self.status_new, self.status_reject]),
  167. 'enable_delete': (permission.enable_uid(self.user_id) or permission.role_upper_developer() or is_project_master) and (self.status in [self.status_new, self.status_pass, self.status_reject]),
  168. 'enable_create': False,
  169. 'enable_online': (permission.enable_uid(self.user_id) or permission.role_upper_developer() or is_project_master) and (self.status in [self.status_pass, self.status_fail, self.status_doing]),
  170. 'enable_audit': (permission.role_upper_developer() or is_project_master) and (self.status in [self.status_new]),
  171. 'enable_block': False,
  172. }