Session 2026-04-19: Navigation, Kompass, Übungsfortschritt
Routen-Navigation:
- POI-Marker: farbige Kreise mit Phosphor-Icons (wie Hauptkarte)
- Screensaver: Navi-Pfeil dreht sich via DeviceOrientationEvent (iOS+Android)
- Pfeil-Dämpfung: EMA α=0.12 mit Wrap-Around
- GPS-Distanz-Bug: Fortschritt nur wenn <500m zur Route
- fitBounds: User-Position nur wenn <20km von Route
- Screensaver: "zur Route" vs "verbleibend" kontextabhängig
- Richtungspfeile entlang Route (blau, max 7 Stück)
- Umkehren ins Route-Detail verschoben, Detail-Map rebuildet sich
- rk-header z-index:10 (Leaflet-Tiles liefen drüber)
- 2-Sek. Screensaver-Entsperrung
km-Tracking:
- route_walks Tabelle
- POST /api/routes/{id}/walked (≥50%)
- total_km = erstellte Routes + gelaufene route_walks
- Toast bei neuem Badge
Übungsfortschritt:
- exercise_progress + training_plan_progress Tabellen
- GET/POST /api/training/progress, /plan-progress, /suggestions
- uebungen.js: API-first + localStorage-Fallback + Auto-Migration
- Empfehlungs-Banner (regelbasiert)
- Toast bei "sitzt"
This commit is contained in:
parent
390176383f
commit
9a78121a3e
25 changed files with 2487 additions and 248 deletions
|
|
@ -449,6 +449,8 @@ async def delete_diary(dog_id: int, entry_id: int, user=Depends(get_current_user
|
|||
|
||||
def _guess_media_type(content_type: str, filename: str) -> str:
|
||||
ct = (content_type or "").lower()
|
||||
if ct == "application/pdf" or (filename or "").lower().endswith(".pdf"):
|
||||
return "pdf"
|
||||
if ct.startswith("video/"):
|
||||
return "video"
|
||||
ext = os.path.splitext(filename or "")[1].lower()
|
||||
|
|
@ -475,13 +477,14 @@ async def upload_media(dog_id: int, entry_id: int,
|
|||
ALLOWED = {
|
||||
"image/jpeg", "image/png", "image/gif", "image/webp", "image/heic", "image/heif",
|
||||
"video/mp4", "video/quicktime", "video/webm", "video/x-m4v",
|
||||
"application/pdf",
|
||||
}
|
||||
ct = file.content_type or ""
|
||||
if ct not in ALLOWED:
|
||||
ext_low = os.path.splitext(file.filename or "")[1].lower()
|
||||
if ext_low not in {".jpg",".jpeg",".png",".gif",".webp",".heic",".heif",
|
||||
".mp4",".mov",".webm",".m4v"}:
|
||||
raise HTTPException(415, "Nur Bilder und Videos erlaubt.")
|
||||
".mp4",".mov",".webm",".m4v",".pdf"}:
|
||||
raise HTTPException(415, "Nur Bilder, Videos und PDFs erlaubt.")
|
||||
|
||||
ext = os.path.splitext(file.filename or "")[1] or ".jpg"
|
||||
filename = f"diary_{entry_id}_{uuid.uuid4().hex[:8]}{ext}"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue