feat: stocker et afficher les données étendues dans le modal détail

- Ajout des champs a_propos, description, carateristique, details au modèle ProductSnapshot
- Sérialisation JSON pour les listes et dictionnaires
- Modification du CRUD pour stocker/lire les données étendues
- Modification du runner pour passer les données lors du scrape
- AddProductModal envoie les données étendues lors de la création
- La base SQLite doit être recréée (suppression de suivi.db)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-20 03:30:09 +01:00
parent 6a10d496d8
commit 58e9aa1429
5 changed files with 83 additions and 1 deletions

View File

@@ -1,5 +1,7 @@
from __future__ import annotations
import json
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import Session
@@ -57,9 +59,21 @@ def create_product_with_snapshot(
"choix_amazon",
"offre_limitee",
"exclusivite_amazon",
"a_propos",
"description",
"carateristique",
"details",
]
snapshot_data = {k: data_dict.pop(k) for k in snapshot_fields if k in data_dict}
# Sérialiser les champs JSON pour le stockage
if snapshot_data.get("a_propos") is not None:
snapshot_data["a_propos"] = json.dumps(snapshot_data["a_propos"], ensure_ascii=False)
if snapshot_data.get("carateristique") is not None:
snapshot_data["carateristique"] = json.dumps(snapshot_data["carateristique"], ensure_ascii=False)
if snapshot_data.get("details") is not None:
snapshot_data["details"] = json.dumps(snapshot_data["details"], ensure_ascii=False)
# Convertir les HttpUrl en strings pour SQLite
if data_dict.get("url"):
data_dict["url"] = str(data_dict["url"])
@@ -161,6 +175,28 @@ def _enrich_product_with_snapshot(db: Session, product: models.Product) -> dict:
if snapshot.prix_actuel and snapshot.prix_conseille:
reduction = round((1 - snapshot.prix_actuel / snapshot.prix_conseille) * 100)
# Désérialiser les champs JSON
a_propos = None
if snapshot.a_propos:
try:
a_propos = json.loads(snapshot.a_propos)
except json.JSONDecodeError:
a_propos = None
carateristique = None
if snapshot.carateristique:
try:
carateristique = json.loads(snapshot.carateristique)
except json.JSONDecodeError:
carateristique = None
details = None
if snapshot.details:
try:
details = json.loads(snapshot.details)
except json.JSONDecodeError:
details = None
result.update(
{
"prix_actuel": snapshot.prix_actuel,
@@ -175,6 +211,10 @@ def _enrich_product_with_snapshot(db: Session, product: models.Product) -> dict:
"choix_amazon": snapshot.choix_amazon,
"offre_limitee": snapshot.offre_limitee,
"exclusivite_amazon": snapshot.exclusivite_amazon,
"a_propos": a_propos,
"description": snapshot.description,
"carateristique": carateristique,
"details": details,
"dernier_scrape": snapshot.scrape_le,
"statut_scrap": snapshot.statut_scrap,
}