ROOT_URLCONF = "paperless.urls"
-FORCE_SCRIPT_NAME = os.getenv("PAPERLESS_FORCE_SCRIPT_NAME")
-BASE_URL = (FORCE_SCRIPT_NAME or "") + "/"
-LOGIN_URL = BASE_URL + "accounts/login/"
-LOGIN_REDIRECT_URL = "/dashboard"
-LOGOUT_REDIRECT_URL = os.getenv("PAPERLESS_LOGOUT_REDIRECT_URL")
+
+def _parse_base_paths() -> tuple[str, str, str, str, str]:
+ script_name = os.getenv("PAPERLESS_FORCE_SCRIPT_NAME")
+ base_url = (script_name or "") + "/"
+ login_url = base_url + "accounts/login/"
+ login_redirect_url = base_url + "dashboard"
+ logout_redirect_url = os.getenv("PAPERLESS_LOGOUT_REDIRECT_URL", base_url)
+ return script_name, base_url, login_url, login_redirect_url, logout_redirect_url
+
+
+FORCE_SCRIPT_NAME, BASE_URL, LOGIN_URL, LOGIN_REDIRECT_URL, LOGOUT_REDIRECT_URL = (
+ _parse_base_paths()
+)
WSGI_APPLICATION = "paperless.wsgi.application"
ASGI_APPLICATION = "paperless.asgi.application"
from celery.schedules import crontab
+from paperless.settings import _parse_base_paths
from paperless.settings import _parse_beat_schedule
from paperless.settings import _parse_db_settings
from paperless.settings import _parse_ignore_dates
self.assertIn(url, settings.CSRF_TRUSTED_ORIGINS)
self.assertIn(url, settings.CORS_ALLOWED_ORIGINS)
+
+
+class TestPathSettings(TestCase):
+ def test_default_paths(self):
+ """
+ GIVEN:
+ - PAPERLESS_FORCE_SCRIPT_NAME is not set
+ WHEN:
+ - Settings are parsed
+ THEN:
+ - Paths are as expected
+ """
+ base_paths = _parse_base_paths()
+ self.assertEqual(None, base_paths[0]) # FORCE_SCRIPT_NAME
+ self.assertEqual("/", base_paths[1]) # BASE_URL
+ self.assertEqual("/accounts/login/", base_paths[2]) # LOGIN_URL
+ self.assertEqual("/dashboard", base_paths[3]) # LOGIN_REDIRECT_URL
+ self.assertEqual("/", base_paths[4]) # LOGOUT_REDIRECT_URL
+
+ @mock.patch("os.environ", {"PAPERLESS_FORCE_SCRIPT_NAME": "/paperless"})
+ def test_subpath(self):
+ """
+ GIVEN:
+ - PAPERLESS_FORCE_SCRIPT_NAME is set
+ WHEN:
+ - Settings are parsed
+ THEN:
+ - The path is returned and present in related settings
+ """
+ base_paths = _parse_base_paths()
+ self.assertEqual("/paperless", base_paths[0]) # FORCE_SCRIPT_NAME
+ self.assertEqual("/paperless/", base_paths[1]) # BASE_URL
+ self.assertEqual("/paperless/accounts/login/", base_paths[2]) # LOGIN_URL
+ self.assertEqual("/paperless/dashboard", base_paths[3]) # LOGIN_REDIRECT_URL
+ self.assertEqual("/paperless/", base_paths[4]) # LOGOUT_REDIRECT_URL
+
+ @mock.patch(
+ "os.environ",
+ {
+ "PAPERLESS_FORCE_SCRIPT_NAME": "/paperless",
+ "PAPERLESS_LOGOUT_REDIRECT_URL": "/foobar/",
+ },
+ )
+ def test_subpath_with_explicit_logout_url(self):
+ """
+ GIVEN:
+ - PAPERLESS_FORCE_SCRIPT_NAME is set and so is PAPERLESS_LOGOUT_REDIRECT_URL
+ WHEN:
+ - Settings are parsed
+ THEN:
+ - The correct logout redirect URL is returned
+ """
+ base_paths = _parse_base_paths()
+ self.assertEqual("/paperless/", base_paths[1]) # BASE_URL
+ self.assertEqual("/foobar/", base_paths[4]) # LOGOUT_REDIRECT_URL