import os from flask import Flask, render_template, request, redirect, url_for from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user from flask_bcrypt import Bcrypt from werkzeug.utils import secure_filename from functools import wraps from flask_migrate import Migrate app = Flask(__name__) # Set the secret key to a fixed value app.config['SECRET_KEY'] = 'Ana_Are_Multe_Mere-Si_Nu_Are_Pere' # Configurare baza de date SQLite app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///dashboard.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) bcrypt = Bcrypt(app) UPLOAD_FOLDER = 'static/uploads' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER # Ensure the upload folder exists if not os.path.exists(UPLOAD_FOLDER): os.makedirs(UPLOAD_FOLDER) login_manager = LoginManager(app) login_manager.login_view = 'login' migrate = Migrate(app, db) @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) # Modele pentru baza de date class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password = db.Column(db.String(120), nullable=False) role = db.Column(db.String(20), nullable=False, default='user') class Player(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), nullable=False) hostname = db.Column(db.String(120), nullable=False) ip = db.Column(db.String(15), nullable=False) password = db.Column(db.String(120), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id', name='fk_user_id'), nullable=True) class Group(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), unique=True, nullable=False) players = db.relationship('Player', secondary='group_players', backref='groups') content = db.relationship('Content', backref='group', lazy=True) group_players = db.Table('group_players', db.Column('group_id', db.Integer, db.ForeignKey('group.id'), primary_key=True), db.Column('player_id', db.Integer, db.ForeignKey('player.id'), primary_key=True) ) class Content(db.Model): id = db.Column(db.Integer, primary_key=True) file_name = db.Column(db.String(120), nullable=False) duration = db.Column(db.Integer, nullable=False) player_id = db.Column(db.Integer, db.ForeignKey('player.id'), nullable=True) group_id = db.Column(db.Integer, db.ForeignKey('group.id'), nullable=True) def admin_required(f): @wraps(f) def decorated_function(*args, **kwargs): if current_user.role != 'admin': return redirect(url_for('dashboard')) return f(*args, **kwargs) return decorated_function @app.route('/') @login_required def dashboard(): players = Player.query.all() groups = Group.query.all() return render_template('dashboard.html', players=players, groups=groups) @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] hashed_password = bcrypt.generate_password_hash(password).decode('utf-8') new_user = User(username=username, password=hashed_password, role='user') db.session.add(new_user) db.session.commit() return redirect(url_for('login')) return render_template('register.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] user = User.query.filter_by(username=username).first() if user and bcrypt.check_password_hash(user.password, password): login_user(user) return redirect(url_for('dashboard')) return render_template('login.html') @app.route('/logout') @login_required def logout(): logout_user() return redirect(url_for('login')) @app.route('/upload_content', methods=['GET', 'POST']) @login_required def upload_content(): if request.method == 'POST': target_type = request.form['target_type'] target_id = request.form['target_id'] files = request.files.getlist('files') duration = int(request.form['duration']) for file in files: filename = secure_filename(file.filename) file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(file_path) new_content = Content(file_name=filename, duration=duration, player_id=target_id if target_type == 'player' else None, group_id=target_id if target_type == 'group' else None) db.session.add(new_content) db.session.commit() return redirect(url_for('dashboard')) return render_template('upload_content.html') @app.route('/admin') @login_required @admin_required def admin(): users = User.query.all() return render_template('admin.html', users=users) @app.route('/admin/change_role/', methods=['POST']) @login_required @admin_required def change_role(user_id): user = User.query.get_or_404(user_id) new_role = request.form['role'] user.role = new_role db.session.commit() return redirect(url_for('admin')) @app.route('/admin/delete_user/', methods=['POST']) @login_required @admin_required def delete_user(user_id): user = User.query.get_or_404(user_id) db.session.delete(user) db.session.commit() return redirect(url_for('admin')) @app.route('/admin/create_user', methods=['POST']) @login_required @admin_required def create_user(): username = request.form['username'] password = request.form['password'] role = request.form['role'] hashed_password = bcrypt.generate_password_hash(password).decode('utf-8') new_user = User(username=username, password=hashed_password, role=role) db.session.add(new_user) db.session.commit() return redirect(url_for('admin')) @app.route('/group//manage') @login_required @admin_required def manage_group(group_id): group = Group.query.get_or_404(group_id) available_players = Player.query.filter(~Player.groups.any(Group.id == group_id)).all() return render_template('manage_group.html', group=group, available_players=available_players) @app.route('/group//add_player', methods=['POST']) @login_required @admin_required def add_player_to_group(group_id): group = Group.query.get_or_404(group_id) player_id = request.form['player_id'] player = Player.query.get_or_404(player_id) group.players.append(player) db.session.commit() return redirect(url_for('manage_group', group_id=group_id)) @app.route('/group//remove_player/', methods=['POST']) @login_required @admin_required def remove_player_from_group(group_id, player_id): group = Group.query.get_or_404(group_id) player = Player.query.get_or_404(player_id) group.players.remove(player) db.session.commit() return redirect(url_for('manage_group', group_id=group_id)) @app.route('/group//upload', methods=['POST']) @login_required @admin_required def upload_content_to_group(group_id): group = Group.query.get_or_404(group_id) files = request.files.getlist('files') duration = int(request.form['duration']) for file in files: filename = secure_filename(file.filename) file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(file_path) new_content = Content(file_name=filename, duration=duration, group_id=group_id) db.session.add(new_content) db.session.commit() return redirect(url_for('manage_group', group_id=group_id)) @app.route('/group/content//edit', methods=['POST']) @login_required @admin_required def edit_group_content(content_id): content = Content.query.get_or_404(content_id) new_duration = int(request.form['duration']) content.duration = new_duration db.session.commit() return redirect(url_for('manage_group', group_id=content.group_id)) @app.route('/group/content//delete', methods=['POST']) @login_required @admin_required def delete_group_content(content_id): content = Content.query.get_or_404(content_id) group_id = content.group_id db.session.delete(content) db.session.commit() return redirect(url_for('manage_group', group_id=group_id)) @app.route('/player/') @login_required def player_page(player_id): player = Player.query.get_or_404(player_id) content = Content.query.filter_by(player_id=player_id).all() return render_template('player_page.html', player=player, content=content) @app.route('/player//upload', methods=['POST']) @login_required def upload_content_to_player(player_id): player = Player.query.get_or_404(player_id) files = request.files.getlist('files') duration = int(request.form['duration']) for file in files: filename = secure_filename(file.filename) file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(file_path) new_content = Content(file_name=filename, duration=duration, player_id=player_id) db.session.add(new_content) db.session.commit() return redirect(url_for('player_page', player_id=player_id)) @app.route('/content//edit', methods=['POST']) @login_required def edit_content(content_id): content = Content.query.get_or_404(content_id) new_duration = int(request.form['duration']) content.duration = new_duration db.session.commit() return redirect(url_for('player_page', player_id=content.player_id)) @app.route('/content//delete', methods=['POST']) @login_required def delete_content(content_id): content = Content.query.get_or_404(content_id) player_id = content.player_id db.session.delete(content) db.session.commit() return redirect(url_for('player_page', player_id=player_id)) @app.route('/player//fullscreen') @login_required def player_fullscreen(player_id): player = Player.query.get_or_404(player_id) if player.groups: # If the player is part of a group, get the group's content group = player.groups[0] # Assuming a player can only be in one group content = Content.query.filter_by(group_id=group.id).all() else: # If the player is not part of a group, get the player's content content = Content.query.filter_by(player_id=player_id).all() return render_template('player_fullscreen.html', player=player, content=content) @app.route('/player//delete', methods=['POST']) @login_required @admin_required def delete_player(player_id): player = Player.query.get_or_404(player_id) db.session.delete(player) db.session.commit() return redirect(url_for('dashboard')) @app.route('/player/add', methods=['GET', 'POST']) @login_required @admin_required def add_player(): if request.method == 'POST': username = request.form['username'] hostname = request.form['hostname'] ip = request.form['ip'] password = request.form['password'] hashed_password = bcrypt.generate_password_hash(password).decode('utf-8') new_player = Player(username=username, hostname=hostname, ip=ip, password=hashed_password) db.session.add(new_player) db.session.commit() return redirect(url_for('dashboard')) return render_template('add_player.html') @app.route('/group/add', methods=['GET', 'POST']) @login_required @admin_required def add_group(): if request.method == 'POST': name = request.form['name'] new_group = Group(name=name) db.session.add(new_group) db.session.commit() return redirect(url_for('dashboard')) return render_template('add_group.html') if __name__ == '__main__': with app.app_context(): db.create_all() # Creează toate tabelele app.run(debug=True)