gmao/app_new/equipments/meters.py

154 lines
5.8 KiB
Python
Raw Normal View History

2026-08-14 18:02:25 +02:00
"""Equipments Meters Routes - GMAO Collège"""
from flask import Blueprint, render_template, redirect, url_for, request, flash, jsonify
from flask_login import login_required, current_user
from datetime import datetime
from app_new.extensions import db
from ..core.models.equipment import Equipment, EquipmentCategory, EquipmentDocument, EquipmentRoomHistory, EquipmentRestriction
from ..core.models.college import Room, Building, RoomType, Zone
from ..core.models.maintenance import Lot, Intervention
from ..core.models.planning import Meter, MeterReading, Consumable, EquipmentConsumable, ScheduledTask
from app_new.constants import EQUIPMENT_STATUSES
def _empty_to_none(v):
"""Convertit une chaîne vide en None."""
return None if v == '' else v
meters_bp = Blueprint("equipments_meters", __name__, template_folder='templates')
@meters_bp.route('/lots')
@login_required
def lots():
"""Liste des lots."""
lots = Lot.query.order_by(Lot.name).all()
categories = EquipmentCategory.query.order_by(EquipmentCategory.name).all()
return render_template('equipments/lots.html', title='Lots', lots=lots, categories=categories)
@meters_bp.route('/lots/new', methods=['GET', 'POST'])
@login_required
def create_lot():
"""Créer un lot."""
categories = EquipmentCategory.query.order_by(EquipmentCategory.name).all()
if request.method == 'POST':
lot = Lot(
name=request.form.get('name'),
category_id=request.form.get('category_id') or None
)
db.session.add(lot)
db.session.commit()
flash(f"Lot '{lot.name}' créé.", 'success')
return redirect(url_for('equipments_meters.lots'))
return render_template('equipments/lot_form.html',
title='Nouveau lot', categories=categories)
@meters_bp.route('/lots/<int:id>', methods=['GET', 'POST'])
@login_required
def lot_detail(id):
"""Détails et modification d'un lot."""
lot = Lot.query.get_or_404(id)
categories = EquipmentCategory.query.order_by(EquipmentCategory.name).all()
# Récupérer les équipements de ce lot
equipments = Equipment.query.filter_by(lot_id=id).order_by(Equipment.name).all()
if request.method == 'POST':
lot.name = request.form.get('name')
lot.category_id = request.form.get('category_id') or None
db.session.commit()
flash(f"Lot '{lot.name}' modifié.", 'success')
return redirect(url_for('equipments_meters.lots'))
return render_template('equipments/lot_detail.html',
title=f'Lot: {lot.name}',
lot=lot,
categories=categories,
equipments=equipments)
# ==================== MÈTRES ====================
@meters_bp.route('/<int:id>/meters/add', methods=['POST'])
@login_required
def add_meter(id):
"""Ajouter un compteur à un équipement."""
equipment = Equipment.query.get_or_404(id)
meter = Meter(
equipment_id=id,
name=request.form.get('name'),
meter_type=request.form.get('meter_type', 'hours'),
unit=request.form.get('unit', 'h'),
initial_value=float(request.form.get('initial_value', 0) or 0),
current_value=float(request.form.get('current_value', 0) or 0),
warning_threshold=float(request.form.get('warning_threshold')) if request.form.get('warning_threshold') else None,
critical_threshold=float(request.form.get('critical_threshold')) if request.form.get('critical_threshold') else None,
maintenance_interval=float(request.form.get('maintenance_interval')) if request.form.get('maintenance_interval') else None,
last_maintenance_value=float(request.form.get('last_maintenance_value')) if request.form.get('last_maintenance_value') else None
)
db.session.add(meter)
db.session.commit()
return jsonify({'success': True, 'meter_id': meter.id})
@meters_bp.route('/<int:id>/meters/reading', methods=['POST'])
@login_required
def add_meter_reading(id):
"""Ajouter un relevé de compteur."""
data = request.get_json()
meter_id = data.get('meter_id')
value = data.get('value')
meter = Meter.query.filter_by(id=meter_id, equipment_id=id).first_or_404()
2026-08-14 18:02:25 +02:00
reading = MeterReading(
meter_id=meter_id,
value=value,
read_by_id=current_user.id
)
meter.current_value = value
db.session.add(reading)
db.session.commit()
return jsonify({'success': True})
# ==================== CONSOMMABLES ====================
@meters_bp.route('/<int:id>/consumables/add', methods=['POST'])
@login_required
def add_consumable(id):
"""Associer un consommable à un équipement."""
equipment = Equipment.query.get_or_404(id)
ec = EquipmentConsumable(
equipment_id=id,
consumable_id=request.form.get('consumable_id'),
replacement_interval_days=int(request.form.get('replacement_interval_days')) if request.form.get('replacement_interval_days') else None,
replacement_interval_hours=int(request.form.get('replacement_interval_hours')) if request.form.get('replacement_interval_hours') else None,
replacement_interval_cycles=int(request.form.get('replacement_interval_cycles')) if request.form.get('replacement_interval_cycles') else None,
notes=request.form.get('notes')
)
db.session.add(ec)
db.session.commit()
return jsonify({'success': True, 'ec_id': ec.id})
@meters_bp.route('/<int:id>/consumables/remove', methods=['POST'])
@login_required
def remove_consumable(id):
"""Retirer un consommable d'un équipement."""
data = request.get_json()
ec_id = data.get('ec_id')
ec = EquipmentConsumable.query.filter_by(id=ec_id, equipment_id=id).first_or_404()
2026-08-14 18:02:25 +02:00
db.session.delete(ec)
db.session.commit()
return jsonify({'success': True})
# ==================== DOCUMENTS ====================