98 lines
3.6 KiB
Python
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'))
|