53018c16dd
Les notes créées avant la migration 0061 ont urls=NULL en base. Le défaut NoteResponse.urls=[] ne s'applique qu'à un attribut absent, pas à None, d'où ResponseValidationError "Input should be a valid list" → GET /api/notes 500 → "Erreur de chargement" côté UI. Ajoute un field_validator(mode='before') qui coerce None → []. Nettoie aussi l'import HttpUrl inutilisé. v0.5.16 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
66 lines
1.6 KiB
Python
66 lines
1.6 KiB
Python
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 []
|