Files

79 lines
2.8 KiB
Python

# - *- coding: utf- 8 - *-
from sqlalchemy import Boolean, Integer, String
from sqlalchemy import update as sqlalchemy_update
from sqlalchemy.dialects.sqlite import insert
from sqlalchemy.orm import Mapped, mapped_column
from tgbot.database.core import Base, session_scope
from tgbot.database.repository import BaseRepository
# Модель настроек бота
class SettingsModel(Base):
__tablename__ = "storage_settings"
id: Mapped[int] = mapped_column(Integer, primary_key=True, default=1)
status_work: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
status_notify: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
misc_message: Mapped[str] = mapped_column(String(4096), nullable=True, default=None)
misc_message_media: Mapped[str] = mapped_column(
String(255), nullable=True, default=None
)
misc_finl_text: Mapped[str] = mapped_column(
String(255), nullable=True, default=None
)
misc_finl_link: Mapped[str] = mapped_column(
String(255), nullable=True, default=None
)
# Интервал напоминаний в часах: 0 = выключены, допустимые значения: 5, 12, 24
remind_interval: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
ModelBase = SettingsModel
BaseModel = SettingsModel
# Репозиторий настроек бота
class SettingsRepository(BaseRepository[SettingsModel]):
def __init__(self):
super().__init__()
self.table_model = SettingsModel
self.storage_name = SettingsModel.__tablename__
# Создание строки настроек если их еще нет
async def ensure_default(self) -> None:
statement = insert(SettingsModel).values(id=1, status_work=False)
statement = statement.on_conflict_do_nothing(index_elements=[SettingsModel.id])
async with session_scope() as session:
await session.execute(statement)
# Настройки должны быть всегда, поэтому при пустой таблице создаем дефолт
async def get(self) -> SettingsModel:
settings = await super().get(id=1)
if settings is None:
await self.ensure_default()
settings = await super().get(id=1)
if settings is None:
raise RuntimeError("Настройки бота по умолчанию не сохранились")
return settings
# Обновление единственной строки настроек
async def update(self, **kwargs) -> None:
if not kwargs:
return
async with session_scope() as session:
await session.execute(
sqlalchemy_update(SettingsModel)
.where(SettingsModel.id == 1)
.values(**kwargs)
)