From d4d104b2c2d4fe2ee6ff1411894036aea51e211a Mon Sep 17 00:00:00 2001 From: gilles Date: Sun, 8 Mar 2026 19:08:32 +0100 Subject: [PATCH] =?UTF-8?q?fix(plantes):=20import=5Fgraines=20=E2=80=94=20?= =?UTF-8?q?idempotence=20plant=5Fvariety=20+=20media=20+=20import=20unicod?= =?UTF-8?q?edata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- backend/scripts/import_graines.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/backend/scripts/import_graines.py b/backend/scripts/import_graines.py index 2589343..b219c41 100644 --- a/backend/scripts/import_graines.py +++ b/backend/scripts/import_graines.py @@ -6,6 +6,7 @@ Usage: cd /chemin/projet && python3 backend/scripts/import_graines.py import json import shutil import sqlite3 +import unicodedata import uuid from datetime import datetime, timezone from pathlib import Path @@ -86,6 +87,13 @@ def copy_image(src: Path, variety_id: int, conn: sqlite3.Connection) -> None: if not src.exists(): print(f" WARNING image absente: {src}") return + # Vérifier si cette image existe déjà dans media pour cette variété + existing_m = conn.execute( + "SELECT id FROM media WHERE entity_type = 'plant_variety' AND entity_id = ? AND url LIKE ?", + (variety_id, f"%{src.stem}%") + ).fetchone() + if existing_m: + return UPLOADS_DIR.mkdir(parents=True, exist_ok=True) # Use UUID-based filename like the rest of the app dest_name = f"{uuid.uuid4()}.jpg" @@ -99,7 +107,6 @@ def copy_image(src: Path, variety_id: int, conn: sqlite3.Connection) -> None: def normalize(s: str) -> str: """Normalise string: minuscules, supprime accents simples.""" - import unicodedata return ''.join(c for c in unicodedata.normalize('NFD', s.lower()) if unicodedata.category(c) != 'Mn') @@ -169,6 +176,15 @@ def import_graines(conn: sqlite3.Connection) -> None: (*updates.values(), plant_id), ) + # Vérifier si cette variété existe déjà pour cette plante + existing_v = conn.execute( + "SELECT id FROM plant_variety WHERE plant_id = ? AND LOWER(variete) = LOWER(?)", + (plant_id, variete_name) + ).fetchone() + if existing_v: + print(f" ↷ {nom_commun} — {variete_name} (déjà importé)") + continue + # Créer plant_variety conn.execute( "INSERT INTO plant_variety (plant_id, variete, created_at) VALUES (?, ?, ?)", @@ -229,6 +245,15 @@ def import_arbustre(conn: sqlite3.Connection) -> None: if exposition: conn.execute("UPDATE plant SET besoin_soleil = ? WHERE id = ?", (exposition, plant_id)) + # Vérifier si cette variété existe déjà pour cette plante + existing_v = conn.execute( + "SELECT id FROM plant_variety WHERE plant_id = ? AND LOWER(variete) = LOWER(?)", + (plant_id, variete_name) + ).fetchone() + if existing_v: + print(f" ↷ {nom_commun} — {variete_name} (déjà importé)") + continue + conn.execute( "INSERT INTO plant_variety (plant_id, variete, created_at) VALUES (?, ?, ?)", (plant_id, variete_name, datetime.now(timezone.utc).isoformat()),