import uuid from datetime import datetime from pydantic import BaseModel, ConfigDict, field_validator class NoteUrl(BaseModel): label: str url: str @field_validator('url') @classmethod def validate_url(cls, v: str) -> str: if not v.startswith(('http://', 'https://')): raise ValueError('URL doit commencer par http:// ou https://') return v class AttachmentResponse(BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID file_path: str | None thumbnail_path: str | None file_type: str | None original_name: str | None created_at: datetime class NoteCreate(BaseModel): title: str | None = None content: str category: str | None = None tags: list[str] = [] gps_lat: float | None = None gps_lon: float | None = None urls: list[NoteUrl] = [] class NoteUpdate(BaseModel): title: str | None = None content: str | None = None category: str | None = None tags: list[str] | None = None gps_lat: float | None = None gps_lon: float | None = None urls: list[NoteUrl] | None = None class NoteResponse(BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID title: str | None content: str category: str | None tags: list[str] gps_lat: float | None gps_lon: float | None urls: list[NoteUrl] = [] created_at: datetime attachments: list[AttachmentResponse] @field_validator('urls', mode='before') @classmethod def coerce_urls(cls, v: object) -> object: # Les notes antérieures à la migration 0061 ont urls=NULL en base. return v or []