feat(todos): domains[], photo_path, gps_lat/lng — modèle, schemas, API, tri par date

- Modèle SQLAlchemy : ajout de domains (ARRAY), photo_path, gps_lat, gps_lng ; import Float
- Schemas Pydantic : domain → domains dans TodoCreate, TodoUpdate, TodoResponse ; ajout photo_path, gps_lat, gps_lng
- API GET /api/todos : filtre domain (param URL) redirigé vers domains.contains([domain]) sur le champ ARRAY
- Tests : domain → domains dans les payloads POST ; assertion domains == ["informatique"] dans test_creer_todo
This commit is contained in:
2026-05-24 16:04:21 +02:00
parent a97894437a
commit e9dfb6e293
4 changed files with 22 additions and 8 deletions
+5 -1
View File
@@ -1,6 +1,6 @@
import uuid
from datetime import datetime
from sqlalchemy import String, Text, Integer, TIMESTAMP, text
from sqlalchemy import String, Text, Integer, Float, TIMESTAMP, text
from sqlalchemy.dialects.postgresql import UUID, ARRAY
from sqlalchemy.orm import Mapped, mapped_column
from app.core.database import Base
@@ -15,8 +15,12 @@ class TodoItem(Base):
body: Mapped[str | None] = mapped_column(Text)
url: Mapped[str | None] = mapped_column(Text)
domain: Mapped[str | None] = mapped_column(String(50))
domains: Mapped[list[str]] = mapped_column(ARRAY(String(50)), server_default=text("'{}'::varchar[]"))
category: Mapped[str | None] = mapped_column(String(50))
tags: Mapped[list[str]] = mapped_column(ARRAY(String(50)), server_default=text("'{}'::varchar[]"))
photo_path: Mapped[str | None] = mapped_column(Text)
gps_lat: Mapped[float | None] = mapped_column(Float)
gps_lng: Mapped[float | None] = mapped_column(Float)
status: Mapped[str] = mapped_column(String(20), server_default="pending")
priority: Mapped[str] = mapped_column(String(10), server_default="medium")
due_date: Mapped[datetime | None] = mapped_column(TIMESTAMP(timezone=True))