From de967141baf9e48da053d2580e552efd61834e55 Mon Sep 17 00:00:00 2001 From: gilles Date: Sun, 8 Mar 2026 14:10:12 +0100 Subject: [PATCH] =?UTF-8?q?feat(plantes):=20mod=C3=A8le=20Plant=20=C3=A9pu?= =?UTF-8?q?r=C3=A9=20+=20PlantVariety=20+=20PlantWithVarieties?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/models/__init__.py | 2 +- backend/app/models/plant.py | 65 ++++++++++++++++++++++++++++------ 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index 6c2657f..ff3292f 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -1,5 +1,5 @@ from app.models.garden import Garden, GardenCell, GardenImage, Measurement # noqa -from app.models.plant import Plant, PlantImage # noqa +from app.models.plant import Plant, PlantImage, PlantVariety, PlantWithVarieties # noqa from app.models.planting import Planting, PlantingEvent # noqa from app.models.task import Task # noqa from app.models.settings import UserSettings, LunarCalendarEntry # noqa diff --git a/backend/app/models/plant.py b/backend/app/models/plant.py index eccb224..526ec22 100644 --- a/backend/app/models/plant.py +++ b/backend/app/models/plant.py @@ -1,3 +1,4 @@ +# backend/app/models/plant.py from datetime import datetime, timezone from typing import List, Optional from sqlalchemy import Column @@ -11,20 +12,20 @@ class Plant(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) nom_commun: str nom_botanique: Optional[str] = None - variete: Optional[str] = None famille: Optional[str] = None - tags: Optional[str] = None # CSV - type_plante: Optional[str] = None # legume | fruit | aromatique | fleur + type_plante: Optional[str] = None categorie: Optional[str] = None # potager|fleur|arbre|arbuste besoin_eau: Optional[str] = None # faible | moyen | fort besoin_soleil: Optional[str] = None espacement_cm: Optional[int] = None hauteur_cm: Optional[int] = None temp_min_c: Optional[float] = None + temp_germination: Optional[str] = None # ex: "8-10°C" + temps_levee_j: Optional[str] = None # ex: "15-20 jours" duree_culture_j: Optional[int] = None profondeur_semis_cm: Optional[float] = None sol_conseille: Optional[str] = None - semis_interieur_mois: Optional[str] = None # ex: "2,3" + semis_interieur_mois: Optional[str] = None # CSV ex: "2,3" semis_exterieur_mois: Optional[str] = None repiquage_mois: Optional[str] = None plantation_mois: Optional[str] = None @@ -41,16 +42,58 @@ class Plant(SQLModel, table=True): default=None, sa_column=Column("associations_defavorables", SA_JSON, nullable=True), ) - # Boutique / approvisionnement (par variété) - boutique_nom: Optional[str] = None # ex: "Gamm Vert", "Lidl", "Amazon" - boutique_url: Optional[str] = None # URL fiche produit - prix_achat: Optional[float] = None - date_achat: Optional[str] = None # ISO date - poids: Optional[str] = None # ex: "5g", "100g", "50 graines" - dluo: Optional[str] = None # date limite utilisation optimale created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) +class PlantVariety(SQLModel, table=True): + __tablename__ = "plant_variety" + + id: Optional[int] = Field(default=None, primary_key=True) + plant_id: int = Field(foreign_key="plant.id", index=True) + variete: Optional[str] = None + tags: Optional[str] = None + notes_variete: Optional[str] = None + boutique_nom: Optional[str] = None + boutique_url: Optional[str] = None + prix_achat: Optional[float] = None + date_achat: Optional[str] = None + poids: Optional[str] = None + dluo: Optional[str] = None + created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) + + +class PlantWithVarieties(SQLModel): + """Schéma de réponse API : plant + ses variétés (non persisté).""" + id: Optional[int] = None + nom_commun: str + nom_botanique: Optional[str] = None + famille: Optional[str] = None + type_plante: Optional[str] = None + categorie: Optional[str] = None + besoin_eau: Optional[str] = None + besoin_soleil: Optional[str] = None + espacement_cm: Optional[int] = None + hauteur_cm: Optional[int] = None + temp_min_c: Optional[float] = None + temp_germination: Optional[str] = None + temps_levee_j: Optional[str] = None + duree_culture_j: Optional[int] = None + profondeur_semis_cm: Optional[float] = None + sol_conseille: Optional[str] = None + semis_interieur_mois: Optional[str] = None + semis_exterieur_mois: Optional[str] = None + repiquage_mois: Optional[str] = None + plantation_mois: Optional[str] = None + recolte_mois: Optional[str] = None + maladies_courantes: Optional[str] = None + astuces_culture: Optional[str] = None + url_reference: Optional[str] = None + notes: Optional[str] = None + associations_favorables: Optional[List[str]] = None + associations_defavorables: Optional[List[str]] = None + varieties: List[PlantVariety] = [] + + class PlantImage(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) plant_id: int = Field(foreign_key="plant.id", index=True)