fix docker-compose

This commit is contained in:
2025-10-03 17:33:09 +03:00
parent ceb8e87939
commit 27249be467
13 changed files with 193 additions and 68 deletions

View File

@@ -1,16 +1,16 @@
from aiogram_dialog import Dialog, Window
from aiogram_dialog.widgets.kbd import Back, Cancel, Column, Select
from aiogram_dialog.widgets.text import Const, Format, Jinja
from aiogram_dialog.widgets.kbd import Back, Button, Cancel, Column, Select
from aiogram_dialog.widgets.text import Case, Const, Format, Jinja
from app.bot.dialogs.templates import event_template
from .getters import event_getter, events_list_getter
from .handlers import on_event_selected
from .getters import event_getter, events_list_getter, registration_getter
from .handlers import change_registration, on_event_selected
from .states import EventsSG
events_dialog = Dialog(
Window(
Const("События"),
Const("Мероприятия"),
Column(
Cancel(Const("Назад")),
Select(
@@ -26,8 +26,16 @@ events_dialog = Dialog(
),
Window(
Jinja(event_template),
Button(
Case(
[Const("зарегистрироваться"), Const("отменить регистрацию")],
selector="is_registered_to_event",
),
id="change_registration_btn",
on_click=change_registration,
),
Back(Const("Назад")),
getter=event_getter,
getter=[event_getter, registration_getter],
parse_mode="HTML",
state=EventsSG.event,
),

View File

@@ -1,7 +1,12 @@
from aiogram.types import User
from aiogram_dialog import DialogManager
from app.infrastructure.database.crud import get_event_by_id, get_events_list
from app.infrastructure.database.crud import (
get_event_by_id,
get_events_list,
)
from app.infrastructure.database.enums import UserEventStatus
from app.infrastructure.database.models import Event
async def events_list_getter(
@@ -11,12 +16,21 @@ async def events_list_getter(
return {"events": [{"title": event.title, "id": event.id} for event in events]}
async def event_getter(
dialog_manager: DialogManager, **kwargs
) -> dict[str, str]:
async def event_getter(dialog_manager: DialogManager, **kwargs) -> dict[str, Event]:
return {
"event_obj": await get_event_by_id(
dialog_manager.middleware_data["session"],
int(dialog_manager.dialog_data["selected_event"]),
dialog_manager.dialog_data["selected_event"],
)
}
async def registration_getter(dialog_manager: DialogManager, **kwargs):
user = dialog_manager.middleware_data["user"]
event_id = dialog_manager.dialog_data["selected_event"]
return {
"is_registered_to_event": any(
(ue.event_id == event_id) and (ue.status != UserEventStatus.CANCELLED.value)
for ue in user.events
)
}

View File

@@ -1,6 +1,13 @@
from aiogram.types import CallbackQuery
from aiogram_dialog import DialogManager
from aiogram_dialog.widgets.kbd import Select
from aiogram_dialog.widgets.kbd import Button, Select
from app.infrastructure.database.crud import (
register_user_to_event,
unregister_user_to_event,
)
from .getters import registration_getter
async def on_event_selected(
@@ -9,5 +16,26 @@ async def on_event_selected(
manager: DialogManager,
item_id: str,
):
manager.dialog_data["selected_event"] = item_id
manager.dialog_data["selected_event"] = int(item_id)
await manager.next()
async def change_registration(
callback: CallbackQuery,
widget: Button,
manager: DialogManager,
**kwargs,
):
user = manager.middleware_data["user"]
event_id = manager.dialog_data["selected_event"]
if (await registration_getter(manager))["is_registered_to_event"]:
await unregister_user_to_event(
manager.middleware_data["session"], user.id, event_id
)
else:
if not user.phone:
await callback.answer("Пожалуйста, заполните ваш номер телефона в профиле", show_alert=True)
else:
await register_user_to_event(
manager.middleware_data["session"], user.id, event_id
)

View File

@@ -12,9 +12,9 @@ from .states import StartSG
start_dialog = Dialog(
Window(
Format("Привет, {user.fullname}"),
Start(Const("📃 события"), id="events", state=EventsSG.events_list),
Start(Const("📃 мероприятия"), id="events", state=EventsSG.events_list),
Start(
Const("✏️ создать событие"),
Const("✏️ создать мероприятие"),
id="create_event",
state=NewEventSG.input_title,
when="is_admin",

View File

@@ -20,7 +20,7 @@ class GetUserMiddleware(BaseMiddleware):
user = await create_user(
session,
tg_user.id,
tg_user.username,
tg_user.full_name,
)
data["user"] = user
return await handler(event, data)

View File

@@ -2,12 +2,16 @@ from datetime import datetime
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
from .models import Event, User
from .enums import UserEventStatus
from .models import Event, User, UserEvent
async def get_user_by_tg_id(session: AsyncSession, user_tg_id: int) -> User | None:
result = await session.execute(select(User).where(User.tg_id == user_tg_id))
result = await session.execute(
select(User).options(selectinload(User.events)).where(User.tg_id == user_tg_id)
)
return result.scalar_one_or_none()
@@ -94,4 +98,33 @@ async def update_event(
if end_date:
event.end_date = end_date
await session.commit()
return event
return event
async def register_user_to_event(session: AsyncSession, user_id: int, event_id: int):
user_event = (
await session.execute(
select(UserEvent).where(
(UserEvent.user_id == user_id) & (UserEvent.event_id == event_id)
)
)
).scalar_one_or_none()
if user_event is None:
user_event = UserEvent(user_id=user_id, event_id=event_id)
session.add(user_event)
await session.flush()
if user_event.status == UserEventStatus.CANCELLED.value:
user_event.status = UserEventStatus.NOT_CONFIRMED.value
await session.commit()
async def unregister_user_to_event(session: AsyncSession, user_id: int, event_id: int):
user_event = (
await session.execute(
select(UserEvent).where(
(UserEvent.user_id == user_id) & (UserEvent.event_id == event_id)
)
)
).scalar_one()
user_event.status = UserEventStatus.CANCELLED.value
await session.commit()

View File

@@ -7,7 +7,7 @@ class UserRole(Enum):
TEACHER = "teacher"
class EventUserStatus(Enum):
class UserEventStatus(Enum):
NOT_CONFIRMED = "not confirmed"
CONFIRMED = "confirmed"
CANCELLED = "cancelled"

View File

@@ -3,7 +3,7 @@ import datetime as dt
from sqlalchemy import BigInteger, DateTime, ForeignKey, UniqueConstraint, func
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
from .enums import EventUserStatus, UserRole
from .enums import UserEventStatus, UserRole
class Base(DeclarativeBase):
@@ -45,7 +45,7 @@ class UserEvent(Base):
date: Mapped[dt.datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now()
)
status: Mapped[str] = mapped_column(default=EventUserStatus.NOT_CONFIRMED.value)
status: Mapped[str] = mapped_column(default=UserEventStatus.NOT_CONFIRMED.value)
user_rel = relationship("User", back_populates="events")
event_rel = relationship("Event", back_populates="user_events")