""" Group management routes """ from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify from flask_login import login_required from app.models.group import Group from app.models.player import Player from app.utils.group_management import ( create_group, edit_group, delete_group, get_group_content, update_group_content_order ) from app.routes.admin import admin_required bp = Blueprint('group', __name__) @bp.route('/') @login_required @admin_required def index(): """List all groups""" groups = Group.query.order_by(Group.name).all() return render_template('group/index.html', groups=groups) @bp.route('/create', methods=['GET', 'POST']) @login_required @admin_required def create(): """Create new group""" if request.method == 'POST': name = request.form.get('name', '').strip() description = request.form.get('description', '').strip() player_ids = request.form.getlist('players') # Validation if not name: flash('Group name is required.', 'danger') players = Player.query.order_by(Player.username).all() return render_template('group/create.html', players=players) # Convert player IDs to integers try: player_ids = [int(pid) for pid in player_ids if pid] except ValueError: flash('Invalid player selection.', 'danger') players = Player.query.order_by(Player.username).all() return render_template('group/create.html', players=players) # Create group success, result = create_group( name=name, player_ids=player_ids, description=description if description else None ) if success: flash(f'Group "{name}" created successfully.', 'success') return redirect(url_for('group.manage', group_id=result.id)) else: flash(f'Error creating group: {result}', 'danger') players = Player.query.order_by(Player.username).all() return render_template('group/create.html', players=players) @bp.route('/') @login_required @admin_required def manage(group_id): """Manage group content""" group = Group.query.get_or_404(group_id) content = get_group_content(group_id) return render_template('group/manage.html', group=group, content=content) @bp.route('//edit', methods=['GET', 'POST']) @login_required @admin_required def edit(group_id): """Edit group""" group = Group.query.get_or_404(group_id) if request.method == 'POST': name = request.form.get('name', '').strip() description = request.form.get('description', '').strip() player_ids = request.form.getlist('players') # Convert player IDs to integers try: player_ids = [int(pid) for pid in player_ids if pid] except ValueError: flash('Invalid player selection.', 'danger') players = Player.query.order_by(Player.username).all() return render_template('group/edit.html', group=group, players=players) # Update group success, result = edit_group( group_id=group_id, name=name if name else None, player_ids=player_ids, description=description ) if success: flash(f'Group "{result.name}" updated successfully.', 'success') return redirect(url_for('group.manage', group_id=group_id)) else: flash(f'Error updating group: {result}', 'danger') players = Player.query.order_by(Player.username).all() return render_template('group/edit.html', group=group, players=players) @bp.route('//delete', methods=['POST']) @login_required @admin_required def delete(group_id): """Delete group""" group = Group.query.get_or_404(group_id) group_name = group.name success, error = delete_group(group_id) if success: flash(f'Group "{group_name}" deleted successfully.', 'success') else: flash(f'Error deleting group: {error}', 'danger') return redirect(url_for('dashboard.index')) @bp.route('//fullscreen') @login_required def fullscreen(group_id): """Group fullscreen view""" group = Group.query.get_or_404(group_id) content = get_group_content(group_id) return render_template('group/fullscreen.html', group=group, content=content) @bp.route('//update_order', methods=['POST']) @login_required @admin_required def update_order(group_id): """Update content order for group""" 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