155 lines
No EOL
5.5 KiB
Python
155 lines
No EOL
5.5 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
from typing import Iterable, List
|
|
|
|
from django.contrib.auth.models import AnonymousUser
|
|
from django.urls import resolve
|
|
|
|
from .models import UserConfig, AppView
|
|
|
|
|
|
SESSION_ALLOWED_IDS_KEY = "account_switch_allowed_user_ids"
|
|
SESSION_ORIGIN_ID_KEY = "account_switch_origin_user_id"
|
|
|
|
|
|
from django.conf import settings
|
|
|
|
def environment_info(request):
|
|
"""
|
|
Context processor that exposes environment information.
|
|
Uses ENVIRONMENT variable which can be 'development', 'test', or 'production'.
|
|
Makes 'environment_name' available in all templates.
|
|
"""
|
|
env = os.getenv('ENVIRONMENT', '').lower()
|
|
|
|
# Map environment names to display labels
|
|
env_labels = {
|
|
'development': 'DEV',
|
|
'dev': 'DEV',
|
|
'test': 'TEST',
|
|
'staging': 'STAGING',
|
|
}
|
|
|
|
# Only show label for non-production environments
|
|
environment_label = env_labels.get(env, '')
|
|
|
|
return {
|
|
'environment_name': environment_label,
|
|
'MAP_STYLE_LIGHT': getattr(settings, 'MAP_STYLE_LIGHT', None) or 'https://api.maptiler.com/maps/streets-v2-light/style.json',
|
|
'MAP_STYLE_STANDARD': getattr(settings, 'MAP_STYLE_STANDARD', None) or 'https://api.maptiler.com/maps/streets-v2/style.json',
|
|
}
|
|
|
|
|
|
def compute_initial_allowed_ids(config: UserConfig) -> List[int]:
|
|
linked_ids: Iterable[int] = config.linked_configs.values_list("user_id", flat=True)
|
|
allowed = list(linked_ids)
|
|
allowed.append(config.user_id)
|
|
return allowed
|
|
|
|
|
|
def current_app_view(request):
|
|
"""
|
|
Context processor that determines the current active AppView based on the URL namespace.
|
|
Makes 'current_view' available in all templates.
|
|
|
|
Only 'sign' and 'documents' have their own dedicated views.
|
|
All other apps (assets, interventions, controls, contracts, etc.) use 'asset_management' view.
|
|
"""
|
|
current_view = None
|
|
|
|
# Apps that have their own dedicated view
|
|
DEDICATED_VIEW_APPS = ['sign', 'documents', 'reporting', 'maps', 'authorizations', 'panoramax']
|
|
|
|
try:
|
|
# Get the namespace from the current URL
|
|
resolved = resolve(request.path)
|
|
namespace = resolved.namespace # e.g., 'sign', 'home', 'assets'
|
|
|
|
if namespace:
|
|
if namespace in DEDICATED_VIEW_APPS:
|
|
# These apps have their own dedicated view
|
|
current_view = AppView.objects.filter(url_name__startswith=f"{namespace}:").first()
|
|
else:
|
|
# All other apps (home, assets, interventions, controls, contracts, etc.)
|
|
# should show 'asset_management' view
|
|
current_view = AppView.objects.filter(code='asset_management').first()
|
|
except Exception:
|
|
pass
|
|
|
|
return {
|
|
'current_view': current_view,
|
|
}
|
|
|
|
|
|
def linked_accounts(request):
|
|
user = getattr(request, "user", None)
|
|
|
|
if not user or isinstance(user, AnonymousUser) or not user.is_authenticated:
|
|
request.session.pop(SESSION_ALLOWED_IDS_KEY, None)
|
|
request.session.pop(SESSION_ORIGIN_ID_KEY, None)
|
|
return {
|
|
"switchable_accounts": [],
|
|
"account_switch_origin_user_id": None,
|
|
}
|
|
|
|
try:
|
|
current_config: UserConfig = user.config
|
|
except UserConfig.DoesNotExist:
|
|
request.session.pop(SESSION_ALLOWED_IDS_KEY, None)
|
|
request.session.pop(SESSION_ORIGIN_ID_KEY, None)
|
|
return {
|
|
"switchable_accounts": [],
|
|
"account_switch_origin_user_id": None,
|
|
}
|
|
|
|
session = getattr(request, "session", None)
|
|
if session is None:
|
|
return {
|
|
"switchable_accounts": [],
|
|
"account_switch_origin_user_id": None,
|
|
}
|
|
|
|
allowed_ids = session.get(SESSION_ALLOWED_IDS_KEY)
|
|
origin_user_id = session.get(SESSION_ORIGIN_ID_KEY)
|
|
|
|
if allowed_ids is None or origin_user_id is None:
|
|
allowed_ids = compute_initial_allowed_ids(current_config)
|
|
origin_user_id = user.pk
|
|
else:
|
|
allowed_ids = list(dict.fromkeys(int(pk) for pk in allowed_ids))
|
|
if user.pk not in allowed_ids:
|
|
allowed_ids.append(user.pk)
|
|
|
|
session[SESSION_ALLOWED_IDS_KEY] = allowed_ids
|
|
session[SESSION_ORIGIN_ID_KEY] = origin_user_id
|
|
|
|
switchable_accounts = (
|
|
UserConfig.objects.select_related("user")
|
|
.filter(user_id__in=allowed_ids)
|
|
.exclude(user_id=user.pk)
|
|
.order_by("user__first_name", "user__last_name")
|
|
)
|
|
|
|
return {
|
|
"switchable_accounts": switchable_accounts,
|
|
"account_switch_origin_user_id": origin_user_id,
|
|
}
|
|
|
|
|
|
def organization_info(request):
|
|
"""
|
|
Context processor that exposes organization details from settings.
|
|
"""
|
|
return {
|
|
'product_name': getattr(settings, 'PRODUCT_NAME', 'StreetUp'),
|
|
'organization_name': getattr(settings, 'ORGANIZATION_NAME', 'Brussels Mobility'),
|
|
'organization_logo_header': getattr(settings, 'ORGANIZATION_LOGO_HEADER', 'common/android-192.png'),
|
|
'organization_primary_color': getattr(settings, 'ORGANIZATION_PRIMARY_COLOR_HEX', '#2f3e8b'),
|
|
'map_default_center': [getattr(settings, 'MAP_DEFAULT_CENTER_LON', 4.3572), getattr(settings, 'MAP_DEFAULT_CENTER_LAT', 50.8477)],
|
|
'map_default_zoom': getattr(settings, 'MAP_DEFAULT_ZOOM', 11),
|
|
'map_default_extent': getattr(settings, 'MAP_DEFAULT_EXTENT', None),
|
|
'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', ''),
|
|
} |