File size: 2,855 Bytes
a4ebfba | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | """
Custom middleware for PyRunner.
"""
import logging
from django.shortcuts import redirect
from django.urls import reverse
logger = logging.getLogger(__name__)
class SetupWizardMiddleware:
"""
Middleware that redirects to setup wizard if initial setup is not completed.
Allows access to:
- /setup/* (the setup wizard itself)
- /static/* (static assets)
- /<admin_url>/* (emergency access, configurable)
"""
# Static allowed paths (always allowed)
STATIC_ALLOWED_PREFIXES = [
"/setup/",
"/static/",
]
def __init__(self, get_response):
self.get_response = get_response
self._admin_prefix = None
def _get_admin_prefix(self):
"""Get the admin URL prefix (cached after first call)."""
if self._admin_prefix is None:
try:
from core.models import GlobalSettings
slug = GlobalSettings.get_settings().admin_url_slug or "django-admin"
self._admin_prefix = f"/{slug}/"
except Exception:
self._admin_prefix = "/django-admin/"
return self._admin_prefix
def _get_allowed_prefixes(self):
"""Get all allowed path prefixes including dynamic admin URL."""
return self.STATIC_ALLOWED_PREFIXES + [self._get_admin_prefix()]
def __call__(self, request):
# Skip for allowed paths
if any(
request.path.startswith(prefix)
for prefix in self._get_allowed_prefixes()
):
return self.get_response(request)
# Check if setup is needed
if self._is_setup_needed():
setup_url = reverse("setup:setup")
if request.path != setup_url:
return redirect(setup_url)
# Check if admin setup is needed (setup complete but no admin user)
elif self._is_admin_setup_needed():
admin_setup_url = reverse("setup:admin_setup")
if request.path != admin_setup_url:
return redirect(admin_setup_url)
return self.get_response(request)
def _is_setup_needed(self) -> bool:
"""Check if initial setup has been completed."""
try:
from core.services.setup_service import SetupService
return SetupService.is_setup_needed()
except Exception as e:
# If we can't check, assume setup is needed
logger.debug(f"Setup check failed in middleware: {e}")
return True
def _is_admin_setup_needed(self) -> bool:
"""Check if admin user needs to be created."""
try:
from core.services.setup_service import SetupService
return SetupService.needs_admin_setup()
except Exception as e:
logger.debug(f"Admin setup check failed in middleware: {e}")
return False
|