feat(digiserver-v2): port edited media report and deploy badge features from standalone

- Added edited_media_report route to players blueprint with tabular report view
- Created edited_media_report.html template with summary stats, dark mode, print/PDF support
- Created _deploy_badge.html partial template for deployment status display
- Added deployment status column and badge CSS to players_list.html
- Added 'View Report' button to manage_player.html next to 'View All Edited Media'
- Fixed api.py receive_edited_media with robust content lookup:
  - Fallback content lookup by regex path matching (edited_media/<id>/)
  - Fallback via PlayerEdit record if direct lookup fails
  - First-edit original file preservation (moves original to versionized folder)

Enterprise-specific features (portal SSO, internal sync, playlist permissions, WAL mode) are preserved unchanged.
This commit is contained in:
ske087
2026-07-21 10:42:31 +03:00
parent 83a8f79c36
commit cdaa17803a
6 changed files with 509 additions and 2 deletions
+34
View File
@@ -460,6 +460,40 @@ def edited_media(player_id: int):
return redirect(url_for('players.manage_player', player_id=player_id))
@players_bp.route('/<int:player_id>/edited-media-report')
@login_required
def edited_media_report(player_id: int):
"""Display a tabular report of all edited media from this player."""
try:
player = Player.query.get_or_404(player_id)
from app.models.player_edit import PlayerEdit
from app.models.player_user import PlayerUser
edited_media = PlayerEdit.query.filter_by(player_id=player_id)\
.order_by(PlayerEdit.created_at.desc())\
.all()
# Build user display name mapping
user_mappings = {}
for edit in edited_media:
if edit.user and edit.user not in user_mappings:
player_user = PlayerUser.query.filter_by(user_code=edit.user).first()
if player_user and player_user.user_name:
user_mappings[edit.user] = player_user.user_name
else:
user_mappings[edit.user] = edit.user
return render_template('players/edited_media_report.html',
player=player,
edited_media=edited_media,
user_mappings=user_mappings)
except Exception as e:
log_action('error', f'Error loading edited media report for player {player_id}: {str(e)}')
flash('Error loading edited media report.', 'danger')
return redirect(url_for('players.manage_player', player_id=player_id))
@players_bp.route('/<int:player_id>/fullscreen')
def player_fullscreen(player_id: int):
"""Display player fullscreen view (no authentication required for players)."""