user.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from sqlalchemy import create_engine, Column, Integer, String, MetaData,DateTime,Text,ForeignKey, Table
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy.orm import sessionmaker, relationship
  4. from agent.db.database import Base
  5. from datetime import datetime
  6. # Many-to-many association table for Users and Roles
  7. user_roles = Table('user_roles',
  8. Base.metadata,
  9. Column('user_id', Integer, ForeignKey('users.id'), primary_key=True),
  10. Column('role_id', Integer, ForeignKey('roles.id'), primary_key=True)
  11. )
  12. class User(Base):
  13. __tablename__ = 'users'
  14. id = Column(Integer, primary_key=True)
  15. username = Column(String(32), nullable=False)
  16. full_name = Column(String(64))
  17. email = Column(String(100), nullable=False)
  18. hashed_password = Column(String(64), nullable=True)
  19. status = Column(Integer, default=0)
  20. roles = relationship("Role", secondary=user_roles, back_populates="users")
  21. class Session(Base):
  22. __tablename__ = 'sessions'
  23. id = Column(Integer, primary_key=True)
  24. user_id = Column(Integer, ForeignKey('users.id'))
  25. session_id = Column(String(64), nullable=False)
  26. username = Column(String(32), nullable=False)
  27. full_name = Column(String(64))
  28. created = Column(DateTime, default=datetime.now())
  29. updated = Column(DateTime, default=datetime.now())
  30. # Many-to-many association table for Roles and Permissions
  31. role_permissions = Table('role_permissions',
  32. Base.metadata,
  33. Column('role_id', Integer, ForeignKey('roles.id'), primary_key=True),
  34. Column('permission_id', Integer, ForeignKey('permissions.id'), primary_key=True)
  35. )
  36. class Role(Base):
  37. __tablename__ = 'roles'
  38. id = Column(Integer, primary_key=True, index=True)
  39. name = Column(String(50), unique=True, index=True, nullable=False)
  40. description = Column(String(255))
  41. users = relationship("User", secondary=user_roles, back_populates="roles")
  42. permissions = relationship("Permission", secondary=role_permissions, back_populates="roles")
  43. class Permission(Base):
  44. __tablename__ = 'permissions'
  45. id = Column(Integer, primary_key=True, index=True)
  46. name = Column(String(50), unique=True, index=True, nullable=False) # e.g., "view_dashboard", "edit_settings"
  47. description = Column(String(255))
  48. # For menu items
  49. menu_name = Column(String(50)) # Display name for the menu
  50. menu_route = Column(String(100)) # Frontend route
  51. menu_icon = Column(String(50)) # Icon for the menu
  52. parent_id = Column(Integer, ForeignKey('permissions.id'), nullable=True) # For hierarchical menus
  53. roles = relationship("Role", secondary=role_permissions, back_populates="permissions")
  54. parent = relationship("Permission", remote_side=[id]) # Self-referential relationship for parent menu