gmao/app_new/equipments/rooms.py
root 4d6e4be906
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
Corriger le détail des salles
2026-08-20 00:06:30 +00:00

140 lines
5.1 KiB
Python

"""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('/<int:id>')
@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('/<int:id>/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('/<int:id>/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'))