fix: show all events (including weekly recurring) in Telegram bot
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 20s
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 20s
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 <noreply@anthropic.com>
This commit is contained in:
parent
c40a6569b4
commit
4dc060d8d6
1 changed files with 12 additions and 24 deletions
|
|
@ -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,11 +58,8 @@ 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)
|
||||
|
||||
# Определяем префикс для даты
|
||||
|
|
@ -523,11 +520,8 @@ 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 = []
|
||||
|
|
@ -661,16 +655,10 @@ 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:
|
||||
# Получаем всех пользователей
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue