Sprint 12+13: Tagebuch Day-One-Redesign, Notiz-Feature, Icon-Fixes, SW by-v405

Tagebuch:
- Day-One-Listenansicht: Wochentag + Tageszahl + Meta-Zeile (Zeit/Ort/Wetter)
- 4 Ansichten: Liste, Medien-Mosaik, Kalender (mit Sprungbuttons), Karte (GPS-Marker)
- Detail-Ansicht inline im Content-Bereich (kein Fullscreen-Overlay mehr)
- Hero-Bild vollständig sichtbar (object-fit:contain), Lightbox mit Safe-Area
- 2-Spalten-Layout Desktop: Text + Leaflet-Karte + POI-Liste
- EXIF-GPS-Extraktion bei Foto-Upload, historisches Wetter via Archive-API
- NoteStation-Import: Fotos in diary_media (80 Einträge migriert, 94 Medien)
- Stats-Endpoints: /diary/stats, /diary/calendar, /diary/locations

Notiz-Feature:
- Generische notes-Tabelle (parent_type + parent_id + meta_json)
- 📝-Button in 8 Bereichen, Notizblock-Seite mit KI-Analyse
- KI-Toggle in Einstellungen, notes_ki_enabled in User-Profil

Icons & Design:
- fill:currentColor Fix für welcome/onboarding/friends.js
- --c-icon Variable, --c-text-muted Dark Mode aufgehellt
- 15+ neue Phosphor-Icons aus lokaler Kopie
- CSS Network-First im SW, Cache-Control-Middleware

Infrastruktur:
- Wiki-Anreicherungs-Scheduler-Jobs entfernt (abgeschlossen)
- auth.py: notes_ki_enabled + is_social_media im User-Response
This commit is contained in:
rene 2026-04-25 20:44:46 +02:00
parent 95f91fdc00
commit 553e9e7854
35 changed files with 4558 additions and 370 deletions

View file

@ -90,14 +90,6 @@ def start():
id="seed_wikidata_startup",
replace_existing=True,
)
# Täglich 02:30 Uhr — KI-Anreicherung für 20 noch nicht angereicherte Rassen
_scheduler.add_job(
_job_wiki_enrich,
CronTrigger(hour=2, minute=30),
id="wiki_enrich_nightly",
replace_existing=True,
misfire_grace_time=3600,
)
# Jeden Montag 09:00 — Wöchentlicher Fortschritts-Lober
_scheduler.add_job(
_job_weekly_praise,
@ -114,16 +106,8 @@ def start():
replace_existing=True,
misfire_grace_time=1800,
)
# Einmalig beim Start (nach 90s) — erste 50 Rassen sofort anreichern
_scheduler.add_job(
_job_wiki_enrich_startup,
'date',
run_date=datetime.now(tz=_TZ) + timedelta(seconds=90),
id="wiki_enrich_startup",
replace_existing=True,
)
_scheduler.start()
logger.info("Scheduler gestartet — Health-Reminder 08:00, Giftköder-Archiv 03:00, Wetter-Alert 07:30, Meilenstein-Check 00:05, Event-Import So 02:00, Rassen-Seed beim Start, Wiki-KI-Anreicherung 02:30.")
logger.info("Scheduler gestartet — Health-Reminder 08:00, Giftköder-Archiv 03:00, Wetter-Alert 07:30, Meilenstein-Check 00:05, Event-Import So 02:00, Rassen-Seed beim Start.")
def stop():
@ -629,35 +613,6 @@ def _log_job(job_id: str, status: str, result: str):
}
# ------------------------------------------------------------------
# JOB: KI-Anreicherung der Rassen-Daten (nächtlich)
# ------------------------------------------------------------------
async def _job_wiki_enrich():
"""Reichert alle noch nicht angereicherten Rassen mit KI-Daten an."""
try:
from scraper.breed_enricher import enrich_breeds
enriched = await enrich_breeds(limit=2000)
msg = f"{enriched} Rassen angereichert"
logger.info(f"Wiki-KI-Anreicherung (nächtlich): {msg}.")
_log_job("wiki_enrich_nightly", "ok", msg)
except Exception as e:
logger.error(f"Wiki-KI-Anreicherung: Fehler: {e}")
_log_job("wiki_enrich_nightly", "error", str(e))
async def _job_wiki_enrich_startup():
"""Beim Start: alle Rassen sofort anreichern."""
try:
from scraper.breed_enricher import enrich_breeds
enriched = await enrich_breeds(limit=2000)
msg = f"{enriched} Rassen angereichert (Startup)"
logger.info(f"Wiki-KI-Anreicherung (Startup): {msg}.")
_log_job("wiki_enrich_startup", "ok", msg)
except Exception as e:
logger.error(f"Wiki-KI-Anreicherung (Startup): Fehler: {e}")
_log_job("wiki_enrich_startup", "error", str(e))
# ------------------------------------------------------------------
# Hilfsfunktion: Lob-Text für einen Hund generieren
# ------------------------------------------------------------------
@ -815,12 +770,6 @@ async def _job_status_report():
metrics = {}
try:
with db() as conn:
# Rassen-Anreicherung
metrics["rassen_total"] = conn.execute("SELECT COUNT(*) FROM wiki_rassen").fetchone()[0]
metrics["rassen_enriched"] = conn.execute("SELECT COUNT(*) FROM wiki_rassen WHERE ki_enriched=1").fetchone()[0]
metrics["rassen_mit_foto"] = conn.execute("SELECT COUNT(*) FROM wiki_rassen WHERE foto_url IS NOT NULL AND foto_url NOT LIKE 'http%'").fetchone()[0]
metrics["rassen_mit_desc"] = conn.execute("SELECT COUNT(*) FROM wiki_rassen WHERE beschreibung IS NOT NULL AND beschreibung != ''").fetchone()[0]
# Züchter
try:
metrics["zuchter_pending"] = conn.execute("SELECT COUNT(*) FROM wiki_zuchter WHERE verified=0").fetchone()[0]
@ -848,16 +797,6 @@ async def _job_status_report():
logger.error(f"Status-Report: DB-Fehler: {e}")
return
# --- Wiki-Fortschritt berechnen ---
total = metrics["rassen_total"] or 1
enriched = metrics["rassen_enriched"]
pct = round(enriched / total * 100)
remaining = total - enriched
nights_left = (remaining + 19) // 20 # bei 20/Nacht
bar_filled = round(pct / 5)
progress_bar = "" * bar_filled + "" * (20 - bar_filled)
# --- Job-Log-Tabelle ---
job_labels = {
"health_reminders": "Gesundheits-Erinnerungen",
@ -865,8 +804,6 @@ async def _job_status_report():
"weather_alert": "Wetter-Alert",
"milestone_check": "Meilenstein-Check",
"import_events": "Event-Import (VDH)",
"wiki_enrich_nightly": "Wiki KI-Anreicherung (nächtlich)",
"wiki_enrich_startup": "Wiki KI-Anreicherung (Startup)",
"seed_breeds_startup": "Rassen-Seed (TheDogAPI)",
"seed_wikidata_startup":"Rassen-Seed (Wikidata)",
"weekly_praise": "Wöchentlicher Lober (Mo 09:00)",
@ -899,18 +836,6 @@ async def _job_status_report():
<div style="opacity:.88;font-size:13px">{now_str} Uhr</div>
</div>
<!-- Wiki-Fortschritt -->
<div style="padding:20px 28px;border-bottom:1px solid #f0e8dc">
<div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:#C4843A;margin-bottom:10px">Wiki KI-Anreicherung</div>
<div style="font-family:monospace;font-size:13px;background:#fdf6ef;border-radius:8px;padding:12px 14px;line-height:1.8">
<span style="color:#555">{progress_bar}</span> <strong>{pct}%</strong><br>
Angereichert: <strong>{enriched}</strong> / {total}<br>
Verbleibend: <strong>{remaining}</strong> Rassen (~{nights_left} Nächte)<br>
📷 Mit lokalem Foto: <strong>{metrics['rassen_mit_foto']}</strong><br>
📝 Mit Beschreibung: <strong>{metrics['rassen_mit_desc']}</strong>
</div>
</div>
<!-- Scheduler-Status -->
<div style="padding:20px 28px;border-bottom:1px solid #f0e8dc">
<div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:#C4843A;margin-bottom:10px">Scheduler-Jobs</div>
@ -947,13 +872,6 @@ async def _job_status_report():
plain = f"""Ban Yaro Status-Report — {now_str}
=== Wiki KI-Anreicherung ===
{progress_bar} {pct}%
Angereichert: {enriched}/{total}
Verbleibend: {remaining} Rassen (~{nights_left} Nächte à 20/Nacht)
Mit Foto: {metrics['rassen_mit_foto']}
Mit Beschreibung: {metrics['rassen_mit_desc']}
=== Scheduler-Jobs ===
{job_rows_txt}
=== Community ===