64734ae6e7
Starlette renamed HTTP_422_UNPROCESSABLE_ENTITY to HTTP_422_UNPROCESSABLE_CONTENT and now warns on the old spelling; the value is unchanged at 422, so the 20 call sites in the routers move over with no wire-format or frontend impact. Alembic >=1.16 supersedes version_path_separator with path_separator, which governs both prepend_sys_path and version_locations, and warns when it is absent. Together this takes pytest from 26 deprecation warnings to 6. The remainder are slowapi calling asyncio.iscoroutinefunction; they are left visible deliberately, with no filterwarnings entry, as a reminder to revisit once upstream ships a fix. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
36 lines
1.3 KiB
Python
36 lines
1.3 KiB
Python
"""HTTP routes for the Swedish calendar (röda dagar / klämdagar).
|
|
|
|
Routers stay thin: validate via Pydantic/query params, call the service, map
|
|
domain errors to HTTP. Serves both §3.4 (Kalender shading) and §3.8 (Settings
|
|
red-days list) from one endpoint — see `app.services.calendar_service`.
|
|
"""
|
|
|
|
from uuid import UUID
|
|
|
|
from fastapi import APIRouter, HTTPException, Query, status
|
|
|
|
from app.dependencies import CalendarServiceDep, WorkspaceScopeDep
|
|
from app.models.calendar import CalendarDaysResponse
|
|
from app.services.calendar_service import MAX_WINDOW_YEARS
|
|
from app.utils.errors import ValidationError
|
|
|
|
router = APIRouter(prefix="/api/calendar", tags=["calendar"])
|
|
|
|
|
|
@router.get("/days", response_model=CalendarDaysResponse)
|
|
async def get_calendar_days(
|
|
workspace_id: UUID,
|
|
start_year: int,
|
|
service: CalendarServiceDep,
|
|
scope: WorkspaceScopeDep,
|
|
years: int = Query(default=MAX_WINDOW_YEARS, ge=1, le=MAX_WINDOW_YEARS),
|
|
) -> CalendarDaysResponse:
|
|
scope.check_workspace(workspace_id)
|
|
try:
|
|
window = await service.get_calendar_window(
|
|
workspace_id=workspace_id, start_year=start_year, years=years
|
|
)
|
|
except ValidationError as exc:
|
|
raise HTTPException(status.HTTP_422_UNPROCESSABLE_CONTENT, str(exc)) from exc
|
|
return CalendarDaysResponse.from_domain(window)
|