From 4dc060d8d6f9362978de9668df4c490fec01bba4 Mon Sep 17 00:00:00 2001 From: vrubel Date: Thu, 16 Jul 2026 14:37:34 +0000 Subject: [PATCH] fix: show all events (including weekly recurring) in Telegram bot get_schedule_for_date, show_items_for_deletion, and send_reminders were querying events with Event.date == date_str, which only matches one-off events or a recurring event's anchor date. Recurring events on later occurrences (and any per-date exception overrides) were silently skipped, so /today could show just one event when several were scheduled. Switched all three to materialize_events, already used by the web frontends, which correctly expands recurring events. Co-Authored-By: Claude Sonnet 5 --- backend/telegram_bot.py | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/backend/telegram_bot.py b/backend/telegram_bot.py index ddcac35..566b5e6 100644 --- a/backend/telegram_bot.py +++ b/backend/telegram_bot.py @@ -12,7 +12,7 @@ import asyncio import logging from backend.database import AsyncSessionLocal, Task, Event, TelegramUser -from backend.utils import get_week_range, format_date_russian, check_event_overlap, get_weekday_from_date +from backend.utils import get_week_range, format_date_russian, check_event_overlap, get_weekday_from_date, materialize_events from backend.models import TaskCreate, EventCreate logging.basicConfig(level=logging.INFO) @@ -58,13 +58,10 @@ async def get_schedule_for_date(date_str: str, add_prefix: bool = False) -> str: weekly_items = await materialize_weekly_tasks(db, date_str, date_str) weekly_tasks = [item for item in weekly_items if item.kind == "task"] - # Получаем events - result = await db.execute( - select(Event).where(Event.date == date_str) - ) - events = result.scalars().all() + # Получаем events (включая еженедельные повторения и исключения) + events = await materialize_events(db, date_str, date_str) events = sorted(events, key=lambda e: e.start_time) - + # Определяем префикс для даты date_prefix = "" if add_prefix: @@ -523,13 +520,10 @@ async def show_items_for_deletion(query, date_str: str): weekly_items = await materialize_weekly_tasks(db, date_str, date_str) weekly_tasks = [item for item in weekly_items if item.kind == "task"] - # Получаем events - result = await db.execute( - select(Event).where(Event.date == date_str) - ) - events = result.scalars().all() + # Получаем events (включая еженедельные повторения и исключения) + events = await materialize_events(db, date_str, date_str) events = sorted(events, key=lambda e: e.start_time) - + keyboard = [] items_list = [] @@ -661,17 +655,11 @@ async def send_reminders(): target_time_str = target_time.strftime("%H:%M") async with AsyncSessionLocal() as db: - # Находим события, которые начинаются через 5 минут - result = await db.execute( - select(Event).where( - and_( - Event.date == target_date.strftime("%Y-%m-%d"), - Event.start_time == target_time_str - ) - ) - ) - events = result.scalars().all() - + # Находим события (включая еженедельные), которые начинаются через 5 минут + target_date_str = target_date.strftime("%Y-%m-%d") + day_events = await materialize_events(db, target_date_str, target_date_str) + events = [event for event in day_events if event.start_time == target_time_str] + if events: # Получаем всех пользователей result = await db.execute(select(TelegramUser))