Feature: Ratings, Lightbox, Forum-Standort, Notifications, Routen-Recording, Chat-Picker
- Bewertungssystem (ratings.py): Sterne für Sitter/Walks/Places/Routen - Admin: Server-Log-Viewer + OSM-Cache-Statistiken - Chat: "Neue Nachricht"-Button mit Freundesliste-Picker - Forum: 5 neue Kategorien, Standorteingabe (locationPicker), Absende-Toast, Lightbox - Freunde: Aktivitäts-Filter (Chips), Freundschaftsanfrage → In-App-Notification - Sitter: locationPicker statt manuelle Koordinateneingabe + ratingStars - Tagebuch: Bilder-Lightbox im Detail-View, iOS-Modal-Header-Fix (90svh) - Routen: Start/Stopp-Button wechselt Zustand, nutzt Page_map.isRecording() - Benachrichtigungen: Delete-Button sichtbar, typ-basierte Navigation, Toast-Feedback - OSM: globales Semaphore + 429-Retry-Logic; Scheduler: München-Umland, täglich - SW by-v225, APP_VER 202
This commit is contained in:
parent
aa70a838f2
commit
e56183b642
21 changed files with 648 additions and 175 deletions
|
|
@ -116,6 +116,14 @@ async def stats(user=Depends(require_mod)):
|
|||
media_count = media_diary + media_health
|
||||
routes_total = conn.execute("SELECT COUNT(*) FROM routes").fetchone()[0]
|
||||
events_total = conn.execute("SELECT COUNT(*) FROM events").fetchone()[0]
|
||||
osm_total = conn.execute("SELECT COUNT(*) FROM osm_pois").fetchone()[0]
|
||||
osm_tiles = conn.execute("SELECT COUNT(*) FROM osm_tiles").fetchone()[0]
|
||||
osm_by_type = {
|
||||
row[0]: row[1]
|
||||
for row in conn.execute(
|
||||
"SELECT type, COUNT(*) FROM osm_pois GROUP BY type ORDER BY 2 DESC"
|
||||
).fetchall()
|
||||
}
|
||||
|
||||
return {
|
||||
"users_total": users_total,
|
||||
|
|
@ -131,6 +139,9 @@ async def stats(user=Depends(require_mod)):
|
|||
"media_count": media_count,
|
||||
"routes_total": routes_total,
|
||||
"events_total": events_total,
|
||||
"osm_total": osm_total,
|
||||
"osm_tiles": osm_tiles,
|
||||
"osm_by_type": osm_by_type,
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -438,6 +449,18 @@ async def system_info(user=Depends(require_admin)):
|
|||
}
|
||||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# GET /api/admin/logs
|
||||
# ------------------------------------------------------------------
|
||||
@router.get("/logs")
|
||||
async def get_logs(lines: int = 200, level: str = "", user=Depends(require_admin)):
|
||||
from main import log_buffer
|
||||
entries = list(log_buffer)
|
||||
if level:
|
||||
entries = [e for e in entries if e['l'] == level.upper()]
|
||||
return entries[-lines:]
|
||||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# GET /api/admin/audit
|
||||
# ------------------------------------------------------------------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue