chore: increment version to 0.8.46 and update changelog
All checks were successful
Deploy Development / deploy (push) Successful in 35s
Test Suite / pytest-backend (push) Successful in 28s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 7s
Test Suite / playwright-tests (push) Successful in 23s

- Updated APP_VERSION to 0.8.46 and MODULE_VERSIONS for exercises to 2.15.1.
- Added structured logging for media upload conflicts in the backend.
- Removed explanatory media hints from the ExerciseFormPage in the frontend to streamline the user interface.
This commit is contained in:
Lars 2026-05-07 13:30:25 +02:00
parent da368222e0
commit 88fb60e244
3 changed files with 36 additions and 22 deletions

View File

@ -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={

View File

@ -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",

View File

@ -1390,8 +1390,7 @@ function ExerciseFormPage() {
<div className="card" style={{ marginTop: '16px' }}>
<h2 style={{ marginTop: 0, fontSize: '1.1rem' }}>Medien</h2>
<p style={{ color: 'var(--text2)', fontSize: '13px' }}>
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.
</p>
<div
style={{
@ -1405,9 +1404,6 @@ function ExerciseFormPage() {
<button type="button" className="btn btn-secondary" onClick={() => setArchiveOpen(true)}>
Aus Archiv verknüpfen
</button>
<span style={{ fontSize: '12px', color: 'var(--text3)' }}>
Sichtbare, bereits gespeicherte Dateien erneut nutzen (ein Speicherplatz, mehrere Übungen).
</span>
</div>
<div style={{ display: 'grid', gap: '12px', marginTop: '12px' }}>
<div>
@ -1529,18 +1525,6 @@ function ExerciseFormPage() {
(m.embed_url ? m.embed_url : '') ||
'—'}
</div>
{m.media_asset_id &&
String(m.asset_lifecycle_state || 'active').toLowerCase() === 'trash_soft' && (
<p style={{ color: 'var(--danger)', margin: '8px 0 0', fontSize: '12px' }}>
Hinweis: Dieses Archiv-Medium ist im Papierkorb (Stufe 1).
</p>
)}
{m.media_asset_id &&
String(m.asset_lifecycle_state || 'active').toLowerCase() === 'trash_hidden' && (
<p style={{ color: 'var(--danger)', margin: '8px 0 0', fontSize: '12px' }}>
Hinweis: Archiv-Medium ausgeblendet (Stufe 2) in der Übungsansicht unsichtbar.
</p>
)}
<div className="form-row" style={{ marginTop: '8px', display: 'grid', gap: '8px' }}>
<input
type="text"
@ -1627,9 +1611,6 @@ function ExerciseFormPage() {
onClick={(e) => e.stopPropagation()}
>
<h3 style={{ marginTop: 0, fontSize: '1.05rem' }}>Medienarchiv</h3>
<p style={{ fontSize: '13px', color: 'var(--text2)', marginTop: 0 }}>
Nur aktive Medien, die Sie lesen dürfen (offiziell, eigenes privat, Ihre Vereine).
</p>
<input
type="search"
className="form-input"