project.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. target_user = db.Column(String(50))
  35. target_port = db.Column(String(20))
  36. target_root = db.Column(String(200))
  37. target_releases = db.Column(String(200))
  38. server_ids = db.Column(Text)
  39. task_vars = db.Column(Text)
  40. prev_deploy = db.Column(Text)
  41. post_deploy = db.Column(Text)
  42. prev_release = db.Column(Text)
  43. post_release = db.Column(Text)
  44. keep_version_num = db.Column(Integer)
  45. repo_url = db.Column(String(200))
  46. repo_username = db.Column(String(50))
  47. repo_password = db.Column(String(50))
  48. repo_mode = db.Column(String(50))
  49. repo_type = db.Column(String(10))
  50. notice_type = db.Column(String(10))
  51. notice_hook = db.Column(Text)
  52. task_audit = db.Column(Integer)
  53. created_at = db.Column(DateTime, default=current_time)
  54. updated_at = db.Column(DateTime, default=current_time, onupdate=current_time)
  55. def list(self, page=0, size=10, kw=None, space_id=None, environment_id=None):
  56. """
  57. 获取分页列表
  58. :param page:
  59. :param size:
  60. :return:
  61. """
  62. query = self.query.filter(ProjectModel.status.notin_([self.status_remove]))
  63. if kw:
  64. query = query.filter(ProjectModel.name.like('%' + kw + '%'))
  65. # 关联 environments
  66. EnvironmentModel = model.environment.EnvironmentModel
  67. query = query.join(EnvironmentModel, EnvironmentModel.id == ProjectModel.environment_id)
  68. query = query.filter(EnvironmentModel.status.notin_([self.status_remove]))
  69. # 关联 spaces
  70. SpaceModel = model.space.SpaceModel
  71. query = query.join(SpaceModel, SpaceModel.id == ProjectModel.space_id)
  72. query = query.filter(SpaceModel.status.notin_([self.status_remove]))
  73. if environment_id:
  74. query = query.filter(ProjectModel.environment_id == environment_id)
  75. if space_id:
  76. query = query.filter(ProjectModel.space_id == space_id)
  77. query = query.add_columns(EnvironmentModel.name, SpaceModel.name)
  78. count = query.count()
  79. data = query.order_by(ProjectModel.id.desc()).offset(int(size) * int(page)).limit(size).all()
  80. project_list = []
  81. for p in data:
  82. item = p[0].to_json()
  83. item['environment_name'] = p[1]
  84. item['space_name'] = p[2]
  85. project_list.append(item)
  86. return project_list, count
  87. def item(self, id=None):
  88. """
  89. 获取单条记录
  90. :param role_id:
  91. :return:
  92. """
  93. id = id if id else self.id
  94. data = self.query.filter(ProjectModel.status.notin_([self.status_remove])).filter_by(id=id).first()
  95. if not data:
  96. return []
  97. project_info = data.to_json()
  98. ServerModel = model.server.ServerModel
  99. server_ids = project_info['server_ids']
  100. project_info['servers_info'] = ServerModel.fetch_by_id(map(int, server_ids.split(',')))
  101. return project_info
  102. def add(self, *args, **kwargs):
  103. # todo permission_ids need to be formated and checked
  104. data = dict(*args)
  105. project = ProjectModel(**data)
  106. db.session.add(project)
  107. db.session.commit()
  108. self.id = project.id
  109. return self.id
  110. def update(self, *args, **kwargs):
  111. # todo permission_ids need to be formated and checked
  112. # a new type to update a model
  113. update_data = dict(*args)
  114. return super(ProjectModel, self).update(**update_data)
  115. def remove(self, role_id=None):
  116. """
  117. :param role_id:
  118. :return:
  119. """
  120. role_id = role_id if role_id else self.id
  121. ProjectModel.query.filter_by(id=role_id).update({'status': self.status_remove})
  122. ret = db.session.commit()
  123. return ret
  124. def to_json(self):
  125. item = {
  126. 'id': self.id,
  127. 'user_id': self.user_id,
  128. 'name': self.name,
  129. 'environment_id': self.environment_id,
  130. 'space_id': self.space_id,
  131. 'status': self.status,
  132. 'master': UserModel.fetch_by_uid(self.master.split(',')) if self.master else '',
  133. 'version': self.version,
  134. 'excludes': self.excludes,
  135. 'target_user': self.target_user,
  136. 'target_port': self.target_port,
  137. 'target_root': self.target_root,
  138. 'target_releases': self.target_releases,
  139. 'server_ids': self.server_ids,
  140. 'task_vars': self.task_vars,
  141. 'prev_deploy': self.prev_deploy,
  142. 'post_deploy': self.post_deploy,
  143. 'prev_release': self.prev_release,
  144. 'post_release': self.post_release,
  145. 'keep_version_num': self.keep_version_num,
  146. 'repo_url': self.repo_url,
  147. 'repo_username': self.repo_username,
  148. 'repo_password': self.repo_password,
  149. 'repo_mode': self.repo_mode,
  150. 'repo_type': self.repo_type,
  151. 'notice_type': self.notice_type,
  152. 'notice_hook': self.notice_hook,
  153. 'task_audit': self.task_audit,
  154. 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
  155. 'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S'),
  156. }
  157. item.update(self.enable())
  158. return item
  159. def enable(self):
  160. return {
  161. 'enable_view': True,
  162. 'enable_update': permission.role_upper_developer(),
  163. 'enable_delete': permission.enable_uid(self.user_id) or permission.role_upper_developer(),
  164. 'enable_create': False,
  165. 'enable_online': False,
  166. 'enable_audit': False,
  167. 'enable_block': False,
  168. }