All checks were successful
CI / lint-and-test (push) Successful in 17s
- Created a new `CHANGELOG.md` file to document all notable changes to the project, adhering to the Keep a Changelog format. - Updated `CONTRIBUTING.md` to include instructions for building and previewing documentation using MkDocs. - Added `mkdocs.yml` configuration for documentation generation, including navigation structure and theme settings. - Enhanced various documentation files, including API reference, architecture overview, configuration reference, and runbook, to provide comprehensive guidance for users and developers. - Included new sections in the README for changelog and documentation links, improving accessibility to project information.
71 lines
1.5 KiB
Python
71 lines
1.5 KiB
Python
"""Pydantic schemas for API request/response and validation."""
|
|
|
|
from typing import Literal
|
|
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
|
|
class UserBase(BaseModel):
|
|
"""Base user fields (full_name, username, first/last name)."""
|
|
|
|
full_name: str
|
|
username: str | None = None
|
|
first_name: str | None = None
|
|
last_name: str | None = None
|
|
|
|
|
|
class UserCreate(UserBase):
|
|
"""User creation payload including Telegram user id."""
|
|
|
|
telegram_user_id: int
|
|
|
|
|
|
class UserInDb(UserBase):
|
|
"""User as stored in DB (includes id and telegram_user_id)."""
|
|
|
|
id: int
|
|
telegram_user_id: int
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class DutyBase(BaseModel):
|
|
"""Duty fields: user_id, start_at, end_at (UTC ISO 8601 with Z)."""
|
|
|
|
user_id: int
|
|
start_at: str # UTC, ISO 8601 with Z
|
|
end_at: str # UTC, ISO 8601 with Z
|
|
|
|
|
|
class DutyCreate(DutyBase):
|
|
"""Duty creation payload."""
|
|
|
|
pass
|
|
|
|
|
|
class DutyInDb(DutyBase):
|
|
"""Duty as stored in DB (includes id)."""
|
|
|
|
id: int
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class DutyWithUser(DutyInDb):
|
|
"""Duty with full_name and event_type for calendar display.
|
|
|
|
event_type: only these values are returned; unknown DB values are mapped to "duty" in the API.
|
|
"""
|
|
|
|
full_name: str
|
|
event_type: Literal["duty", "unavailable", "vacation"] = "duty"
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class CalendarEvent(BaseModel):
|
|
"""External calendar event (e.g. holiday) for a single day."""
|
|
|
|
date: str # YYYY-MM-DD
|
|
summary: str
|