93 lines
3.5 KiB
Python
93 lines
3.5 KiB
Python
"""Routes salles - GMAO Collège"""
|
|
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
|
|
|
|
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)
|
|
return render_template('equipments/room_detail.html', room=room)
|
|
|
|
|
|
@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'))
|