project.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. # -*- coding: utf-8 -*-
  2. """
  3. walle-web
  4. :copyright: © 2015-2019 walle-web.io
  5. :created time: 2018-11-24 07:12:13
  6. :author: wushuiyong@walle-web.io
  7. """
  8. from datetime import datetime
  9. from sqlalchemy import String, Integer, Text, DateTime
  10. from walle import model
  11. from walle.model.database import SurrogatePK, db, Model
  12. from walle.model.user import UserModel
  13. from walle.service.extensions import permission
  14. from walle.service.rbac.role import *
  15. # 项目配置表
  16. class ProjectModel(SurrogatePK, Model):
  17. # 表的名字:
  18. __tablename__ = 'projects'
  19. current_time = datetime.now()
  20. status_close = 0
  21. status_open = 1
  22. task_audit_true = 1
  23. task_audit_false = 0
  24. # 表的结构:
  25. id = db.Column(Integer, primary_key=True, autoincrement=True)
  26. user_id = db.Column(Integer)
  27. name = db.Column(String(100))
  28. environment_id = db.Column(Integer)
  29. space_id = db.Column(Integer)
  30. status = db.Column(Integer)
  31. master = db.Column(String(100))
  32. version = db.Column(String(40))
  33. excludes = db.Column(Text)
  34. is_include = db.Column(Integer)
  35. target_root = db.Column(String(200))
  36. target_releases = db.Column(String(200))
  37. server_ids = db.Column(Text)
  38. task_vars = db.Column(Text)
  39. prev_deploy = db.Column(Text)
  40. post_deploy = db.Column(Text)
  41. prev_release = db.Column(Text)
  42. post_release = db.Column(Text)
  43. keep_version_num = db.Column(Integer)
  44. repo_url = db.Column(String(200))
  45. repo_username = db.Column(String(50))
  46. repo_password = db.Column(String(50))
  47. repo_mode = db.Column(String(50))
  48. repo_type = db.Column(String(10))
  49. notice_type = db.Column(String(10))
  50. notice_hook = db.Column(Text)
  51. task_audit = db.Column(Integer)
  52. created_at = db.Column(DateTime, default=current_time)
  53. updated_at = db.Column(DateTime, default=current_time, onupdate=current_time)
  54. def list(self, page=0, size=10, kw=None, space_id=None, environment_id=None):
  55. """
  56. 获取分页列表
  57. :param page:
  58. :param size:
  59. :return:
  60. """
  61. query = self.query.filter(ProjectModel.status.notin_([self.status_remove]))
  62. if kw:
  63. query = query.filter(ProjectModel.name.like('%' + kw + '%'))
  64. # 关联 environments
  65. EnvironmentModel = model.environment.EnvironmentModel
  66. query = query.join(EnvironmentModel, EnvironmentModel.id == ProjectModel.environment_id)
  67. query = query.filter(EnvironmentModel.status.notin_([self.status_remove]))
  68. # 关联 spaces
  69. SpaceModel = model.space.SpaceModel
  70. query = query.join(SpaceModel, SpaceModel.id == ProjectModel.space_id)
  71. query = query.filter(SpaceModel.status.notin_([self.status_remove]))
  72. if environment_id:
  73. query = query.filter(ProjectModel.environment_id == environment_id)
  74. if space_id:
  75. query = query.filter(ProjectModel.space_id == space_id)
  76. query = query.add_columns(EnvironmentModel.name, SpaceModel.name)
  77. count = query.count()
  78. data = query.order_by(ProjectModel.id.desc()).offset(int(size) * int(page)).limit(size).all()
  79. project_list = []
  80. for p in data:
  81. item = p[0].to_json()
  82. item['environment_name'] = p[1]
  83. item['space_name'] = p[2]
  84. project_list.append(item)
  85. return project_list, count
  86. def item(self, id=None):
  87. """
  88. 获取单条记录
  89. :param role_id:
  90. :return:
  91. """
  92. id = id if id else self.id
  93. data = self.query.filter(ProjectModel.status.notin_([self.status_remove])).filter_by(id=id).first()
  94. if not data:
  95. return []
  96. project_info = data.to_json()
  97. ServerModel = model.server.ServerModel
  98. server_ids = project_info['server_ids']
  99. project_info['servers_info'] = ServerModel.fetch_by_id(list(map(int, server_ids.split(','))))
  100. return project_info
  101. def add(self, *args, **kwargs):
  102. data = dict(*args)
  103. project = ProjectModel(**data)
  104. db.session.add(project)
  105. db.session.commit()
  106. return project.to_json()
  107. def update(self, *args, **kwargs):
  108. update_data = dict(*args)
  109. return super(ProjectModel, self).update(**update_data)
  110. def remove(self, role_id=None):
  111. """
  112. :param role_id:
  113. :return:
  114. """
  115. role_id = role_id if role_id else self.id
  116. ProjectModel.query.filter_by(id=role_id).update({'status': self.status_remove})
  117. ret = db.session.commit()
  118. return ret
  119. def to_json(self):
  120. item = {
  121. 'id': self.id,
  122. 'user_id': self.user_id,
  123. 'name': self.name,
  124. 'environment_id': self.environment_id,
  125. 'space_id': self.space_id,
  126. 'status': self.status,
  127. 'master': UserModel.fetch_by_uid(self.master.split(',')) if self.master else '',
  128. 'version': self.version,
  129. 'excludes': self.excludes,
  130. 'is_include': self.is_include,
  131. 'target_root': self.target_root,
  132. 'target_releases': self.target_releases,
  133. 'server_ids': self.server_ids,
  134. 'task_vars': self.task_vars,
  135. 'prev_deploy': self.prev_deploy,
  136. 'post_deploy': self.post_deploy,
  137. 'prev_release': self.prev_release,
  138. 'post_release': self.post_release,
  139. 'keep_version_num': self.keep_version_num,
  140. 'repo_url': self.repo_url,
  141. 'repo_username': self.repo_username,
  142. 'repo_password': self.repo_password,
  143. 'repo_mode': self.repo_mode,
  144. 'repo_type': self.repo_type,
  145. 'notice_type': self.notice_type,
  146. 'notice_hook': self.notice_hook,
  147. 'task_audit': self.task_audit,
  148. 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
  149. 'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S'),
  150. }
  151. item.update(self.enable())
  152. return item
  153. def enable(self):
  154. return {
  155. 'enable_view': True,
  156. 'enable_update': permission.role_upper_developer(),
  157. 'enable_delete': permission.enable_uid(self.user_id) or permission.role_upper_developer(),
  158. 'enable_create': False,
  159. 'enable_online': False,
  160. 'enable_audit': False,
  161. 'enable_block': False,
  162. }