import os from sqlalchemy import Column, String, Integer, Boolean, ForeignKey from sqlalchemy.orm import relationship, declarative_base, sessionmaker from sqlalchemy import create_engine Base = declarative_base() basedir = os.path.abspath(os.path.dirname(__file__)) engine = create_engine('sqlite:///' + os.path.join(basedir, 'db/db.sqlite')) Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() class Permission: USE_COMMANDS = 1 # Пользоваться обычными командами. SEND_LINKS = 2 # Может отправлять ссылки без удаления. MODIFY_QUOTES = 4 # Может добавлять и удалять цитаты. MODERATE = 8 ADMIN = 16 # Может банить юзеров и удалять сообщения. class Quote(Base): __tablename__ = "quotes" id = Column(Integer, primary_key=True) chat_id = Column(Integer, ForeignKey('chats.chat_id')) text = Column(String) def __repr__(self): return f"Quote({self.text=}, {self.chat_id=})" class Chat(Base): __tablename__ = "chats" id = Column(Integer, primary_key=True) chat_id = Column(Integer, unique=True) title = Column(String) # Settings quotes = relationship('Quote', backref='chat', cascade='all, delete') antispam = Column(Boolean) report = Column(Boolean) reminder = Column(Boolean) hidden = Column(Boolean) def __repr__(self): return f'Chat({self.chat_id=}, {self.title=})' class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) tg_id = Column(Integer, unique=True) first_name = Column(String) last_name = Column(String) username = Column(String) permissions = Column(Integer) def __repr__(self): return f'User({self.first_name} {self.last_name} {self.username})' class Role(Base): __tablename__ = 'roles' id = Column(Integer, primary_key=True) name = Column(String(64), unique=True) default = Column(Boolean, default=False, index=True) permissions = Column(Integer) users = relationship('User', backref='role', lazy='dynamic') def add_permission(self, perm): if not self.has_permission(perm): self.permissions += perm def remove_permission(self, perm): if self.has_permission(perm): self.permissions -= perm def reset_permissions(self): self.permissions = 0 def has_permission(self, perm): return self.permissions & perm == perm @staticmethod def insert_roles(): roles = { "User": [Permission.USE_COMMANDS], "Moderator": [Permission.USE_COMMANDS, Permission.SEND_LINKS, Permission.MODIFY_QUOTES, Permission.MODERATE], "Administrator": [Permission.USE_COMMANDS, Permission.SEND_LINKS, Permission.MODIFY_QUOTES, Permission.MODERATE, Permission.ADMIN], } default_role = 'User' for r in roles: role = Role.query.filter_by(name=r).first() if role is None: role = Role(name=r) role.reset_permissions() for perm in roles[r]: role.add_permission(perm) role.default = (role.name == default_role) session.add(role) session.commit()