feat(plantes): modèle Plant épuré + PlantVariety + PlantWithVarieties
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user