diff --git a/streetup/assets/models/buildings.py b/streetup/assets/models/buildings.py index 83b9e55..1061c5e 100644 --- a/streetup/assets/models/buildings.py +++ b/streetup/assets/models/buildings.py @@ -14,7 +14,7 @@ from common.storages import PrivateMediaStorage private_storage = PrivateMediaStorage() USAGE_TYPE_CHOICES = ( - ('administrative', _('Administratif / Mairie')), + ('administrative', _('Administratif (Hôtel de Ville / Maison Communale / Mairie)')), ('education', _('Enseignement / École / Crèche')), ('sports', _('Sport & Équipement sportif')), ('culture', _('Culture / Médiathèque / Musée')), @@ -102,15 +102,15 @@ class PublicBuilding(AbstractGeoAsset): total_surface_m2 = models.FloatField(null=True, blank=True, verbose_name=_("Surface brute totale (m²)")) usable_surface_m2 = models.FloatField(null=True, blank=True, verbose_name=_("Surface utile (m²)")) - # Réglementation ERP - is_erp = models.BooleanField(default=True, verbose_name=_("Établissement Recevant du Public (ERP)")) - erp_category = models.CharField(max_length=10, choices=ERP_CATEGORY_CHOICES, null=True, blank=True, verbose_name=_("Catégorie ERP")) - erp_type = models.CharField(max_length=10, choices=ERP_TYPE_CHOICES, null=True, blank=True, verbose_name=_("Type ERP")) + # Réglementation & Accueil du Public + is_erp = models.BooleanField(default=True, verbose_name=_("Accueil & Sécurité du Public (ERP / PMR)")) + erp_category = models.CharField(max_length=10, choices=ERP_CATEGORY_CHOICES, null=True, blank=True, verbose_name=_("Catégorie d'accueil / ERP")) + erp_type = models.CharField(max_length=10, choices=ERP_TYPE_CHOICES, null=True, blank=True, verbose_name=_("Type d'établissement / ERP")) max_capacity = models.IntegerField(null=True, blank=True, verbose_name=_("Jauge maximale d'accueil du public")) # Diagnostics & Énergie - dpe_rating = models.CharField(max_length=2, choices=DPE_RATING_CHOICES, null=True, blank=True, verbose_name=_("Diagnostic de Performance Énergétique (DPE)")) - ges_rating = models.CharField(max_length=2, choices=DPE_RATING_CHOICES, null=True, blank=True, verbose_name=_("Émission de Gaz à Effet de Serre (GES)")) + dpe_rating = models.CharField(max_length=2, choices=DPE_RATING_CHOICES, null=True, blank=True, verbose_name=_("Performance Énergétique (PEB / DPE / EPC)")) + ges_rating = models.CharField(max_length=2, choices=DPE_RATING_CHOICES, null=True, blank=True, verbose_name=_("Émissions de Carbone & GES")) has_asbestos_diag = models.BooleanField(default=False, verbose_name=_("Diagnostic Amiante réalisé")) has_lead_diag = models.BooleanField(default=False, verbose_name=_("Diagnostic Plomb réalisé")) pmr_accessible = models.BooleanField(default=False, verbose_name=_("Accessible PMR")) diff --git a/streetup/assets/templates/assets/buildings/publicbuilding_detail.html b/streetup/assets/templates/assets/buildings/publicbuilding_detail.html index 75fdf47..0246b14 100644 --- a/streetup/assets/templates/assets/buildings/publicbuilding_detail.html +++ b/streetup/assets/templates/assets/buildings/publicbuilding_detail.html @@ -36,20 +36,20 @@ {{ building.get_usage_type_display }} {{ building.get_building_status_display }} {% if building.is_erp %} - ERP (Catégorie {{ building.erp_category|default:"-" }}) + {{ regional_terms.public_access_short }} (Cat. {{ building.erp_category|default:"-" }}) {% endif %}
| {{ building.usable_surface_m2|default:"-" }} m² / {{ building.total_surface_m2|default:"-" }} m² | |||
| {% translate "Jauge ERP" %} : | -{{ building.max_capacity|default:"-" }} personnes | +{{ regional_terms.public_access_category }} : | +{{ building.erp_category|default:"-" }} |
|---|---|---|---|
| {% translate "Accessibilité PMR" %} : | diff --git a/streetup/common/context_processors.py b/streetup/common/context_processors.py index 22c8e8b..f5317d8 100644 --- a/streetup/common/context_processors.py +++ b/streetup/common/context_processors.py @@ -152,4 +152,24 @@ def organization_info(request): 'map_ortho_wms_url': getattr(settings, 'MAP_ORTHO_WMS_URL', ''), 'map_ortho_wms_name': getattr(settings, 'MAP_ORTHO_WMS_NAME', ''), 'map_ortho_wms_attribution': getattr(settings, 'MAP_ORTHO_WMS_ATTRIBUTION', ''), + } + + +def regional_terminology(request): + """ + Context processor providing regional terminology & standard definitions + (e.g., PEB in Belgium vs DPE/GES in France) based on the user's UserConfig or system default. + Makes 'regional_terms' and 'regional_standard' available in all templates. + """ + from .utils import get_regional_terms + standard_code = getattr(settings, 'REGIONAL_STANDARD', 'BE') + + if request.user.is_authenticated: + user_config = getattr(request.user, 'config', None) + if user_config and getattr(user_config, 'regional_standard', None): + standard_code = user_config.regional_standard + + return { + 'regional_standard': standard_code, + 'regional_terms': get_regional_terms(standard_code), } \ No newline at end of file diff --git a/streetup/common/migrations/0005_userconfig_regional_standard.py b/streetup/common/migrations/0005_userconfig_regional_standard.py new file mode 100644 index 0000000..b21a079 --- /dev/null +++ b/streetup/common/migrations/0005_userconfig_regional_standard.py @@ -0,0 +1,18 @@ +# Generated by Django 6.0.7 on 2026-07-26 17:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0004_initial'), + ] + + operations = [ + migrations.AddField( + model_name='userconfig', + name='regional_standard', + field=models.CharField(choices=[('BE', 'Belgique (PEB, Maison Communale / Hôtel de Ville, Sécurité PMR)'), ('FR', 'France (DPE, GES, Mairie, Normes ERP)'), ('INT', 'International / Générique')], default='BE', help_text='Définit la terminologie et les normes réglementaires adaptées à la région.', max_length=10, verbose_name='Norme régionale & vocabulaire'), + ), + ] diff --git a/streetup/common/models.py b/streetup/common/models.py index 6d8d557..a2e336d 100644 --- a/streetup/common/models.py +++ b/streetup/common/models.py @@ -110,6 +110,18 @@ class UserConfig(models.Model): help_text="Limite les raccourcis et les compteurs de la page d'accueil aux contrats pour lesquels l'utilisateur dispose de permissions explicites.", ) generic_email = models.EmailField(blank=True, null=True) # Email générique de l'utilisateur + REGIONAL_STANDARD_CHOICES = [ + ('BE', 'Belgique (PEB, Maison Communale / Hôtel de Ville, Sécurité PMR)'), + ('FR', 'France (DPE, GES, Mairie, Normes ERP)'), + ('INT', 'International / Générique'), + ] + regional_standard = models.CharField( + max_length=10, + choices=REGIONAL_STANDARD_CHOICES, + default='BE', + verbose_name="Norme régionale & vocabulaire", + help_text="Définit la terminologie et les normes réglementaires adaptées à la région.", + ) hide_intervention_map_by_default = models.BooleanField( default=False, verbose_name="Masquer la carte des interventions par défaut", diff --git a/streetup/common/utils.py b/streetup/common/utils.py index 3de35eb..a32964c 100644 --- a/streetup/common/utils.py +++ b/streetup/common/utils.py @@ -116,4 +116,49 @@ def get_short_name(user): first = getattr(user, "first_name", "") or "" last = getattr(user, "last_name", "") or "" initial = (last[0].upper() + ".") if last else "" - return f"{first} {initial}".strip() \ No newline at end of file + return f"{first} {initial}".strip() + + +REGIONAL_TERMINOLOGY = { + 'BE': { + 'regional_standard_name': 'Belgique (PEB / Maison Communale / Sécurité PMR)', + 'admin_building': 'Hôtel de Ville / Maison Communale', + 'energy_diag_short': 'PEB', + 'energy_diag_full': 'Performance Énergétique des Bâtiments (PEB)', + 'carbon_diag_short': 'Bilan Carbone', + 'carbon_diag_full': 'Émissions de Carbone / Bilan Énergétique', + 'public_access_short': 'Accès public & PMR', + 'public_access_full': 'Accueil & Sécurité du Public (Normes PMR)', + 'public_access_category': 'Catégorie d\'accueil', + 'public_access_type': 'Type d\'affectation', + }, + 'FR': { + 'regional_standard_name': 'France (DPE / GES / Mairie / ERP)', + 'admin_building': 'Mairie / Hôtel de Ville', + 'energy_diag_short': 'DPE', + 'energy_diag_full': 'Diagnostic de Performance Énergétique (DPE)', + 'carbon_diag_short': 'GES', + 'carbon_diag_full': 'Émissions de Gaz à Effet de Serre (GES)', + 'public_access_short': 'ERP', + 'public_access_full': 'Établissement Recevant du Public (ERP)', + 'public_access_category': 'Catégorie ERP', + 'public_access_type': 'Type ERP', + }, + 'INT': { + 'regional_standard_name': 'International / Générique', + 'admin_building': 'Bâtiment Administratif / Hôtel de Ville', + 'energy_diag_short': 'PEB / DPE', + 'energy_diag_full': 'Performance Énergétique (PEB / DPE / EPC)', + 'carbon_diag_short': 'Émissions Carbone', + 'carbon_diag_full': 'Bilan Carbone & Émissions', + 'public_access_short': 'Accès Public', + 'public_access_full': 'Bâtiment d\'Accueil du Public (ERP / PMR)', + 'public_access_category': 'Capacité d\'accueil', + 'public_access_type': 'Type d\'établissement', + } +} + + +def get_regional_terms(standard_code='BE'): + """Returns regional terminology dictionary for a given standard code ('BE', 'FR', 'INT').""" + return REGIONAL_TERMINOLOGY.get(standard_code or 'BE', REGIONAL_TERMINOLOGY['BE']) \ No newline at end of file diff --git a/streetup/streetup/settings.py b/streetup/streetup/settings.py index 23f4686..54a1a3c 100644 --- a/streetup/streetup/settings.py +++ b/streetup/streetup/settings.py @@ -38,6 +38,7 @@ SECRET_KEY = getenv("SECRET_KEY") DEBUG = getenv("DEBUG") == "True" ROOT_URL = getenv("ROOT_URL", "http://localhost:8000") +REGIONAL_STANDARD = getenv("REGIONAL_STANDARD", "BE") ALLOWED_HOSTS = getenv("ALLOWED_HOSTS").split(',') CSRF_TRUSTED_ORIGINS = getenv("CSRF_TRUSTED_ORIGINS").split(',') @@ -111,6 +112,7 @@ TEMPLATES = [ 'common.context_processors.current_app_view', 'common.context_processors.environment_info', 'common.context_processors.organization_info', + 'common.context_processors.regional_terminology', 'notifications.context_processors.unread_notifications_count', ], },