diff --git a/backend/routes/admin.py b/backend/routes/admin.py index 38e6d1c..82cc640 100644 --- a/backend/routes/admin.py +++ b/backend/routes/admin.py @@ -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:]} # ------------------------------------------------------------------ diff --git a/backend/static/css/components.css b/backend/static/css/components.css index 500e6fc..33c67d1 100644 --- a/backend/static/css/components.css +++ b/backend/static/css/components.css @@ -4029,9 +4029,10 @@ html.modal-open { white-space: nowrap; } -.wiki-badge-groesse--klein { background: #e0f2fe; color: #0369a1; } -.wiki-badge-groesse--mittel { background: #fef9c3; color: #854d0e; } -.wiki-badge-groesse--gross { background: #fce7f3; color: #9d174d; } +.wiki-badge-groesse--klein { background: #e0f2fe; color: #0369a1; } +.wiki-badge-groesse--mittel { background: #fef9c3; color: #854d0e; } +.wiki-badge-groesse--gross { background: #fce7f3; color: #9d174d; } +.wiki-badge-groesse--sehr_gross { background: #f3e8ff; color: #6b21a8; } .wiki-badge-aktivitaet--niedrig { background: #dcfce7; color: #166534; } .wiki-badge-aktivitaet--mittel { background: #fef3c7; color: #92400e; } diff --git a/backend/static/index.html b/backend/static/index.html index 14b694d..85f466e 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -187,7 +187,7 @@