updated logs and players page
This commit is contained in:
102
app.py
102
app.py
@@ -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)
|
||||
Reference in New Issue
Block a user