fix(common): ensure admin and whole-territory users use default Territory directly

This commit is contained in:
kdeterme 2026-09-21 10:23:18 +02:00
parent e6a09eaf37
commit 91e0f6d5dd

View file

@ -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)