Make upcoming_entries_for_container work without container filter

When container_type/container_id are None, returns all upcoming
confirmed entries across all calendars (for global event listings).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
giles
2026-02-22 23:04:55 +00:00
parent 6e438dbfdc
commit 16e4d3aa57
2 changed files with 25 additions and 14 deletions

View File

@@ -130,7 +130,8 @@ class CalendarService(Protocol):
) -> set[int]: ... ) -> set[int]: ...
async def upcoming_entries_for_container( async def upcoming_entries_for_container(
self, session: AsyncSession, container_type: str, container_id: int, self, session: AsyncSession,
container_type: str | None = None, container_id: int | None = None,
*, page: int = 1, per_page: int = 20, *, page: int = 1, per_page: int = 20,
) -> tuple[list[CalendarEntryDTO], bool]: ... ) -> tuple[list[CalendarEntryDTO], bool]: ...

View File

@@ -240,25 +240,35 @@ class SqlCalendarService:
return [_entry_to_dto(e) for e in merged] return [_entry_to_dto(e) for e in merged]
async def upcoming_entries_for_container( async def upcoming_entries_for_container(
self, session: AsyncSession, container_type: str, container_id: int, self, session: AsyncSession,
container_type: str | None = None, container_id: int | None = None,
*, page: int = 1, per_page: int = 20, *, page: int = 1, per_page: int = 20,
) -> tuple[list[CalendarEntryDTO], bool]: ) -> tuple[list[CalendarEntryDTO], bool]:
"""Upcoming confirmed entries across all calendars for a container.""" """Upcoming confirmed entries. Optionally scoped to a container."""
cal_ids = select(Calendar.id).where( filters = [
Calendar.container_type == container_type, CalendarEntry.state == "confirmed",
Calendar.container_id == container_id, CalendarEntry.deleted_at.is_(None),
Calendar.deleted_at.is_(None), CalendarEntry.start_at >= func.now(),
).scalar_subquery() ]
if container_type is not None and container_id is not None:
cal_ids = select(Calendar.id).where(
Calendar.container_type == container_type,
Calendar.container_id == container_id,
Calendar.deleted_at.is_(None),
).scalar_subquery()
filters.append(CalendarEntry.calendar_id.in_(cal_ids))
else:
# Still exclude entries from deleted calendars
cal_ids = select(Calendar.id).where(
Calendar.deleted_at.is_(None),
).scalar_subquery()
filters.append(CalendarEntry.calendar_id.in_(cal_ids))
offset = (page - 1) * per_page offset = (page - 1) * per_page
result = await session.execute( result = await session.execute(
select(CalendarEntry) select(CalendarEntry)
.where( .where(*filters)
CalendarEntry.calendar_id.in_(cal_ids),
CalendarEntry.state == "confirmed",
CalendarEntry.deleted_at.is_(None),
CalendarEntry.start_at >= func.now(),
)
.order_by(CalendarEntry.start_at.asc()) .order_by(CalendarEntry.start_at.asc())
.limit(per_page) .limit(per_page)
.offset(offset) .offset(offset)