user_model.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. from datetime import datetime
  2. from cryptography.fernet import Fernet
  3. from sqlalchemy import Column, Integer, String, Table, ForeignKey, DateTime, UniqueConstraint
  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), default="")
  24. phone = Column(String(255), default="")
  25. email = Column(String(255), default="")
  26. description = Column(String(255), default="")
  27. ragflow_id = Column(String(32))
  28. bisheng_id = Column(Integer)
  29. login_name = Column(String(100))
  30. status = Column(String(10), default="1")
  31. creator = Column(String(36))
  32. sex = Column(String(1))
  33. permission = Column(String(16), 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. 'email': self.email,
  65. 'phone': self.phone,
  66. 'permission':self.permission
  67. }
  68. def to_json(self):
  69. json = {
  70. 'userId': self.id,
  71. 'createTime': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  72. 'updateTime': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  73. 'userName': self.username,
  74. 'loginName': self.login_name,
  75. 'sex': self.sex,
  76. 'age': self.age,
  77. "status": self.status,
  78. 'phone': self.phone,
  79. 'email': self.email,
  80. # 'phoneNumber': self.phone_number
  81. }
  82. if len(self.organizations) > 0:
  83. json['dept'] = [organization.to_json() for organization in self.organizations]
  84. json['groups'] = [group.to_dict() for group in self.groups]
  85. roles = []
  86. # if len(self.roles) > 0:
  87. roles = [role.to_json() for role in self.roles]
  88. organization_roles = [role.to_json() for organization in self.organizations for role in
  89. organization.roles]
  90. for role in organization_roles:
  91. if role not in roles:
  92. roles.append(role)
  93. json['roles'] = roles
  94. return json
  95. def to_login_json(self):
  96. json = {
  97. 'userId': self.id,
  98. 'createTime': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  99. 'updateTime': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  100. 'userName': self.username,
  101. 'loginName': self.login_name,
  102. 'sex': self.sex,
  103. 'age': self.age,
  104. "status": self.status,
  105. 'phone': self.phone,
  106. 'email': self.email,
  107. # 'phoneNumber': self.phone_number
  108. }
  109. parent_dict = {}
  110. children_dict = {}
  111. for role in self.roles:
  112. for r in role.to_json().get("resources", []):
  113. if r["menuType"] != "1":
  114. parent_dict[r["menuId"]] = r
  115. else:
  116. if r["parentId"] in children_dict:
  117. children_dict[r["parentId"]].append(r)
  118. else:
  119. children_dict[r["parentId"]] = [r]
  120. organization_roles = [role.to_json() for organization in self.organizations for role in
  121. organization.roles]
  122. for role in organization_roles:
  123. for r in role.to_json().get("resources", []):
  124. if r["menuType"] != "1":
  125. parent_dict[r["menuId"]] = r
  126. else:
  127. if r["parentId"] in children_dict:
  128. children_dict[r["parentId"]].append(r)
  129. else:
  130. children_dict[r["parentId"]] = [r]
  131. resources = []
  132. for resource in parent_dict.values():
  133. resource["children"] = children_dict.get(resource["menuId"], [])
  134. resources.append(resource)
  135. json['resources'] = resources
  136. return json
  137. def get_children(self):
  138. """递归获取指定用户的子用户ID列表"""
  139. users = UserModel.query.filter_by(CREATOR=self.ID).all()
  140. user_id_list = [user.ID for user in users]
  141. for user in users:
  142. user_id_list.extend(user.get_children())
  143. return user_id_list
  144. def encrypted_password(self, password):
  145. return cipher_suite.encrypt(password.encode("utf-8")).decode("utf-8")
  146. def decrypted_password(self):
  147. return cipher_suite.decrypt(self.password).decode("utf-8")
  148. class UserAppModel(Base):
  149. __tablename__ = "user_app"
  150. __table_args__ = (UniqueConstraint('user_id', 'app_type', name='user_app_id_ix'),)
  151. id = Column(Integer, primary_key=True, index=True)
  152. username = Column(String(255))
  153. password = Column(String(255))
  154. email = Column(String(255), default="")
  155. user_id = Column(Integer)
  156. app_id = Column(String(36))
  157. app_type = Column(String(16))
  158. status = Column(String(10), default="1")
  159. access_token = Column(String(1000))
  160. refresh_token = Column(String(1000))
  161. token_at = Column(DateTime, default=datetime.now())
  162. created_at = Column(DateTime, default=datetime.now())
  163. updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now())
  164. def to_json(self):
  165. return {
  166. 'id': self.id,
  167. 'userName': self.username,
  168. 'createTime': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  169. 'updateTime': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  170. 'password': self.password,
  171. 'email': self.email,
  172. 'user_id': self.user_id,
  173. 'app_id': self.app_id,
  174. "app_type": self.app_type,
  175. 'status': self.status,
  176. }