from __future__ import annotations from collections.abc import Sequence from datetime import date, datetime from sqlalchemy import delete, insert, select from sqlalchemy.ext.asyncio import AsyncSession from app.db.models import NonWorkingDay class CalendarRepository: def __init__(self, session: AsyncSession) -> None: self.session = session async def replace_year(self, year: int, days: Sequence[date], user: str) -> None: """Нерабочие дни года целиком: старые удаляются, новые вставляются. Коммит — на вызывающей стороне.""" await self.session.execute( delete(NonWorkingDay).where( NonWorkingDay.day >= date(year, 1, 1), NonWorkingDay.day <= date(year, 12, 31), ) ) if days: await self.session.execute( insert(NonWorkingDay), [{"day": d, "created_by": user, "updated_by": user} for d in days], ) async def list_between( self, start: date, end: date ) -> list[tuple[date, str, datetime]]: """(день, кто загрузил, когда) с start по end включительно.""" result = await self.session.execute( select( NonWorkingDay.day, NonWorkingDay.updated_by, NonWorkingDay.updated_at ) .where(NonWorkingDay.day >= start, NonWorkingDay.day <= end) .order_by(NonWorkingDay.day) ) return [tuple(row) for row in result.all()]