Admin-Wartung: obsolete Buttons entfernt, Enrichment-Status + Foto-Laden hinzugefügt

- Temperament→Deutsch-Button entfernt (0 englische Temperamente in DB)
- Gemma-Einträge-zurücksetzen entfernt (0 Gemma-Einträge, alle Claude Haiku)
- Neuer Button: Enrichment-Status (GET /api/admin/wiki/enrichment-status)
  zeigt Gesamt/Angereichert/Kein-Wiki/Ausstehend/Fotos/Modelle-Verteilung
- Neuer Button: Fotos laden (POST /api/admin/wiki/fetch-photos)
  führt fetch_wiki_images.py --limit 50 aus und zählt gespeicherte Fotos
- SW by-v361, APP_VER 346
This commit is contained in:
rene 2026-04-25 08:53:28 +02:00
parent 0af3078a2a
commit d0921a28e9
4 changed files with 54 additions and 26 deletions

View file

@ -671,23 +671,49 @@ async def wiki_evaluate(sample: int = 20, user=Depends(require_mod)):
# ------------------------------------------------------------------
# POST /api/admin/wiki/reset-gemma — Gemma-Einträge zurücksetzen
# GET /api/admin/wiki/enrichment-status — Enrichment-Statistik
# ------------------------------------------------------------------
@router.post("/wiki/reset-gemma")
async def wiki_reset_gemma(user=Depends(require_mod)):
from scraper.breed_enricher import reset_gemma_entries
count = reset_gemma_entries()
return {"reset": count}
@router.get("/wiki/enrichment-status")
async def wiki_enrichment_status(user=Depends(require_mod)):
with db() as conn:
total = conn.execute("SELECT COUNT(*) FROM wiki_rassen").fetchone()[0]
enriched = conn.execute("SELECT COUNT(*) FROM wiki_rassen WHERE ki_enriched=1").fetchone()[0]
no_wiki = conn.execute("SELECT COUNT(*) FROM wiki_rassen WHERE ki_enriched=2").fetchone()[0]
pending = conn.execute("SELECT COUNT(*) FROM wiki_rassen WHERE ki_enriched=0").fetchone()[0]
by_model = {
row[0] or "unbekannt": row[1]
for row in conn.execute(
"SELECT ki_model, COUNT(*) FROM wiki_rassen "
"WHERE ki_enriched=1 GROUP BY ki_model ORDER BY 2 DESC"
).fetchall()
}
with_photo = conn.execute(
"SELECT COUNT(*) FROM wiki_rassen WHERE foto_url IS NOT NULL AND foto_url != ''"
).fetchone()[0]
return {
"total": total,
"enriched": enriched,
"no_wiki": no_wiki,
"pending": pending,
"with_photo": with_photo,
"by_model": by_model,
}
# ------------------------------------------------------------------
# POST /api/admin/wiki/translate-temperament — einmalige Migration
# POST /api/admin/wiki/fetch-photos — Wiki-Fotos laden
# ------------------------------------------------------------------
@router.post("/wiki/translate-temperament")
async def wiki_translate_temperament(user=Depends(require_mod)):
from scraper.breed_enricher import translate_existing_temperaments
updated = translate_existing_temperaments()
return {"updated": updated}
@router.post("/wiki/fetch-photos")
async def wiki_fetch_photos(limit: int = 50, user=Depends(require_mod)):
import asyncio, subprocess
proc = await asyncio.create_subprocess_exec(
"python3", "/app/scraper/fetch_wiki_images.py", "--limit", str(limit),
stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
)
stdout, stderr = await proc.communicate()
lines = (stdout + stderr).decode()
found = lines.count("Foto gespeichert")
return {"launched": True, "found": found, "log": lines[-2000:]}
# ------------------------------------------------------------------