from typing import List, Optional from pydantic import BaseModel, ConfigDict, Field from datetime import date class DTOBase(BaseModel): # Allows TrainingDTO.model_validate() model_config = ConfigDict(from_attributes=True) class ApproachDTO(DTOBase): id: Optional[int] = None exercise_id: Optional[int] = None weight: float reps: int class ExerciseDTO(DTOBase): id: Optional[int] = None training_id: Optional[int] = None name: str splitted_weight: bool = False approaches: List[ApproachDTO] = Field(default_factory=list) class TrainingDTO(DTOBase): id: Optional[int] = None date: date trainer: Optional[str] = None exercises: List[ExerciseDTO] = Field(default_factory=list) class ExerciseNameDTO(DTOBase): """Distinct exercise name and how many times it was done.""" name: str count: int class ExerciseSessionDTO(DTOBase): """One occurrence of an exercise in the history of that exercise.""" date: date trainer: Optional[str] = None splitted_weight: bool = False approaches: List[ApproachDTO] = Field(default_factory=list)