Skip to content

Commit

Permalink
Add settings toggle for local frontend
Browse files Browse the repository at this point in the history
  • Loading branch information
hmpf committed Oct 9, 2024
1 parent c660abe commit 2cef856
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 20 deletions.
9 changes: 8 additions & 1 deletion src/argus/site/settings/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
import logging.config
from os import getenv
from pathlib import Path
from typing import Optional
from urllib.parse import urlsplit, urlunsplit

from django.core.exceptions import ImproperlyConfigured
from django.utils.module_loading import import_string

from ._serializers import ListAppSetting
Expand Down Expand Up @@ -156,5 +158,10 @@ def update_loglevels(loglevel: str = "INFO", loggers=(), handlers=()) -> None:
handlerdict = {}
for handler in handlers:
handlerdict["handler"] = {"level": loglevel}
logdict = {"version": 1, "disable_existing_loggers": False, "incremental": True, "handlers": handlerdict}
logdict = {
"version": 1,
"disable_existing_loggers": False,
"incremental": True,
"handlers": handlerdict,
}
logging.config.dictConfig(logdict)
37 changes: 28 additions & 9 deletions src/argus/site/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from urllib.parse import urlsplit

import dj_database_url
from django.core.exceptions import ImproperlyConfigured

# Import some helpers
from . import *
Expand All @@ -28,6 +29,7 @@

# Application definition

RUN_FRONTEND = get_bool_env("ARGUS_RUN_FRONTEND", None) # Local
_overriding_apps_env = get_json_env("ARGUS_OVERRIDING_APPS", [], quiet=False)
OVERRIDING_APPS = validate_app_setting(_overriding_apps_env)
del _overriding_apps_env
Expand Down Expand Up @@ -100,12 +102,38 @@
}
]

# toggle local frontend

FRONTEND_URL = get_str_env("ARGUS_FRONTEND_URL") # Used for CORS
if RUN_FRONTEND:
from argus_htmx.appconfig import APP_SETTINGS as FRONTEND_APPS

_frontend_app_names = [app.app_name for app in FRONTEND_APPS]
INSTALLED_APPS = _frontend_app_names + INSTALLED_APPS
TEMPLATES = update_context_processors_list(TEMPLATES, FRONTEND_APPS)
MIDDLEWARE = update_middleware_list(MIDDLEWARE, FRONTEND_APPS)
from argus_htmx.appconfig import (
LOGIN_URL,
LOGOUT_URL,
LOGIN_REDIRECT_URL,
LOGOUT_REDIRECT_URL,
)
else:
# SPA Frontend
LOGIN_URL = "/login/"
LOGOUT_URL = "/logout/"
LOGIN_REDIRECT_URL = "/"
LOGOUT_REDIRECT_URL = "/"
# Vendored OAuth2 backend for the SPA
AUTHENTICATION_BACKENDS = ("argus.dataporten.social.DataportenFeideOAuth2",) + AUTHENTICATION_BACKENDS

# override themes, urls, context processors
if OVERRIDING_APPS:
_overriding_app_names = [app.app_name for app in OVERRIDING_APPS]
INSTALLED_APPS = _overriding_app_names + INSTALLED_APPS
TEMPLATES = update_context_processors_list(TEMPLATES, OVERRIDING_APPS)
MIDDLEWARE = update_middleware_list(MIDDLEWARE, OVERRIDING_APPS)

# add extra functionality without overrides
if EXTRA_APPS:
_extra_app_names = [app.app_name for app in EXTRA_APPS]
Expand Down Expand Up @@ -142,12 +170,6 @@
AUTH_USER_MODEL = "argus_auth.User"


LOGIN_URL = "/login/"
LOGOUT_URL = "/logout/"
LOGIN_REDIRECT_URL = "/"
LOGOUT_REDIRECT_URL = "/"


# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/

Expand Down Expand Up @@ -185,7 +207,6 @@


AUTHENTICATION_BACKENDS = (
"argus.dataporten.social.DataportenFeideOAuth2",
"django.contrib.auth.backends.RemoteUserBackend",
"django.contrib.auth.backends.ModelBackend",
)
Expand All @@ -203,8 +224,6 @@
STARTUP_LOGGING = setup_logging(LOGGING_MODULE)

# django-cors-headers
FRONTEND_URL = get_str_env("ARGUS_FRONTEND_URL")

CORS_ALLOWED_ORIGINS = []
if FRONTEND_URL:
CORS_ALLOWED_ORIGINS.append(normalize_url(FRONTEND_URL))
Expand Down
57 changes: 47 additions & 10 deletions src/argus/site/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,34 +23,71 @@
from social_django.urls import extra

from argus.auth.views import ObtainNewAuthToken, AuthMethodListView
from argus.dataporten import views as dataporten_views
from argus.notificationprofile.views import SchemaView
from argus.site.utils import get_urlpatterns_from_setting
from argus.site.views import error, index, MetadataView


psa_urls = [
# Overrides social_django's `complete` view
re_path(rf"^complete/(?P<backend>[^/]+){extra}$", dataporten_views.login_wrapper, name="complete"),
path("", include("social_django.urls", namespace="social")),
]
_FRONTEND_APPS = getattr(settings, "FRONTEND_APPS", False)


urlpatterns = [
path("favicon.ico", RedirectView.as_view(url="/static/favicon.svg", permanent=True)),
# path(".error/", error), # Only needed when testing error pages and error behavior
path("admin/", admin.site.urls),
path("oidc/", include(psa_urls)),
path("login-methods/", AuthMethodListView.as_view(), name="login-methods"),
path("api/schema/", SpectacularAPIView.as_view(api_version="v1"), name="schema-v1-old"),
path("api/schema/swagger-ui/", SpectacularSwaggerView.as_view(url_name="schema-v1-old"), name="swagger-ui-v1-old"),
path(
"api/schema/",
SpectacularAPIView.as_view(api_version="v1"),
name="schema-v1-old",
),
path(
"api/schema/swagger-ui/",
SpectacularSwaggerView.as_view(url_name="schema-v1-old"),
name="swagger-ui-v1-old",
),
path("api/v1/", include(("argus.site.api_v1_urls", "api"), namespace="v1")),
path("api/v2/", include(("argus.site.api_v2_urls", "api"), namespace="v2")),
# path('api/sessionauth/', include('rest_framework.urls', namespace='rest_framework')),
path("api/", MetadataView.as_view(), name="metadata"),
path("json-schema/<slug:slug>", SchemaView.as_view(), name="json-schema"),
path("", index, name="api-home"),
]

# Frontend

if _FRONTEND_APPS:
# fancy frontend
psa_urls = [
path("", include("social_django.urls", namespace="social")),
]
frontend_urlpatterns = get_urlpatterns_from_setting(_FRONTEND_APPS)
urlpatterns = (
frontend_urlpatterns
+ urlpatterns
+ [
path("oidc/", include(psa_urls)),
]
)
else:
# minimalistic frontend, maybe SPA somewhere else
from argus.dataporten.views import login_wrapper

psa_urls = [
# Overrides social_django's `complete` view
re_path(
rf"^complete/(?P<backend>[^/]+){extra}$",
login_wrapper,
name="complete",
),
path("", include("social_django.urls", namespace="social")),
]
urlpatterns += [
path("oidc/", include(psa_urls)),
path("", index, name="api-home"),
]

# Extra/overriding apps

prefixed_urlpatterns = get_urlpatterns_from_setting(settings.OVERRIDING_APPS)
if prefixed_urlpatterns:
urlpatterns = prefixed_urlpatterns + urlpatterns
Expand Down

0 comments on commit 2cef856

Please sign in to comment.