Update aiogram 3 template

This commit is contained in:
dj
2026-05-29 09:44:39 +03:00
parent e144cb1424
commit 2eced5dc4f
43 changed files with 1877 additions and 1252 deletions
+48 -30
View File
@@ -1,43 +1,61 @@
# - *- coding: utf- 8 - *-
import sqlite3
from sqlalchemy import Boolean, Integer
from sqlalchemy import update as sqlalchemy_update
from sqlalchemy.dialects.sqlite import insert
from sqlalchemy.orm import Mapped, mapped_column
from pydantic import BaseModel
from tgbot.data.config import PATH_DATABASE
from tgbot.database.adb_helper import Databasex, dict_factory, update_format
from tgbot.database.core import Base, session_scope
from tgbot.database.repository import BaseRepository
# Table model
class ModelBase(BaseModel):
status_work: str # Status bot work
# Модель настроек бота
class SettingsModel(Base):
__tablename__ = "storage_settings"
class Config:
json_schema_extra = {
'storage_name': 'storage_settings'
}
id: Mapped[int] = mapped_column(Integer, primary_key=True, default=1)
status_work: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
# Settings
class Settingsx(Databasex[ModelBase]):
ModelBase = SettingsModel
BaseModel = SettingsModel
# Репозиторий настроек бота
class SettingsRepository(BaseRepository[SettingsModel]):
def __init__(self):
super().__init__()
self.table_model = ModelBase
self.storage_name = self.table_model.model_json_schema()['storage_name']
self.column_one = True
self.table_model = SettingsModel
self.storage_name = SettingsModel.__tablename__
# Get entry
def get(self) -> ModelBase:
with sqlite3.connect(PATH_DATABASE) as con:
con.row_factory = dict_factory
sql = f"SELECT * FROM {self.storage_name}"
# Создание строки настроек если их еще нет
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])
return ModelBase(**con.execute(sql).fetchone())
async with session_scope() as session:
await session.execute(statement)
# Edit entry
def update(self, **kwargs):
with sqlite3.connect(PATH_DATABASE) as con:
con.row_factory = dict_factory
sql = f"UPDATE {self.storage_name} SET"
sql, parameters = update_format(sql, kwargs)
# Настройки должны быть всегда, поэтому при пустой таблице создаем дефолт
async def get(self) -> SettingsModel:
settings = await super().get(id=1)
con.execute(sql, parameters)
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)
)