user_model.py 6.4 KB

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