diff --git a/loko/assets/models/buildings.py b/loko/assets/models/buildings.py index 28e85ec..a41738c 100644 --- a/loko/assets/models/buildings.py +++ b/loko/assets/models/buildings.py @@ -566,6 +566,139 @@ class BuildingAsset(AbstractGeoAsset): } return icons.get(self.asset_type, 'bi-gear') + def get_asset_theme(self): + """ + Retourne la configuration graphique (couleurs d'icône et de badge) + selon la typologie métier de l'asset. + """ + # 1. Sécurité incendie (Rouge alerte) + if self.asset_type in ('fire_safety', 'smoke_detector', 'fire_extinguisher', + 'smoke_exhaust', 'fire_door'): + return { + 'color': '#b91c1c', # red-700 + 'bg_color': '#fef2f2', # red-50 + 'border_color': '#fecaca', # red-200 + 'icon_color': '#dc2626', # red-600 + 'badge_class': 'bg-danger-subtle text-danger border', + } + + # 2. Génie climatique & CVC (Orange thermique / Chaleur & Froid) + if self.asset_type in ('boiler', 'heat_pump', 'heat_substation', 'radiator_emitter', + 'air_handling_unit', 'air_conditioning', 'water_heater', 'hvac'): + return { + 'color': '#c2410c', # orange-700 + 'bg_color': '#fff7ed', # orange-50 + 'border_color': '#fed7aa', # orange-200 + 'icon_color': '#ea580c', # orange-600 + 'badge_class': 'bg-warning-subtle text-danger-emphasis border', + } + + # 3. Électricité, Énergie & Éclairage (Ambre / Jaune or) + if self.asset_type in ('electricity', 'inverter_generator', 'lighting', 'emergency_lighting', + 'meter', 'solar_panel', 'ev_charging'): + return { + 'color': '#a16207', # yellow-700 + 'bg_color': '#fefce8', # yellow-50 + 'border_color': '#fef08a', # yellow-200 + 'icon_color': '#ca8a04', # yellow-600 + 'badge_class': 'bg-warning-subtle text-dark border', + } + + # 4. Sûreté, Contrôle d'accès & Vidéosurveillance (Pourpre / Violet) + if self.asset_type in ('access_control', 'alarm', 'cctv_surveillance'): + return { + 'color': '#7e22ce', # purple-700 + 'bg_color': '#faf5ff', # purple-50 + 'border_color': '#e9d5ff', # purple-200 + 'icon_color': '#9333ea', # purple-600 + 'badge_class': 'bg-primary-subtle text-primary border', + } + + # 5. Clos & Couvert / Enveloppe (Teal / Vert canard) + if self.asset_type in ('roof', 'roof_drainage', 'facade', 'window', 'skylight', + 'external_door', 'shutter_blind', 'insulation'): + return { + 'color': '#0f766e', # teal-700 + 'bg_color': '#f0fdfa', # teal-50 + 'border_color': '#99f6e4', # teal-200 + 'icon_color': '#0d9488', # teal-600 + 'badge_class': 'bg-success-subtle text-success border', + } + + # 6. Plomberie, Sanitaires & Gestion de l'eau (Bleu azur / Sky) + if self.asset_type in ('sanitary', 'plumbing_piping', 'sump_pump', 'rainwater_harvesting'): + return { + 'color': '#0369a1', # sky-700 + 'bg_color': '#f0f9ff', # sky-50 + 'border_color': '#bae6fd', # sky-200 + 'icon_color': '#0284c7', # sky-600 + 'badge_class': 'bg-info-subtle text-info border', + } + + # 7. Mobilité verticale / Ascenseurs (Bleu cobalt) + if self.asset_type in ('elevator', 'disabled_lift'): + return { + 'color': '#1d4ed8', # blue-700 + 'bg_color': '#eff6ff', # blue-50 + 'border_color': '#bfdbfe', # blue-200 + 'icon_color': '#2563eb', # blue-600 + 'badge_class': 'bg-primary-subtle text-primary border', + } + + # 8. Réseaux & Numérique / GTB (Indigo informatique) + if self.asset_type in ('network_rack', 'bms_system'): + return { + 'color': '#4338ca', # indigo-700 + 'bg_color': '#eef2ff', # indigo-50 + 'border_color': '#c7d2fe', # indigo-200 + 'icon_color': '#4f46e5', # indigo-600 + 'badge_class': 'bg-dark-subtle text-dark border', + } + + # 9. Second œuvre & Aménagements intérieurs (Ardoise neutre) + if self.asset_type in ('wall', 'interior_door', 'ceiling', 'flooring', 'stairs'): + return { + 'color': '#334155', # slate-700 + 'bg_color': '#f8fafc', # slate-50 + 'border_color': '#cbd5e1', # slate-300 + 'icon_color': '#64748b', # slate-500 + 'badge_class': 'bg-secondary-subtle text-secondary border', + } + + # Par défaut (Gros œuvre & Autre) + return { + 'color': '#475569', + 'bg_color': '#f1f5f9', + 'border_color': '#cbd5e1', + 'icon_color': '#64748b', + 'badge_class': 'bg-light text-muted border', + } + + @property + def theme_color(self): + return self.get_asset_theme()['color'] + + @property + def theme_icon_color(self): + return self.get_asset_theme()['icon_color'] + + @property + def theme_bg_color(self): + return self.get_asset_theme()['bg_color'] + + @property + def theme_border_color(self): + return self.get_asset_theme()['border_color'] + + @property + def theme_badge_style(self): + t = self.get_asset_theme() + return f"background-color: {t['bg_color']} !important; color: {t['color']} !important; border: 1px solid {t['border_color']} !important;" + + @property + def theme_badge_class(self): + return self.get_asset_theme()['badge_class'] + # Backward compatibility alias BuildingEquipment = BuildingAsset diff --git a/loko/assets/templates/assets/buildings/publicbuilding_asset_tree.html b/loko/assets/templates/assets/buildings/publicbuilding_asset_tree.html index 4c26c65..2c83a9e 100644 --- a/loko/assets/templates/assets/buildings/publicbuilding_asset_tree.html +++ b/loko/assets/templates/assets/buildings/publicbuilding_asset_tree.html @@ -17,15 +17,24 @@ {% else %} {% endif %} - + + + - - + + {{ asset_node.asset.code }} {{ asset_node.asset.get_name }} - {{ asset_node.asset.get_macro_lot }} - {{ asset_node.asset.get_asset_type_display }} + + + {{ asset_node.asset.get_macro_lot }} + + + + {{ asset_node.asset.get_asset_type_display }} + + {% if asset_node.asset.status == 'inactive' %} {% translate "Inactif" %} {% endif %} diff --git a/loko/assets/templates/assets/buildings/publicbuilding_detail.html b/loko/assets/templates/assets/buildings/publicbuilding_detail.html index 24fbdc2..e7594e8 100644 --- a/loko/assets/templates/assets/buildings/publicbuilding_detail.html +++ b/loko/assets/templates/assets/buildings/publicbuilding_detail.html @@ -507,14 +507,14 @@ {% for eq in equipments %} - - {{ eq.code }} + + {{ eq.code }}
{{ eq.get_name }}
- {{ eq.get_macro_lot }} - + {{ eq.get_macro_lot }} + {{ eq.get_asset_type_display }}