user_model.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. from datetime import datetime
  2. from cryptography.fernet import Fernet
  3. from sqlalchemy import Column, Integer, String, Table, ForeignKey, DateTime
  4. from sqlalchemy.orm import relationship, backref
  5. from app.config.config import settings
  6. from app.models.base_model import Base
  7. user_organization_table = Table('user_organization',Base.metadata
  8. , Column('user_id', Integer, ForeignKey('user.id', ondelete='CASCADE'))
  9. , Column('organization_id', String(36), ForeignKey('organization.id', ondelete='CASCADE')))
  10. user_role_table = Table('user_role', Base.metadata
  11. , Column('user_id', Integer, ForeignKey('user.id', ondelete='CASCADE'))
  12. , Column('role_id', String(36), ForeignKey('role.id', ondelete='CASCADE')))
  13. user_group_table = Table('user_group', Base.metadata
  14. , Column('user_id', Integer, ForeignKey('user.id', ondelete='CASCADE'))
  15. , Column('group_id', Integer, ForeignKey('group.id', ondelete='CASCADE')))
  16. cipher_suite = Fernet(settings.PASSWORD_KEY.encode("utf-8"))
  17. class UserModel(Base):
  18. __tablename__ = "user"
  19. id = Column(Integer, primary_key=True, index=True)
  20. username = Column(String(255), unique=True, index=True)
  21. hashed_password = Column(String(255))
  22. password = Column(String(255))
  23. compellation = Column(String(255), nullable=False, default="")
  24. phone = Column(String(255), nullable=False, default="")
  25. email = Column(String(255), nullable=False, default="")
  26. description = Column(String(255), nullable=False, default="")
  27. ragflow_id = Column(String(32))
  28. bisheng_id = Column(Integer)
  29. login_name = Column(String(100))
  30. status = Column(String(10), nullable=False, default="1")
  31. creator = Column(String(36))
  32. sex = Column(String(1))
  33. permission = Column(String(16), nullable=False, default="general")
  34. age = Column(Integer)
  35. created_at = Column(DateTime, default=datetime.now())
  36. updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now())
  37. organizations = relationship('OrganizationModel',
  38. secondary=user_organization_table,
  39. backref=backref('users', lazy='dynamic'))
  40. roles = relationship('RoleModel',
  41. secondary=user_role_table,
  42. backref=backref('users', lazy='dynamic'))
  43. groups = relationship('GroupModel',
  44. secondary=user_group_table,
  45. backref=backref('users', lazy='dynamic'))
  46. def have_permission(self, url):
  47. permissions = []
  48. for resource in self.resources:
  49. permissions.extend(resource)
  50. if filter(lambda x: x.URL == url, permissions):
  51. return True
  52. permissions = []
  53. for organization in self.organizations:
  54. permissions.extend([resource for resource in organization.resources])
  55. return filter(lambda x: x.NAME == url, permissions)
  56. def __repr__(self):
  57. return '<User %r>\n' % (self.NAME)
  58. def to_dict(self):
  59. return {
  60. 'userId': self.id,
  61. 'userName': self.username,
  62. 'loginName': self.login_name if self.login_name else "",
  63. 'status': self.status,
  64. }
  65. def to_json(self):
  66. json = {
  67. 'userId': self.id,
  68. 'createTime': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  69. 'updateTime': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  70. 'userName': self.username,
  71. 'loginName': self.login_name,
  72. 'sex': self.sex,
  73. 'age': self.age,
  74. "status": self.status,
  75. 'phone': self.phone,
  76. 'email': self.email,
  77. # 'phoneNumber': self.phone_number
  78. }
  79. if len(self.organizations) > 0:
  80. json['dept'] = [organization.to_json() for organization in self.organizations]
  81. json['groups'] = [group.to_dict() for group in self.groups]
  82. roles = []
  83. # if len(self.roles) > 0:
  84. roles = [role.to_json() for role in self.roles]
  85. organization_roles = [role.to_json() for organization in self.organizations for role in
  86. organization.roles]
  87. for role in organization_roles:
  88. if role not in roles:
  89. roles.append(role)
  90. json['roles'] = roles
  91. return json
  92. def to_login_json(self):
  93. json = {
  94. 'userId': self.id,
  95. 'createTime': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  96. 'updateTime': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  97. 'userName': self.username,
  98. 'loginName': self.login_name,
  99. 'sex': self.sex,
  100. 'age': self.age,
  101. "status": self.status,
  102. 'phone': self.phone,
  103. 'email': self.email,
  104. # 'phoneNumber': self.phone_number
  105. }
  106. parent_dict = {}
  107. children_dict = {}
  108. for role in self.roles:
  109. for r in role.to_json().get("resources", []):
  110. if r["menuType"] != "1":
  111. parent_dict[r["menuId"]] = r
  112. else:
  113. if r["parentId"] in children_dict:
  114. children_dict[r["parentId"]].append(r)
  115. else:
  116. children_dict[r["parentId"]] = [r]
  117. organization_roles = [role.to_json() for organization in self.organizations for role in
  118. organization.roles]
  119. for role in organization_roles:
  120. for r in role.to_json().get("resources", []):
  121. if r["menuType"] != "1":
  122. parent_dict[r["menuId"]] = r
  123. else:
  124. if r["parentId"] in children_dict:
  125. children_dict[r["parentId"]].append(r)
  126. else:
  127. children_dict[r["parentId"]] = [r]
  128. resources = []
  129. for resource in parent_dict.values():
  130. resource["children"] = children_dict.get(resource["menuId"], [])
  131. resources.append(resource)
  132. json['resources'] = resources
  133. return json
  134. def get_children(self):
  135. """递归获取指定用户的子用户ID列表"""
  136. users = UserModel.query.filter_by(CREATOR=self.ID).all()
  137. user_id_list = [user.ID for user in users]
  138. for user in users:
  139. user_id_list.extend(user.get_children())
  140. return user_id_list
  141. def encrypted_password(self, password):
  142. return cipher_suite.encrypt(password.encode("utf-8")).decode("utf-8")
  143. def decrypted_password(self):
  144. return cipher_suite.decrypt(self.password).decode("utf-8")