# backend/app/models/plant.py from datetime import datetime, timezone from typing import List, Optional from sqlalchemy import Column from sqlalchemy import JSON as SA_JSON from sqlmodel import Field, SQLModel class Plant(SQLModel, table=True): __tablename__ = "plant" id: Optional[int] = Field(default=None, primary_key=True) nom_commun: str nom_botanique: Optional[str] = None famille: Optional[str] = None 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 # CSV ex: "2,3" 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]] = Field( default=None, sa_column=Column("associations_favorables", SA_JSON, nullable=True), ) associations_defavorables: Optional[List[str]] = Field( default=None, sa_column=Column("associations_defavorables", SA_JSON, nullable=True), ) 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 created_at: Optional[datetime] = None associations_favorables: Optional[List[str]] = None associations_defavorables: Optional[List[str]] = None varieties: List[PlantVariety] = Field(default_factory=list) class PlantImage(SQLModel, table=True): __tablename__ = "plant_image" id: Optional[int] = Field(default=None, primary_key=True) plant_id: int = Field(foreign_key="plant.id", index=True) filename: str caption: Optional[str] = None created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))