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")