Optimiser la vue zones des équipements
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run

This commit is contained in:
root 2026-08-17 10:29:25 +00:00
parent c978be2e70
commit 0a7ec477fd

View file

@ -9,6 +9,7 @@ from ..core.models.maintenance import Lot, Intervention
from ..core.models.planning import Meter, MeterReading, Consumable, EquipmentConsumable, ScheduledTask
from app_new.constants import EQUIPMENT_STATUSES
from app_new.utils import format_status, status_badge_class
from sqlalchemy.orm import selectinload, joinedload
def _empty_to_none(v):
"""Convertit une chaîne vide en None."""
@ -58,10 +59,17 @@ def index():
# agrégées. Les groupes parents sans salle sont ignorés afin de ne
# pas compter deux fois leurs groupes localisés.
grouped = {}
rows = Equipment.query.filter_by(is_deleted=False).all()
rows = (Equipment.query.options(
joinedload(Equipment.room).joinedload(Room.zone),
joinedload(Equipment.room).joinedload(Room.building),
joinedload(Equipment.category),
selectinload(Equipment.children),
joinedload(Equipment.parent).joinedload(Equipment.category),
joinedload(Equipment.parent).joinedload(Equipment.room),
).filter_by(is_deleted=False).all())
for eq in rows:
room = eq.room
if not room or (eq.is_group and eq.children.count()):
room = eq.effective_room
if not room or (eq.is_group and list(eq.children)):
continue
if search and search.lower() not in (eq.name or '').lower():
continue
@ -77,8 +85,9 @@ def index():
z = b['zones'].setdefault(zone.id if zone else 0, {'name': zone.name if zone else 'Sans zone', 'rooms': {}})
r = z['rooms'].setdefault(room.id, {'name': room.name, 'types': {}})
key = eq.effective_category_id or f'name:{eq.name.lower().split(" #")[0]}'
display_name = eq.category.name if eq.category else eq.name.split(' #')[0]
item = r['types'].setdefault(key, {'name': display_name, 'category': eq.effective_category.name if eq.effective_category else '', 'quantity': 0, 'ids': []})
effective_category = eq.effective_category
display_name = effective_category.name if effective_category else eq.name.split(' #')[0]
item = r['types'].setdefault(key, {'name': display_name, 'category': effective_category.name if effective_category else '', 'quantity': 0, 'ids': []})
item['quantity'] += eq.quantity or 1
item['ids'].append(eq.id)
zone_tree = [{'id': bid, 'name': b['name'], 'zones': [{'id': zid, 'name': z['name'], 'rooms': [{'id': rid, 'name': r['name'], 'types': list(r['types'].values())} for rid, r in z['rooms'].items()]} for zid, z in b['zones'].items()]} for bid, b in grouped.items()]