gmao/app_new/lots/routes.py

98 lines
3.6 KiB
Python

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