pyrunner / core /middleware.py
Perspicacious's picture
Deploy PyRunner on Hugging Face
2529305
Raw
History Blame Contribute Delete
2.86 kB
"""
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