project.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import time
  2. import uuid
  3. from typing import List
  4. from app import models, schemas
  5. from sqlalchemy.orm import Session
  6. from itsdangerous import BadSignature, SignatureExpired
  7. from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
  8. from constants.constants import SECRET_KEY
  9. # 生成新的project_token
  10. def generate_item_token(project: models.Project):
  11. s = Serializer(SECRET_KEY)
  12. return s.dumps({'project_id': project.id,'type':project.type}).decode('utf-8')
  13. # 验证Token方法
  14. def verify_item_token(db: Session, token: str):
  15. s = Serializer(SECRET_KEY)
  16. try:
  17. data = s.loads(token)
  18. except SignatureExpired:
  19. raise Exception("item_token验证失败")
  20. except BadSignature:
  21. raise Exception("item_token验证失败")
  22. project: models.Project = db.query(models.Project).filter(models.Project.id == data['project_id']).first()
  23. return project
  24. def create_project(db: Session, item: schemas.ProjectCreate):
  25. # 创建项目
  26. check_1 = db.query(models.Project).filter(models.Project.name == item.name).first()
  27. if check_1:
  28. raise Exception('项目名重复')
  29. project_code = str(uuid.uuid1()).replace('-','')
  30. db_item = models.Project(**{
  31. 'name': item.name,
  32. 'code': project_code,
  33. 'type': 1,
  34. 'create_time': int(time.time())
  35. })
  36. db.add(db_item)
  37. db.commit()
  38. db.refresh(db_item)
  39. project_dict = db_item.to_dict()
  40. # 创建超级管理员与项目的关系
  41. relation = models.ProjectUserRelation(**{
  42. 'user_id': item.user_id,
  43. 'project_id': db_item.id,
  44. 'role_id': 1,
  45. })
  46. db.add(relation)
  47. db.commit()
  48. db.refresh(relation)
  49. return project_dict
  50. def update_project(db: Session,item: schemas.ProjectUpdate):
  51. db_item: models.Project = db.query(models.Project).filter(models.Project.id == item.project_id).first()
  52. if not db_item:
  53. raise Exception('项目不存在')
  54. db_item.name = item.name
  55. db.commit()
  56. db.flush()
  57. db.refresh(db_item)
  58. return db_item
  59. def get_project_info(db: Session, id: int):
  60. project: models.Project = db.query(models.Project)\
  61. .filter(models.Project.id == id).first()
  62. if not project:
  63. raise Exception('该项目不存在')
  64. project_token = generate_item_token(project)
  65. item = project.to_dict()
  66. item.update({'project_token': project_token})
  67. return item
  68. def switch_project_by_user(db: Session,project_id: int,user_id: int):
  69. project: models.Project = db.query(models.Project)\
  70. .filter(models.Project.id == id).first()
  71. relation: models.ProjectUserRelation = db.query(models.ProjectUserRelation)\
  72. .filter(models.ProjectUserRelation.project_id == project_id)\
  73. .filter(models.ProjectUserRelation.user_id == user_id).first()
  74. role: models.Roles = db.query(models.Roles)\
  75. .filter(models.Roles.id == relation.role_id).first()
  76. project_token = generate_item_token(project)
  77. item = project.to_dict()
  78. item.update({
  79. 'project_token': project_token,
  80. 'role_id': role.id,
  81. 'role_name': role.name,
  82. 'role_code': role.code,
  83. })
  84. return item
  85. def get_project_list(db: Session, user_id: int):
  86. relations = get_relations_by_user(db, user_id)
  87. project_ids = [ r.project_id for r in relations ]
  88. projects: List[models.Project] = db.query(models.Project)\
  89. .filter(models.Project.id.in_(project_ids)).all()
  90. res = []
  91. for project in projects:
  92. project_token = generate_item_token(project)
  93. item = project.to_dict()
  94. item.update({'project_token': project_token})
  95. res.append(item)
  96. return res
  97. def get_relations_by_user(db: Session, user_id: int):
  98. relations: List[models.ProjectUserRelation] = db.query(models.ProjectUserRelation)\
  99. .filter(models.ProjectUserRelation.user_id == user_id).all()
  100. return relations
  101. def get_relations_by_project(db: Session, project_id: int):
  102. relations: List[models.ProjectUserRelation] = db.query(models.ProjectUserRelation)\
  103. .filter(models.ProjectUserRelation.project_id == project_id).all()
  104. return relations