106 lines
4.0 KiB
Python
106 lines
4.0 KiB
Python
# 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))
|