Artikeldaten von Open Food Facts vergleichen und einzeln uebernehmen

Neuer Knopf unter "Nachschlagen" auf der Artikelseite. Er fragt OFF erneut und
stellt die Antwort den eigenen Daten gegenueber: Name, Marke, Packungsgroesse,
Kategorie und Bild, jeweils mit eigenem Uebernehmen-Knopf und einem
"Alle uebernehmen". Uebernommen wird nur ins Formular - gespeichert erst mit
"Speichern", damit man bis zuletzt bei den eigenen Daten bleiben kann.

Dafuer noetig: GET /products/{id}/off. /lookup taugt hier nicht, weil es bei
einem bekannten Barcode den eigenen Artikel meldet und OFF gar nicht erst
fragt. Der neue Endpunkt probiert auch die zusaetzlichen EAN-Codes durch - oft
ist nur einer davon bei OFF hinterlegt.

Damit ist das Bild unabhaengig davon nachholbar, ob ein Backup eine
Bildadresse enthielt.

Nebenbei: Der Nachschlagen-Knopf uebergab die Gruppenliste, wo die
Einheitenliste erwartet wird - die Einheit eines Vorschlags wurde deshalb nie
richtig zugeordnet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-23 14:00:30 +02:00
parent 2fa274eae8
commit 8766e35e91
7 changed files with 267 additions and 9 deletions

View File

@@ -92,6 +92,50 @@ def get_product(
return product_to_out(db, product)
@router.get("/{product_id}/off", response_model=LookupResult)
def off_vergleich(
product_id: int,
db: Session = Depends(get_db),
_: User = Depends(get_current_user),
) -> LookupResult:
"""Open Food Facts erneut befragen auch für einen bereits angelegten Artikel.
``/lookup`` kann das nicht: Kennt es den Barcode schon, meldet es den eigenen
Artikel und fragt OFF gar nicht erst. Zum Vergleichen braucht es aber genau
die fremden Daten.
Neben dem Haupt-Barcode werden die zusätzlichen EAN-Codes durchprobiert
oft ist nur einer davon bei OFF hinterlegt.
"""
product = db.get(Product, product_id)
if product is None:
raise HTTPException(status.HTTP_404_NOT_FOUND, "Produkt nicht gefunden")
codes = [product.barcode] if product.barcode else []
codes += [
b.code
for b in db.query(Barcode).filter(Barcode.product_id == product_id).all()
if b.code not in codes
]
if not codes:
raise HTTPException(
status.HTTP_400_BAD_REQUEST,
"Dieser Artikel hat keinen Barcode ohne den kann Open Food Facts nichts finden.",
)
for code in codes:
suggestion = lookup_barcode(code)
if suggestion:
category = suggest_category(db, suggestion)
return LookupResult(
found=True,
suggestion=suggestion,
category_id=category.id if category else None,
category_name=category.name if category else None,
)
return LookupResult(found=False)
@router.get("/{product_id}/image")
def get_product_image(
product_id: int,