Artikelbild: nur noch an einer Stelle, hochkant, und beim Import beruecksichtigt

Das alte Bild in der Chargen-Karte entfaellt - seit dem neuen Bild neben den
Kennfeldern stand es doppelt auf der Seite.

Der Rahmen ist jetzt hochkant (3:4) statt quadratisch. Lebensmittelverpackungen
sind fast immer hoeher als breit; im Quadrat blieben links und rechts leere
Streifen.

Beim Import wurde image_url komplett verworfen, obwohl das JSON-Backup sie
enthaelt - eingelesene Artikel blieben deshalb dauerhaft ohne Bild. Die Adresse
wird jetzt uebernommen (bei bestehenden Artikeln nur ergaenzend, nie
ueberschreibend); die lokale Kopie holt der Bildabruf beim ersten Ansehen.
Bewusst nicht waehrend des Imports: Ein Backup mit 200 Artikeln wuerde sonst
200 Downloads in einer Anfrage abarbeiten.

Ausserdem holen jetzt auch Artikelliste, Ein- und Auslagern ihr Vorschaubild
aus der eigenen Datenbank statt direkt von Open Food Facts. Einzige Ausnahme
bleibt der OFF-Vorschlag beim Scannen: Dort existiert der Artikel noch nicht.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-23 13:48:20 +02:00
parent c155116b4e
commit 3763f2f114
7 changed files with 59 additions and 21 deletions

View File

@@ -339,6 +339,17 @@ def _get_or_create_group(db: Session, name: str | None) -> Group | None:
return group
def _bildadresse_ergaenzen(product: Product, row: dict) -> None:
"""Fehlende Bildadresse aus dem Backup nachtragen vorhandene bleibt.
Nur ergaenzend: Ein Import soll Daten hinzufuegen, nicht stillschweigend
etwas ueberschreiben, das jemand von Hand gesetzt hat.
"""
adresse = (row.get("image_url") or "").strip()
if adresse and not product.image_url:
product.image_url = adresse
def _get_or_create_product(db: Session, row: dict, created: list[str]) -> Product:
"""Sucht per Barcode, sonst per Name; legt das Produkt sonst an."""
barcode = (row.get("barcode") or "").strip() or None
@@ -346,10 +357,12 @@ def _get_or_create_product(db: Session, row: dict, created: list[str]) -> Produc
if barcode:
product = db.query(Product).filter(Product.barcode == barcode).first()
if product:
_bildadresse_ergaenzen(product, row)
return product
if name:
product = db.query(Product).filter(Product.name == name).first()
if product:
_bildadresse_ergaenzen(product, row)
return product
if not name:
raise ValueError("Produktname fehlt")
@@ -363,6 +376,10 @@ def _get_or_create_product(db: Session, row: dict, created: list[str]) -> Produc
barcode=barcode,
name=name,
brand=(row.get("marke") or "").strip() or None,
# Die Bildadresse stand zwar immer im JSON-Backup, wurde beim Einlesen
# aber verworfen - eingelesene Artikel blieben deshalb dauerhaft ohne
# Bild. Die lokale Kopie holt sich der Bildabruf beim ersten Ansehen.
image_url=(row.get("image_url") or "").strip() or None,
base_unit=BASE_OF_KIND[unit.kind],
display_unit_id=unit.id,
package_size=_num(row.get("packungsgroesse")),