diff --git a/server.py b/server.py index 16165aa..4eb127a 100644 --- a/server.py +++ b/server.py @@ -175,6 +175,15 @@ def admin(): # Get all files for management all_files = MediaFile.query.filter_by(is_active=True).order_by(MediaFile.upload_date.desc()).all() + # Get all users + all_users = User.query.order_by(User.username).all() + + # Get all players + all_players = Player.query.order_by(Player.device_id).all() + + # Get all channels for player assignment + all_channels = StreamingChannel.query.filter_by(is_active=True).order_by(StreamingChannel.name).all() + return render_template('admin.html', total_files=total_files, total_users=total_users, @@ -182,7 +191,10 @@ def admin(): total_channels=total_channels, recent_activity=recent_activity, recent_files=recent_files, - all_files=all_files) + all_files=all_files, + all_users=all_users, + all_players=all_players, + all_channels=all_channels) @app.route('/user') @login_required @@ -304,6 +316,135 @@ def add_channel(): return redirect(url_for('view_channels')) +# User Management Routes +@app.route('/add_user', methods=['POST']) +@login_required +def add_user(): + if current_user.role != 'admin': + flash('Access denied. Admin privileges required.', 'error') + return redirect(request.referrer) + + try: + # Check if username already exists + existing_user = User.query.filter_by(username=request.form['username']).first() + if existing_user: + flash('Username already exists.', 'error') + return redirect(request.referrer) + + # Check if email already exists + existing_email = User.query.filter_by(email=request.form['email']).first() + if existing_email: + flash('Email already exists.', 'error') + return redirect(request.referrer) + + user = User( + username=request.form['username'], + email=request.form['email'], + role=request.form.get('role', 'user') + ) + user.set_password(request.form['password']) + + db.session.add(user) + db.session.commit() + + log_activity('User created', f'Created user: {user.username} ({user.role})') + flash(f'User "{user.username}" created successfully!', 'success') + except Exception as e: + flash(f'Error creating user: {str(e)}', 'error') + + return redirect(url_for('admin')) + +@app.route('/delete_user/') +@login_required +def delete_user(user_id): + if current_user.role != 'admin': + flash('Access denied. Admin privileges required.', 'error') + return redirect(request.referrer) + + user = User.query.get_or_404(user_id) + + # Prevent deleting yourself + if user.id == current_user.id: + flash('You cannot delete your own account.', 'error') + return redirect(request.referrer) + + # Prevent deleting the only admin + if user.role == 'admin' and User.query.filter_by(role='admin').count() <= 1: + flash('Cannot delete the only admin user.', 'error') + return redirect(request.referrer) + + username = user.username + db.session.delete(user) + db.session.commit() + + log_activity('User deleted', f'Deleted user: {username}') + flash(f'User "{username}" deleted successfully!', 'success') + return redirect(url_for('admin')) + +# Player Management Routes +@app.route('/add_player', methods=['POST']) +@login_required +def add_player(): + try: + # Check if device_id already exists + existing_player = Player.query.filter_by(device_id=request.form['device_id']).first() + if existing_player: + flash('Device ID already exists.', 'error') + return redirect(request.referrer) + + player = Player( + device_id=request.form['device_id'], + name=request.form.get('name', ''), + channel_id=int(request.form['channel_id']) if request.form.get('channel_id') else None + ) + + db.session.add(player) + db.session.commit() + + log_activity('Player added', f'Added player: {player.device_id}') + flash(f'Player "{player.device_id}" added successfully!', 'success') + except Exception as e: + flash(f'Error adding player: {str(e)}', 'error') + + return redirect(url_for('admin')) + +@app.route('/delete_player/') +@login_required +def delete_player(player_id): + if current_user.role != 'admin': + flash('Access denied. Admin privileges required.', 'error') + return redirect(request.referrer) + + player = Player.query.get_or_404(player_id) + device_id = player.device_id + + db.session.delete(player) + db.session.commit() + + log_activity('Player deleted', f'Deleted player: {device_id}') + flash(f'Player "{device_id}" deleted successfully!', 'success') + return redirect(url_for('admin')) + +@app.route('/assign_player_channel/', methods=['POST']) +@login_required +def assign_player_channel(player_id): + try: + player = Player.query.get_or_404(player_id) + channel_id = int(request.form['channel_id']) if request.form.get('channel_id') else None + + old_channel = player.channel.name if player.channel else 'None' + player.channel_id = channel_id + new_channel = StreamingChannel.query.get(channel_id).name if channel_id else 'None' + + db.session.commit() + + log_activity('Player channel assigned', f'Player {player.device_id}: {old_channel} → {new_channel}') + flash(f'Player "{player.device_id}" assigned to channel successfully!', 'success') + except Exception as e: + flash(f'Error assigning player: {str(e)}', 'error') + + return redirect(request.referrer) + # API Routes @app.route('/api/content') def api_content(): diff --git a/templates/admin.html b/templates/admin.html index 9da0ca5..4cb6bd1 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -201,18 +201,23 @@
Players Management
-
+
-
- +
+
-
+
-
- +
+
-
+
@@ -226,16 +231,17 @@ Name Device ID - Location + Channel Status + Actions - {% for player in players %} + {% for player in all_players %} - {{ player.name }} + {{ player.name or player.device_id }} {{ player.device_id }} - {{ player.location or '-' }} + {{ player.channel.name if player.channel else 'No Channel' }} {% if player.is_active %} Active @@ -243,6 +249,13 @@ Inactive {% endif %} + + + + + {% endfor %} @@ -259,23 +272,26 @@
Users Management
- +
-
+
-
- +
+
-
- - -
+
-
+
+ +
+
@@ -286,20 +302,32 @@ Username + Email Role + Actions - {% for user in users %} + {% for user in all_users %} {{ user.username }} + {{ user.email }} - {% if user.is_admin %} + {% if user.role == 'admin' %} Admin {% else %} User {% endif %} + + {% if user.id != current_user.id %} + + + + {% endif %} + {% endfor %}