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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user