From 0a7ec477fdb3396b1308fb97929fcb1be96d2f02 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 17 Aug 2026 10:29:25 +0000 Subject: [PATCH] =?UTF-8?q?Optimiser=20la=20vue=20zones=20des=20=C3=A9quip?= =?UTF-8?q?ements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_new/equipments/main.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/app_new/equipments/main.py b/app_new/equipments/main.py index 04a8ce0..728666f 100644 --- a/app_new/equipments/main.py +++ b/app_new/equipments/main.py @@ -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()]