updated logs and players page

This commit is contained in:
2025-06-29 16:37:59 +03:00
parent f20a606183
commit 73c41303a9
22 changed files with 847 additions and 57 deletions

102
app.py
View File

@@ -5,13 +5,14 @@ import subprocess
from werkzeug.utils import secure_filename
from functools import wraps
from extensions import db, bcrypt, login_manager
from sqlalchemy import text
# First import models
from models import User, Player, Content, Group, ServerLog
# Then import utilities that use the models
from flask_login import login_user, logout_user, login_required, current_user
from utils.logger import get_recent_logs, log_action, log_upload, log_process
from utils.logger import get_recent_logs, log_action, log_upload, log_process, log_user_deleted, log_user_created
from utils.group_player_management import (
create_group as create_group_util,
edit_group as edit_group_util,
@@ -19,7 +20,12 @@ from utils.group_player_management import (
add_player as add_player_util,
edit_player as edit_player_util,
delete_player as delete_player_util,
get_group_content
get_group_content,
get_player_content,
update_player_content_order,
update_group_content_order,
edit_group_media,
delete_group_media
)
# Finally, import modules that depend on both models and logger
@@ -156,9 +162,6 @@ def upload_content():
return render_template('upload_content.html', target_type=target_type, target_id=target_id,
players=players, groups=groups, return_url=return_url)
@app.route('/admin')
@login_required
@admin_required
@@ -216,7 +219,7 @@ def create_user():
@login_required
def player_page(player_id):
player = db.session.get(Player, player_id)
content = Content.query.filter_by(player_id=player_id).all()
content = get_player_content(player_id)
return render_template('player_page.html', player=player, content=content)
@app.route('/player/<int:player_id>/upload', methods=['POST'])
@@ -486,6 +489,10 @@ def create_group():
def manage_group(group_id):
group = Group.query.get_or_404(group_id)
content = get_group_content(group_id)
# Debug content ordering
print("Group content positions before sorting:", [(c.id, c.file_name, c.position) for c in content])
content = sorted(content, key=lambda c: c.position)
print("Group content positions after sorting:", [(c.id, c.file_name, c.position) for c in content])
return render_template('manage_group.html', group=group, content=content)
@app.route('/group/<int:group_id>/edit', methods=['GET', 'POST'])
@@ -516,39 +523,34 @@ def delete_group(group_id):
@login_required
def group_fullscreen(group_id):
group = Group.query.get_or_404(group_id)
content = Content.query.filter(Content.player_id.in_([player.id for player in group.players])).all()
content = Content.query.filter(Content.player_id.in_([player.id for player in group.players])).order_by(Content.position).all()
return render_template('group_fullscreen.html', group=group, content=content)
@app.route('/group/<int:group_id>/media/<int:content_id>/edit', methods=['POST'])
@login_required
@admin_required
def edit_group_media(group_id, content_id):
group = Group.query.get_or_404(group_id)
def edit_group_media_route(group_id, content_id):
new_duration = int(request.form['duration'])
success = edit_group_media(group_id, content_id, new_duration)
# Update the duration for all players in the group
for player in group.players:
content = Content.query.filter_by(player_id=player.id, file_name=Content.query.get(content_id).file_name).first()
if content:
content.duration = new_duration
if success:
flash('Media duration updated successfully.', 'success')
else:
flash('Error updating media duration.', 'danger')
db.session.commit()
return redirect(url_for('manage_group', group_id=group_id))
@app.route('/group/<int:group_id>/media/<int:content_id>/delete', methods=['POST'])
@login_required
@admin_required
def delete_group_media(group_id, content_id):
group = Group.query.get_or_404(group_id)
file_name = Content.query.get(content_id).file_name
def delete_group_media_route(group_id, content_id):
success = delete_group_media(group_id, content_id)
# Delete the media for all players in the group
for player in group.players:
content = Content.query.filter_by(player_id=player.id, file_name=file_name).first()
if content:
db.session.delete(content)
if success:
flash('Media deleted successfully.', 'success')
else:
flash('Error deleting media.', 'danger')
db.session.commit()
return redirect(url_for('manage_group', group_id=group_id))
@app.route('/api/playlist_version', methods=['GET'])
@@ -571,5 +573,55 @@ def get_playlist_version():
'hashed_quickconnect': player.quickconnect_password
})
@app.route('/player/<int:player_id>/update_order', methods=['POST'])
@login_required
def update_content_order(player_id):
if not request.is_json:
return jsonify({'success': False, 'error': 'Invalid request format'}), 400
player = Player.query.get_or_404(player_id)
if player.groups and current_user.role != 'admin':
return jsonify({'success': False, 'error': 'Cannot reorder playlist for players in groups'}), 403
items = request.json.get('items', [])
success, error, new_version = update_player_content_order(player_id, items)
if success:
return jsonify({'success': True, 'new_version': new_version})
else:
return jsonify({'success': False, 'error': error}), 500
@app.route('/group/<int:group_id>/update_order', methods=['POST'])
@login_required
@admin_required
def update_group_content_order_route(group_id):
if not request.is_json:
return jsonify({'success': False, 'error': 'Invalid request format'}), 400
items = request.json.get('items', [])
success, error = update_group_content_order(group_id, items)
if success:
return jsonify({'success': True})
else:
return jsonify({'success': False, 'error': error}), 500
@app.route('/debug/content_positions/<int:group_id>')
@login_required
@admin_required
def debug_content_positions(group_id):
group = Group.query.get_or_404(group_id)
player_ids = [p.id for p in group.players]
# Query directly with SQL to see positions
sql = text("SELECT id, file_name, position, player_id FROM content WHERE player_id IN :player_ids ORDER BY position")
result = db.session.execute(sql, {"player_ids": tuple(player_ids)})
content_data = [{"id": row.id, "file_name": row.file_name, "position": row.position, "player_id": row.player_id} for row in result]
return jsonify(content_data)
# Add this at the end of app.py
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
app.run(debug=True, host='0.0.0.0', port=5000)