user_model.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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. sync_flag = Column(String(36))
  36. created_at = Column(DateTime, default=datetime.now())
  37. updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now())
  38. organizations = relationship('OrganizationModel',
  39. secondary=user_organization_table,
  40. backref=backref('users', lazy='dynamic'))
  41. roles = relationship('RoleModel',
  42. secondary=user_role_table,
  43. backref=backref('users', lazy='dynamic'))
  44. groups = relationship('GroupModel',
  45. secondary=user_group_table,
  46. backref=backref('users', lazy='dynamic'))
  47. def have_permission(self, url):
  48. permissions = []
  49. for resource in self.resources:
  50. permissions.extend(resource)
  51. if filter(lambda x: x.URL == url, permissions):
  52. return True
  53. permissions = []
  54. for organization in self.organizations:
  55. permissions.extend([resource for resource in organization.resources])
  56. return filter(lambda x: x.NAME == url, permissions)
  57. def __repr__(self):
  58. return '<User %r>\n' % (self.NAME)
  59. def to_dict(self):
  60. return {
  61. 'userId': self.id,
  62. 'userName': self.username,
  63. 'loginName': self.login_name if self.login_name else "",
  64. 'status': self.status,
  65. 'email': self.email,
  66. 'phone': self.phone,
  67. 'permission':self.permission
  68. }
  69. def to_json(self):
  70. json = {
  71. 'userId': self.id,
  72. 'createTime': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  73. 'updateTime': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  74. 'userName': self.username,
  75. 'loginName': self.login_name,
  76. 'sex': self.sex,
  77. 'age': self.age,
  78. "status": self.status,
  79. 'phone': self.phone,
  80. 'email': self.email,
  81. # 'phoneNumber': self.phone_number
  82. }
  83. # json['dept'] = [organization.to_json() for organization in self.organizations]
  84. json['groups'] = [group.to_dict() for group in self.groups]
  85. # if len(self.roles) > 0:
  86. roles = {role.id: role.to_dict() for role in self.roles}
  87. # ogt_set = set()
  88. # for ogt in self.organizations:
  89. # if ogt.id in ogt_set:
  90. # continue
  91. # print(ogt.id)
  92. # ogt_set.add(ogt.id)
  93. # for role in ogt.roles:
  94. # roles[role.id] = role.to_dict()
  95. # parent_ogt = ogt.parent
  96. # while parent_ogt:
  97. # if parent_ogt.id not in ogt_set:
  98. # ogt_set.add(ogt.id)
  99. # for role in parent_ogt.roles:
  100. # roles[role.id] = role.to_dict()
  101. # parent_ogt = parent_ogt.parent
  102. # else:
  103. # break
  104. json['roles'] = list(roles.values())
  105. json['depts'] = [i.to_base_json() for i in self.organizations]
  106. return json
  107. def to_login_json(self):
  108. json = {
  109. 'userId': self.id,
  110. 'createTime': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  111. 'updateTime': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  112. 'userName': self.username,
  113. 'loginName': self.login_name,
  114. 'sex': self.sex,
  115. 'age': self.age,
  116. "status": self.status,
  117. 'phone': self.phone,
  118. 'email': self.email,
  119. # 'phoneNumber': self.phone_number
  120. }
  121. parent_dict = {}
  122. children_dict = {}
  123. for role in self.roles:
  124. for r in role.to_json().get("resources", []):
  125. if r["menuType"] != "1":
  126. parent_dict[r["menuId"]] = r
  127. else:
  128. if r["parentId"] in children_dict:
  129. children_dict[r["parentId"]].append(r)
  130. else:
  131. children_dict[r["parentId"]] = [r]
  132. organization_roles = [role.to_json() for organization in self.organizations for role in
  133. organization.roles]
  134. for role in organization_roles:
  135. for r in role.to_json().get("resources", []):
  136. if r["menuType"] != "1":
  137. parent_dict[r["menuId"]] = r
  138. else:
  139. if r["parentId"] in children_dict:
  140. children_dict[r["parentId"]].append(r)
  141. else:
  142. children_dict[r["parentId"]] = [r]
  143. resources = []
  144. for resource in parent_dict.values():
  145. resource["children"] = children_dict.get(resource["menuId"], [])
  146. resources.append(resource)
  147. json['resources'] = resources
  148. return json
  149. def get_children(self):
  150. """递归获取指定用户的子用户ID列表"""
  151. users = UserModel.query.filter_by(CREATOR=self.ID).all()
  152. user_id_list = [user.ID for user in users]
  153. for user in users:
  154. user_id_list.extend(user.get_children())
  155. return user_id_list
  156. def encrypted_password(self, password):
  157. return cipher_suite.encrypt(password.encode("utf-8")).decode("utf-8")
  158. def decrypted_password(self):
  159. return cipher_suite.decrypt(self.password).decode("utf-8")
  160. class UserAppModel(Base):
  161. __tablename__ = "user_app"
  162. __table_args__ = (UniqueConstraint('user_id', 'app_type', name='user_app_id_ix'),)
  163. id = Column(Integer, primary_key=True, index=True)
  164. username = Column(String(255))
  165. password = Column(String(255))
  166. email = Column(String(255), default="")
  167. user_id = Column(Integer)
  168. app_id = Column(String(36))
  169. app_type = Column(String(16))
  170. status = Column(String(10), default="1")
  171. access_token = Column(String(1000))
  172. refresh_token = Column(String(1000))
  173. token_at = Column(DateTime, default=datetime.now())
  174. created_at = Column(DateTime, default=datetime.now())
  175. updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now())
  176. def to_json(self):
  177. return {
  178. 'id': self.id,
  179. 'userName': self.username,
  180. 'createTime': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  181. 'updateTime': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else "",
  182. 'password': self.password,
  183. 'email': self.email,
  184. 'user_id': self.user_id,
  185. 'app_id': self.app_id,
  186. "app_type": self.app_type,
  187. 'status': self.status,
  188. }
  189. @staticmethod
  190. def encrypted_password(password):
  191. return cipher_suite.encrypt(password.encode("utf-8")).decode("utf-8")
  192. @staticmethod
  193. def decrypted_password(password):
  194. return cipher_suite.decrypt(password).decode("utf-8")
  195. class UserTokenModel(Base):
  196. __tablename__ = "user_token"
  197. id = Column(String(16), primary_key=True)
  198. account = Column(String(255))
  199. password = Column(String(255))
  200. access_token = Column(String(1000))
  201. refresh_token = Column(String(1000))
  202. created_at = Column(DateTime, default=datetime.now())
  203. updated_at = Column(DateTime, default=datetime.now())
  204. def to_json(self):
  205. return {
  206. 'id': self.id,
  207. 'account': self.username,
  208. 'createTime': self.created_at,
  209. 'updateTime': self.updated_at,
  210. 'password': self.password,
  211. 'access_token': self.access_token,
  212. 'refresh_token': self.refresh_token,
  213. }