Neuer Endpunkt ordnet OCR-Zeilen den aehnlichsten LEBENSMITTELN zu (Score 0-100, difflib + Token-/Praefix-Abgleich fuer abgekuerzte Kassennamen). Gegenstaende inkl. Verbrauchsgegenstaende bleiben aussen vor. Je Zeile die besten Treffer ueber dem Schwellwert (Request oder Einstellung receipt_match_threshold, Default 45). 3 Tests, gesamt 182 gruen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
66 lines
2.0 KiB
Python
66 lines
2.0 KiB
Python
from fastapi import APIRouter, Depends
|
||
from sqlalchemy.orm import Session
|
||
|
||
from ..config import get_settings
|
||
from ..database import get_db
|
||
from ..deps import get_current_user, require_admin
|
||
from ..models import Setting, User
|
||
from ..schemas import SettingOut
|
||
|
||
router = APIRouter(prefix="/settings", tags=["settings"])
|
||
|
||
EXPIRY_WARNING_KEY = "expiry_warning_days"
|
||
# Ab wie viel Prozent Übereinstimmung ein Artikel beim Kassenzettel-Scan als
|
||
# Treffer vorgeschlagen wird.
|
||
RECEIPT_THRESHOLD_KEY = "receipt_match_threshold"
|
||
RECEIPT_THRESHOLD_DEFAULT = 45
|
||
|
||
|
||
def get_expiry_warning_days(db: Session) -> int:
|
||
row = db.get(Setting, EXPIRY_WARNING_KEY)
|
||
if row is None:
|
||
return get_settings().expiry_warning_days_default
|
||
try:
|
||
return int(row.value)
|
||
except ValueError:
|
||
return get_settings().expiry_warning_days_default
|
||
|
||
|
||
def get_receipt_match_threshold(db: Session) -> int:
|
||
"""Schwellwert (0–100) für Kassenzettel-Treffer; auf sinnvollen Bereich geklemmt."""
|
||
row = db.get(Setting, RECEIPT_THRESHOLD_KEY)
|
||
if row is None:
|
||
return RECEIPT_THRESHOLD_DEFAULT
|
||
try:
|
||
return max(0, min(100, int(row.value)))
|
||
except ValueError:
|
||
return RECEIPT_THRESHOLD_DEFAULT
|
||
|
||
|
||
@router.get("", response_model=list[SettingOut])
|
||
def list_settings(
|
||
db: Session = Depends(get_db), _: User = Depends(get_current_user)
|
||
) -> list[SettingOut]:
|
||
rows = db.query(Setting).all()
|
||
known = {r.key: r.value for r in rows}
|
||
known.setdefault(EXPIRY_WARNING_KEY, str(get_expiry_warning_days(db)))
|
||
known.setdefault(RECEIPT_THRESHOLD_KEY, str(get_receipt_match_threshold(db)))
|
||
return [SettingOut(key=k, value=v) for k, v in known.items()]
|
||
|
||
|
||
@router.put("/{key}", response_model=SettingOut)
|
||
def set_setting(
|
||
key: str,
|
||
value: str,
|
||
db: Session = Depends(get_db),
|
||
_: User = Depends(require_admin),
|
||
) -> SettingOut:
|
||
row = db.get(Setting, key)
|
||
if row is None:
|
||
row = Setting(key=key, value=value)
|
||
db.add(row)
|
||
else:
|
||
row.value = value
|
||
db.commit()
|
||
return SettingOut(key=key, value=value)
|