From 91e0f6d5dded46b50ed70285ad803a3a80371b26 Mon Sep 17 00:00:00 2001 From: kdeterme Date: Mon, 21 Sep 2026 10:23:18 +0200 Subject: [PATCH] fix(common): ensure admin and whole-territory users use default Territory directly --- loko/common/views.py | 60 ++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/loko/common/views.py b/loko/common/views.py index 3459267..b9e49f6 100644 --- a/loko/common/views.py +++ b/loko/common/views.py @@ -232,36 +232,54 @@ def get_territory_mask_geojson(request): if str(p).isdigit(): muni_ids.append(int(p)) + default_territory = Territory.objects.filter(is_active=True, is_default=True, geom__isnull=False).first() + total_munis_count = Municipality.objects.filter(geom__isnull=False).count() + if not muni_ids: - # Priorité 1 : contrat par défaut ou contrats de l'utilisateur + # Vérifier si l'utilisateur est restreint à un sous-ensemble strict de communes user_config = getattr(user, 'config', None) if user and user.is_authenticated else None - if user_config and user_config.default_contract and user_config.default_contract.municipalities.exists(): - muni_ids = list(user_config.default_contract.municipalities.values_list('id', flat=True)) - elif user_config and user_config.contracts.filter(municipalities__isnull=False).exists(): - muni_ids = list(Municipality.objects.filter(contracts__in=user_config.contracts.all()).values_list('id', flat=True).distinct()) - elif Contract.objects.filter(municipalities__isnull=False).count() == 1: - muni_ids = list(Contract.objects.filter(municipalities__isnull=False).first().municipalities.values_list('id', flat=True)) - elif user and user.is_authenticated: - accessible = list(get_user_accessible_municipalities(user).values_list('id', flat=True)) - if accessible: - muni_ids = accessible + user_restricted_muni_ids = [] - # Priorité 2 : Si aucune restriction communale n'est requise, vérifier s'il existe un Territoire par défaut - if not muni_ids: - default_territory = Territory.objects.filter(is_active=True, is_default=True, geom__isnull=False).first() - if default_territory: - return _build_mask_geojson( - default_territory.geom, - default_territory.name, - f"territory_mask_geojson_default_{default_territory.id}" - ) + if user and user.is_authenticated and not user.is_superuser: + if user_config and user_config.default_contract and user_config.default_contract.municipalities.exists(): + c_munis = list(user_config.default_contract.municipalities.values_list('id', flat=True)) + if len(c_munis) < total_munis_count: + user_restricted_muni_ids = c_munis + elif user_config and user_config.contracts.filter(municipalities__isnull=False).exists(): + c_munis = list(Municipality.objects.filter(contracts__in=user_config.contracts.all()).values_list('id', flat=True).distinct()) + if len(c_munis) < total_munis_count: + user_restricted_muni_ids = c_munis + elif Contract.objects.filter(municipalities__isnull=False).count() == 1: + c_munis = list(Contract.objects.filter(municipalities__isnull=False).first().municipalities.values_list('id', flat=True)) + if len(c_munis) < total_munis_count: + user_restricted_muni_ids = c_munis + else: + accessible = list(get_user_accessible_municipalities(user).values_list('id', flat=True)) + if accessible and len(accessible) < total_munis_count: + user_restricted_muni_ids = accessible - # Repli : Si aucun Territoire n'est défini, illuminer toutes les communes existantes + if user_restricted_muni_ids: + muni_ids = user_restricted_muni_ids + elif default_territory: + return _build_mask_geojson( + default_territory.geom, + default_territory.name, + f"territory_mask_geojson_default_{default_territory.id}" + ) + else: muni_ids = list(Municipality.objects.filter(geom__isnull=False).values_list('id', flat=True)) + if default_territory and total_munis_count > 0 and len(set(muni_ids)) >= total_munis_count: + return _build_mask_geojson( + default_territory.geom, + default_territory.name, + f"territory_mask_geojson_default_{default_territory.id}" + ) + if not muni_ids: return JsonResponse({"type": "FeatureCollection", "features": []}) + muni_ids = sorted(list(set(muni_ids))) cache_key = f"territory_mask_geojson_{'_'.join(map(str, muni_ids))}" cached_data = cache.get(cache_key)