connect database
This commit is contained in:
@@ -7,19 +7,25 @@ from aiogram_dialog import setup_dialogs
|
||||
|
||||
from app.bot.dialogs.flows import dialogs_router
|
||||
from app.bot.handlers.commands import commands_router
|
||||
from app.bot.middlewares import GetUserMiddleware
|
||||
from app.bot.middlewares import DbSessionMiddleware, GetUserMiddleware
|
||||
from config.config import settings
|
||||
|
||||
bot = Bot(token=settings.bot_token, default=DefaultBotProperties(parse_mode=ParseMode.MARKDOWN_V2))
|
||||
bot = Bot(
|
||||
token=settings.bot_token,
|
||||
default=DefaultBotProperties(parse_mode=ParseMode.MARKDOWN_V2),
|
||||
)
|
||||
dp = Dispatcher()
|
||||
|
||||
|
||||
async def main():
|
||||
setup_dialogs(dp)
|
||||
|
||||
dp.update.outer_middleware(DbSessionMiddleware())
|
||||
dp.update.outer_middleware(GetUserMiddleware())
|
||||
|
||||
dp.include_router(commands_router)
|
||||
dp.include_router(dialogs_router)
|
||||
|
||||
dp.update.outer_middleware(GetUserMiddleware())
|
||||
await dp.start_polling(bot)
|
||||
|
||||
|
||||
|
||||
@@ -1,23 +1,39 @@
|
||||
from aiogram_dialog import Dialog, Window
|
||||
from aiogram_dialog.widgets.kbd import Column, Select
|
||||
from aiogram_dialog.widgets.kbd import Back, Cancel, Column, Select
|
||||
from aiogram_dialog.widgets.text import Const, Format
|
||||
|
||||
from .getters import events_getter
|
||||
from .states import EventsSG
|
||||
|
||||
|
||||
async def on_event_selected(
|
||||
c,
|
||||
widget: Select,
|
||||
manager,
|
||||
item_id: str,
|
||||
):
|
||||
manager.dialog_data["selected_event"] = item_id
|
||||
await manager.next()
|
||||
|
||||
events_dialog = Dialog(
|
||||
Window(
|
||||
Const("События"),
|
||||
Column(
|
||||
Cancel(Const("Назад")),
|
||||
Select(
|
||||
Format("{item}"),
|
||||
id="categ",
|
||||
item_id_getter=lambda x: x,
|
||||
items="events",
|
||||
)
|
||||
on_click=on_event_selected,
|
||||
),
|
||||
),
|
||||
getter=events_getter,
|
||||
state=EventsSG.events_list,
|
||||
),
|
||||
# Window(state=EventsSG.event),
|
||||
Window(
|
||||
Format("{dialog_data[selected_event]}"),
|
||||
Back(Const("Назад")),
|
||||
state=EventsSG.event,
|
||||
),
|
||||
)
|
||||
|
||||
@@ -3,13 +3,15 @@ from aiogram_dialog.widgets.input import TextInput
|
||||
from aiogram_dialog.widgets.kbd import Cancel, SwitchTo
|
||||
from aiogram_dialog.widgets.text import Const, Format
|
||||
|
||||
from app.bot.dialogs.widgets.getters import user_getter
|
||||
|
||||
from .states import ProfileSG
|
||||
|
||||
profile_dialog = Dialog(
|
||||
Window(
|
||||
Const("*Профиль*"),
|
||||
Format("Имя:"),
|
||||
Format("Телефон:"),
|
||||
Format("Имя: {user.fullname}"),
|
||||
Format("Телефон: {user.phone}"),
|
||||
SwitchTo(
|
||||
Const("изменить имя"),
|
||||
id="change_name",
|
||||
@@ -22,6 +24,7 @@ profile_dialog = Dialog(
|
||||
),
|
||||
Cancel(Const("назад")),
|
||||
state=ProfileSG.profile,
|
||||
getter=user_getter,
|
||||
),
|
||||
Window(
|
||||
Const("Введите имя"),
|
||||
|
||||
@@ -4,17 +4,17 @@ from aiogram_dialog.widgets.text import Const, Format
|
||||
|
||||
from app.bot.dialogs.flows.events.dialogs import EventsSG
|
||||
from app.bot.dialogs.flows.profile.dialogs import ProfileSG
|
||||
from app.bot.dialogs.widgets.getters import is_admin, username_getter
|
||||
from app.bot.dialogs.widgets.getters import is_admin_getter, user_getter
|
||||
|
||||
from .states import StartSG
|
||||
|
||||
start_dialog = Dialog(
|
||||
Window(
|
||||
Format("Привет, {username}"),
|
||||
Format("Привет, {user.fullname}"),
|
||||
Start(Const("события"), id="events", state=EventsSG.events_list),
|
||||
Button(Const("создать событие"), id="create_event", when="is_admin"),
|
||||
Start(Const("профиль"), id="profile", state=ProfileSG.profile),
|
||||
getter=[username_getter, is_admin],
|
||||
getter=[user_getter, is_admin_getter],
|
||||
state=StartSG.start,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
from aiogram.types import User
|
||||
from aiogram_dialog import DialogManager
|
||||
|
||||
from app.infrastructure.database.models import User as UserModel
|
||||
|
||||
async def username_getter(
|
||||
dialog_manager: DialogManager, event_from_user: User, **kwargs
|
||||
) -> dict[str, str]:
|
||||
return {"username": event_from_user.username}
|
||||
|
||||
async def is_admin(
|
||||
dialog_manager: DialogManager, event_from_user: User, **kwargs
|
||||
async def user_getter(
|
||||
dialog_manager: DialogManager, event_from_user: User, user: UserModel, **kwargs
|
||||
) -> dict[str, str]:
|
||||
return {"is_admin": False}
|
||||
return {"user": user}
|
||||
|
||||
|
||||
async def is_admin_getter(
|
||||
dialog_manager: DialogManager, event_from_user: User, user: UserModel, **kwargs
|
||||
) -> dict[str, str]:
|
||||
return {"is_admin": user.role == "admin"}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from .database import DbSessionMiddleware
|
||||
from .get_user import GetUserMiddleware
|
||||
|
||||
__all__ = ["GetUserMiddleware"]
|
||||
__all__ = ["DbSessionMiddleware", "GetUserMiddleware"]
|
||||
|
||||
18
app/bot/middlewares/database.py
Normal file
18
app/bot/middlewares/database.py
Normal file
@@ -0,0 +1,18 @@
|
||||
from typing import Any, Awaitable, Callable
|
||||
|
||||
from aiogram import BaseMiddleware
|
||||
from aiogram.types import Update
|
||||
|
||||
from app.infrastructure.database import get_session
|
||||
|
||||
|
||||
class DbSessionMiddleware(BaseMiddleware):
|
||||
async def __call__(
|
||||
self,
|
||||
handler: Callable[[Update, dict[str, Any]], Awaitable[Any]],
|
||||
event: Update,
|
||||
data: dict[str, Any],
|
||||
):
|
||||
async with get_session() as session:
|
||||
data["session"] = session
|
||||
return await handler(event, data)
|
||||
@@ -1,7 +1,9 @@
|
||||
from typing import Any, Awaitable, Callable
|
||||
|
||||
from aiogram import BaseMiddleware
|
||||
from aiogram.types import Update
|
||||
from aiogram.types import Update, User
|
||||
|
||||
from app.infrastructure.database.crud import create_user, get_user_by_tg_id
|
||||
|
||||
|
||||
class GetUserMiddleware(BaseMiddleware):
|
||||
@@ -11,5 +13,14 @@ class GetUserMiddleware(BaseMiddleware):
|
||||
event: Update,
|
||||
data: dict[str, Any],
|
||||
):
|
||||
data.update(user={"is_admin": False})
|
||||
return await handler(event, data)
|
||||
session = data["session"]
|
||||
tg_user: User = data.get("event_from_user")
|
||||
user = await get_user_by_tg_id(session, tg_user.id)
|
||||
if user is None:
|
||||
user = await create_user(
|
||||
session,
|
||||
tg_user.id,
|
||||
tg_user.username,
|
||||
)
|
||||
data["user"] = user
|
||||
return await handler(event, data)
|
||||
|
||||
Reference in New Issue
Block a user