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)
- Créer table
plant_varietyavec toutes ses colonnes - Pour chaque ligne
plantactuelle → créer uneplant_variety(copier variete, boutique_*, tags) - Recréer
plantsans les colonnes migrées + ajouter temp_germination + temps_levee_j - Fusionner
haricot grimpant(id=21) sousHaricot(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_recolte→recolte_moistemperature→temp_germinationprofondeur→profondeur_semis_cm(extrait la valeur numérique)espacement→espacement_cm(premier chiffre)exposition→besoin_soleil- texte
arriere→astuces_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_jdans la section culture
frontend/src/api/plants.ts — modifications
- Interface
Plant: supprimer boutique/tags/variete, ajoutertemp_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 fetchAllcharge 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 |