diff --git a/backend/routers/exercises.py b/backend/routers/exercises.py index d3571b4..53f8d3d 100644 --- a/backend/routers/exercises.py +++ b/backend/routers/exercises.py @@ -2186,6 +2186,20 @@ async def upload_exercise_media( ), ) elif lc in ("trash_soft", "trash_hidden"): + logger.warning( + "exercise_media_upload_conflict MEDIA_ASSET_IN_TRASH exercise_id=%s profile_id=%s " + "media_asset_id=%s lifecycle_state=%s visibility=%s club_id=%s sha256_prefix=%s " + "upload_filename=%s stored_original_filename=%s", + exercise_id, + profile_id, + ea["id"], + lc, + ex_vis, + ex_club, + full_sha[:16], + (file.filename or "")[:200], + (ea.get("original_filename") or "")[:200], + ) raise HTTPException( status_code=409, detail={ @@ -2200,6 +2214,17 @@ async def upload_exercise_media( }, ) else: + logger.warning( + "exercise_media_upload_conflict MEDIA_ASSET_UNAVAILABLE exercise_id=%s profile_id=%s " + "media_asset_id=%s lifecycle_state=%s visibility=%s club_id=%s sha256_prefix=%s", + exercise_id, + profile_id, + ea["id"], + lc, + ex_vis, + ex_club, + full_sha[:16], + ) raise HTTPException( status_code=409, detail={ diff --git a/backend/version.py b/backend/version.py index 7565f0e..b48919c 100644 --- a/backend/version.py +++ b/backend/version.py @@ -1,6 +1,6 @@ # Shinkan Jinkendo Version Information -APP_VERSION = "0.8.45" +APP_VERSION = "0.8.46" BUILD_DATE = "2026-05-07" DB_SCHEMA_VERSION = "20260507045" @@ -17,7 +17,7 @@ MODULE_VERSIONS = { "groups": "0.1.0", "skills": "0.1.0", "methods": "0.1.0", - "exercises": "2.15.0", # Upload: 409 MEDIA_ASSET_IN_TRASH bei Papierkorb-Dedupe (SHA + visibility + club) + "exercises": "2.15.1", # Upload 409: strukturiertes Logging "training_units": "0.2.0", "training_programs": "0.1.0", "planning": "0.8.1", # Vorlagen Leseprüfung library_content_visible_to_profile @@ -29,6 +29,14 @@ MODULE_VERSIONS = { } CHANGELOG = [ + { + "version": "0.8.46", + "date": "2026-05-07", + "changes": [ + "Übung Medien-Upload: bei 409-Konflikt (Papierkorb-Dedupe) logger.warning mit exercise_id, profile_id, media_asset_id, lifecycle, visibility, club_id, sha256_prefix, Dateinamen", + "ExerciseFormPage: erklärende Medien-Hinweistexte in GUI entfernt (Kurzbeschreibung + Archiv-Dialog)", + ], + }, { "version": "0.8.45", "date": "2026-05-07", diff --git a/frontend/src/pages/ExerciseFormPage.jsx b/frontend/src/pages/ExerciseFormPage.jsx index edb3ec0..b6c1d0e 100644 --- a/frontend/src/pages/ExerciseFormPage.jsx +++ b/frontend/src/pages/ExerciseFormPage.jsx @@ -1390,8 +1390,7 @@ function ExerciseFormPage() {

Medien

- Datei oder Embed (YouTube, Vimeo, Instagram, TikTok). Max. 10 pro Übung. Archiv-Medien mehrfach nutzbar. - Papierkorb und Freigaben steuern Sie zentral im Archiv — hier nur Verknüpfung zur Übung. + Datei oder Embed (YouTube, Vimeo, Instagram, TikTok). Max. 10 pro Übung.

setArchiveOpen(true)}> Aus Archiv verknüpfen… - - Sichtbare, bereits gespeicherte Dateien erneut nutzen (ein Speicherplatz, mehrere Übungen). -
@@ -1529,18 +1525,6 @@ function ExerciseFormPage() { (m.embed_url ? m.embed_url : '') || '—'}
- {m.media_asset_id && - String(m.asset_lifecycle_state || 'active').toLowerCase() === 'trash_soft' && ( -

- Hinweis: Dieses Archiv-Medium ist im Papierkorb (Stufe 1). -

- )} - {m.media_asset_id && - String(m.asset_lifecycle_state || 'active').toLowerCase() === 'trash_hidden' && ( -

- Hinweis: Archiv-Medium ausgeblendet (Stufe 2) — in der Übungsansicht unsichtbar. -

- )}
e.stopPropagation()} >

Medienarchiv

-

- Nur aktive Medien, die Sie lesen dürfen (offiziell, eigenes privat, Ihre Vereine). -