""" Lots Routes - GMAO Collège Gestion des lots de maintenance """ from flask import Blueprint, render_template, request, flash, redirect, url_for from flask_login import login_required from app_new.extensions import db from ..core.models.maintenance import Lot, LotTask from ..core.models.company import Company from ..core.models.equipment import Equipment lots_bp = Blueprint('lots', __name__) @lots_bp.route('/') @login_required def index(): """Liste des lots.""" page = request.args.get('page', 1, type=int) search = (request.args.get('search') or '').strip() company_id = request.args.get('company_id', type=int) presence = request.args.get('presence', '') query = Lot.query if search: query = query.filter(Lot.name.ilike(f'%{search}%')) if company_id: query = query.filter(Lot.company_id == company_id) if presence == 'present': query = query.filter(Lot.is_present.is_(True)) elif presence == 'absent': query = query.filter(Lot.is_present.is_(False)) lots = query.order_by(Lot.name).paginate(page=page, per_page=50, error_out=False) companies = Company.query.order_by(Company.name).all() return render_template('lots/index.html', lots=lots, companies=companies) @lots_bp.route('/') @login_required def detail(id): """Détail d'un lot.""" lot = Lot.query.get_or_404(id) # Récupérer les équipements de ce lot equipments = Equipment.query.filter_by(lot_id=id).order_by(Equipment.name).all() return render_template('lots/detail.html', lot=lot, equipments=equipments) @lots_bp.route('//edit', methods=['GET', 'POST']) @login_required def edit(id): """Modifier un lot (formulaire).""" lot = Lot.query.get_or_404(id) if request.method == 'POST': lot.company_id = request.form.get('company_id', type=int) lot.absence_reason = (request.form.get('absence_reason') or '').strip() or None db.session.commit() flash('Lot modifié.', 'success') return redirect(url_for('lots.detail', id=id)) companies = Company.query.order_by(Company.name).all() return render_template('lots/edit.html', lot=lot, companies=companies) @lots_bp.route('//presence', methods=['POST']) @login_required def set_presence(id): """Marquer un lot comme présent ou non présent dans l'établissement.""" lot = Lot.query.get_or_404(id) action = request.form.get('action') if action == 'absent': if lot.active_equipment_count: flash( f"Impossible de marquer ce lot non présent : " f"{lot.active_equipment_count} équipement(s) y sont encore rattachés.", 'danger', ) else: lot.is_present = False lot.absence_reason = (request.form.get('absence_reason') or '').strip() or None db.session.commit() flash(f"Le lot « {lot.name} » est marqué non présent.", 'success') elif action == 'present': lot.is_present = True lot.absence_reason = None db.session.commit() flash(f"Le lot « {lot.name} » est marqué présent.", 'success') else: flash('Action de présence invalide.', 'danger') return redirect(request.referrer or url_for('lots.detail', id=id)) @lots_bp.route('//delete', methods=['POST']) @login_required def delete(id): """Supprimer un lot.""" lot = Lot.query.get_or_404(id) # TODO: suppression avec déplacement vers corbeille flash("Fonctionnalité en cours de développement", "info") return redirect(url_for('lots.index'))