fix(common): ensure admin and whole-territory users use default Territory directly
This commit is contained in:
parent
e6a09eaf37
commit
91e0f6d5dd
1 changed files with 39 additions and 21 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue