98 lines
3.1 KiB
Python
98 lines
3.1 KiB
Python
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey
|
|
from sqlalchemy.orm import relationship, declarative_base
|
|
|
|
from .database import session
|
|
|
|
Base = declarative_base()
|
|
|
|
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() |