Files
jardin/docs/plans/2026-03-08-plantes-varietes-design.md

6.6 KiB

Plantes & Variétés — Design

Pour Claude : REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.

Goal: Restructurer la gestion des plantes en séparant niveau espèce (plant) et niveau variété (plant_variety), importer les données JSON des sachets de graines et arbustes, et ajouter le bouton "Ajouter variété" dans l'UI.

Architecture: Option B — deux tables distinctes (plant + plant_variety), migration des 21 plantes existantes, import one-shot des 14 graines + 4 arbustes, nouveaux endpoints CRUD variétés.

Tech Stack: FastAPI + SQLModel + SQLite (backend), Vue 3 + Pinia + Tailwind Gruvbox (frontend)


Modèle de données

Table plant (niveau espèce / nom commun)

Conserve toutes les colonnes actuelles sauf : variete, boutique_nom, boutique_url, prix_achat, date_achat, poids, dluo, tags

Nouvelles colonnes ajoutées :

Champ Type Notes
temp_germination TEXT Ex: "8-10°C"
temps_levee_j TEXT Ex: "15-20 jours"

Table plant_variety (niveau variété)

Champ Type Notes
id INTEGER PK
plant_id INTEGER FK → plant
variete TEXT "Nain", "Grimpant", "Stockarda"…
tags TEXT Tags spécifiques à cette variété
notes_variete TEXT Observations propres à la variété
boutique_nom TEXT Enseigne d'achat
boutique_url TEXT URL fiche produit
prix_achat REAL En €
date_achat TEXT ISO date
poids TEXT Ex: "500 graines", "1g"
dluo TEXT ISO date limite d'utilisation
created_at TEXT ISO datetime

Photos sachet de graines

→ Table media existante avec entity_type='plant_variety' et entity_id=plant_variety.id → Deux photos par variété max (recto + verso sachet), type photo_sachet


API REST

Endpoints plant modifiés

GET  /api/plants           → liste plant + varieties[] (jointure)
GET  /api/plants/{id}      → détail plant + varieties[]
POST /api/plants           → créer une plante (sans variété)
PUT  /api/plants/{id}      → modifier les champs espèce
DEL  /api/plants/{id}      → supprimer (cascade varieties)

Nouveaux endpoints plant_variety

GET    /api/plants/{id}/varieties          → liste des variétés d'une plante
POST   /api/plants/{id}/varieties          → créer une variété
PUT    /api/plants/{id}/varieties/{vid}    → modifier une variété
DELETE /api/plants/{id}/varieties/{vid}    → supprimer une variété

Import one-shot

POST /api/plants/import-graines   → importe docs/graine/ + docs/arbustre/

Migration BDD (script Python one-shot)

  1. Créer table plant_variety avec toutes ses colonnes
  2. Pour chaque ligne plant actuelle → créer une plant_variety (copier variete, boutique_*, tags)
  3. Recréer plant sans les colonnes migrées + ajouter temp_germination + temps_levee_j
  4. Fusionner haricot grimpant (id=21) sous Haricot (id=7) comme variété, supprimer id=21

Import JSON

docs/graine/caracteristiques_plantation.json (14 entrées)

Mapping automatique nom → plant.nom_commun :

JSON nom_commun BDD Action
Oignon Stockarda Oignon (nouveau) créer plant + variety
Laitue Attraction Laitue (id=4) nouvelle variety
Persil frise Moskrul 2 Persil (id=13) enrichir plant + nouvelle variety
Courgette de Nice Courgette (id=2) nouvelle variety
Pois à ecosser Merveille Pois (id=8) enrichir + nouvelle variety
Tomates Moneymaker Tomate (id=1) nouvelle variety
Poireau Bleu de Solaise Poireau (id=9) enrichir variety existante
Echalion Zebrune Échalote (id=14) nouvelle variety
Courge Musquée Sucrine Courge (nouveau) créer plant + variety
Laitue Grosse Blonde Laitue (id=4) nouvelle variety
Chou Pomme Brunswick Chou (id=16) enrichir + nouvelle variety
Chou-fleur Nautilus HF1 Chou-fleur (id=15) enrichir variety existante
Tomate Cornue Cornabel Tomate (id=1) nouvelle variety
Pois mangetout Carouby Pois (id=8) nouvelle variety

Champs JSON → colonnes plant :

  • periode_semis (ex: "III-IV") → semis_exterieur_mois (converti en liste mois "3,4")
  • periode_recolterecolte_mois
  • temperaturetemp_germination
  • profondeurprofondeur_semis_cm (extrait la valeur numérique)
  • espacementespacement_cm (premier chiffre)
  • expositionbesoin_soleil
  • texte arriereastuces_culture

Photos IMG_*.jpg → copiées dans /data/uploads/ + entrées media (entity_type='plant_variety')

docs/arbustre/caracteristiques_arbustre.json (4 entrées)

4 nouvelles plantes de catégorie arbuste avec leurs variétés.


Frontend

PlantesView.vue — modifications

  • GET /api/plants retourne plant + varieties[] → groupage déjà géré
  • Popup détail : bouton "+ Variété" à gauche du bouton "Modifier"
  • Popup variété : formulaire pré-rempli depuis plant (nom commun) + champs variété-spécifiques :
    • Nom de variété (requis)
    • Tags, notes variété
    • Boutique (nom, URL, prix, date, poids, DLUO)
    • Section photos sachet : 2 uploads (recto + verso)
  • Popup nom commun : affiche temp_germination + temps_levee_j dans la section culture

frontend/src/api/plants.ts — modifications

  • Interface Plant : supprimer boutique/tags/variete, ajouter temp_germination, temps_levee_j, varieties: PlantVariety[]
  • Nouvelle interface PlantVariety : tous les champs variété
  • Nouveaux appels API : createVariety, updateVariety, deleteVariety

frontend/src/stores/plants.ts — modifications

  • Actions : createVariety, updateVariety, deleteVariety
  • fetchAll charge désormais les varieties intégrées

Fichiers à créer / modifier

Fichier Action
backend/app/models/plant.py Modifier : supprimer champs migrés, ajouter temp_germination + temps_levee_j + PlantVariety
backend/app/routers/plants.py Modifier : GET retourne varieties, + endpoints varieties CRUD
backend/app/migrate.py Modifier : ajouter section plant_variety
backend/scripts/migrate_plant_varieties.py Créer : script migration one-shot
backend/scripts/import_graines.py Créer : script import JSON graines + arbustre
frontend/src/api/plants.ts Modifier : Plant + PlantVariety interfaces
frontend/src/stores/plants.ts Modifier : actions variety
frontend/src/views/PlantesView.vue Modifier : bouton + variété + popup variété + champs nouveaux