"""Routes salles - GMAO Collège""" from datetime import date, datetime, timedelta from flask import Blueprint, render_template, redirect, url_for, request, flash from flask_login import login_required from app_new.extensions import db from app_new.core.models.college import Room, Zone, Building, RoomType, RoomSchedule from app_new.core.models.equipment import Equipment rooms_bp = Blueprint('rooms', __name__, template_folder='templates') @rooms_bp.route('/') @login_required def index(): """Liste des salles.""" zones_filter = request.args.getlist('zone') or None room_type_id = request.args.get('room_type', type=int) query = Room.query.join(Zone).join(Building) if zones_filter: query = query.filter(Zone.id.in_(zones_filter)) if room_type_id: query = query.filter_by(room_type_id=room_type_id) rooms = query.order_by(Building.name, Zone.name, Room.name).all() zones = Zone.query.join(Building).order_by(Building.name, Zone.name).all() room_types = RoomType.query.order_by(RoomType.name).all() return render_template('equipments/rooms.html', rooms=rooms, zones=zones, room_types=room_types, selected_zones=[int(z) for z in zones_filter] if zones_filter else []) @rooms_bp.route('/') @login_required def detail(id): """Détail d'une salle.""" room = Room.query.get_or_404(id) today = date.today() week_start = today - timedelta(days=today.weekday()) courses = RoomSchedule.query.filter_by( room_id=room.id, week_start=week_start, day_of_week=today.weekday(), ).order_by(RoomSchedule.start_time).all() current_time = datetime.now().time() current_course = next( (course for course in courses if course.start_time <= current_time <= course.end_time), None, ) next_course = next( (course for course in courses if course.start_time > current_time), None, ) if current_course: room_status = { 'status': 'occupee', 'message': 'Salle actuellement occupée', 'course': current_course, 'next_occupied': None, } elif courses: room_status = { 'status': 'libre', 'message': 'Salle libre actuellement', 'course': None, 'next_occupied': next_course.start_time.strftime('%H:%M') if next_course else None, } else: room_status = { 'status': 'inconnu', 'message': "Aucun emploi du temps importé pour cette salle aujourd'hui.", 'course': None, 'next_occupied': None, } equipments = Equipment.query.filter( Equipment.room_id == room.id, Equipment.is_deleted.is_(False), ).order_by(Equipment.name, Equipment.individual_number).all() return render_template('equipments/room_detail.html', room=room, equipments=equipments, courses=courses, room_status=room_status) @rooms_bp.route('/new', methods=['GET', 'POST']) @login_required def create(): """Créer une salle.""" if request.method == 'POST': room = Room( name=request.form.get('name'), code=request.form.get('code') or None, zone_id=request.form.get('zone_id', type=int), building_id=request.form.get('building_id', type=int), room_type_id=request.form.get('room_type_id', type=int), floor=request.form.get('floor', 0, type=int) ) db.session.add(room) db.session.commit() flash(f"Salle '{room.name}' créée.", 'success') return redirect(url_for('rooms.index')) zones = Zone.query.join(Building).order_by(Building.name, Zone.name).all() room_types = RoomType.query.order_by(RoomType.name).all() return render_template('equipments/room_form.html', zones=zones, room_types=room_types) @rooms_bp.route('//edit', methods=['GET', 'POST']) @login_required def edit(id): """Modifier une salle.""" room = Room.query.get_or_404(id) if request.method == 'POST': room.name = request.form.get('name') room.code = request.form.get('code') or None room.zone_id = request.form.get('zone_id', type=int) room.building_id = request.form.get('building_id', type=int) room.room_type_id = request.form.get('room_type_id', type=int) room.floor = request.form.get('floor', 0, type=int) db.session.commit() flash(f"Salle '{room.name}' mise à jour.", 'success') return redirect(url_for('rooms.index')) zones = Zone.query.join(Building).order_by(Building.name, Zone.name).all() room_types = RoomType.query.order_by(RoomType.name).all() return render_template('equipments/room_form.html', room=room, zones=zones, room_types=room_types) @rooms_bp.route('//delete', methods=['POST']) @login_required def delete(id): """Supprimer une salle.""" room = Room.query.get_or_404(id) db.session.delete(room) db.session.commit() flash(f"Salle '{room.name}' supprimée.", 'success') return redirect(url_for('rooms.index'))