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 variete: Optional[str] = None famille: Optional[str] = None tags: Optional[str] = None # CSV type_plante: Optional[str] = None # legume | fruit | aromatique | fleur 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 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_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), ) # 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 PlantImage(SQLModel, table=True): 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))