from django.conf import settings from django.conf.urls.static import static from django.contrib import admin from django.contrib.auth import views as auth_views from django.contrib.auth.decorators import user_passes_test from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.urls import include, path, re_path from django.views import defaults as default_views from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView from grapple import urls as grapple_urls from ratelimit.exceptions import Ratelimited from rest_framework.authtoken.views import obtain_auth_token from wagtail.admin import urls as wagtailadmin_urls from wagtail.core import urls as wagtail_urls from wagtail.documents import urls as wagtaildocs_urls from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt from vbv_lernwelt.core.views import ( rate_limit_exceeded_view, permission_denied_view, check_rate_limit, cypress_reset_view, ) from .wagtail_api import wagtail_api_router def raise_example_error(request): """ raise error to check if it gets logged """ raise Exception("Test Error: I know python!") # pylint: disable=unreachable return HttpResponse("no error?") # fmt: off urlpatterns = [ path('admin/raise_error/', user_passes_test(lambda u: u.is_superuser, login_url='/login/')(raise_example_error), ), path(settings.ADMIN_URL, admin.site.urls), path("checkratelimit/", check_rate_limit), path("todo/", include("vbv_lernwelt.simpletodo.urls")), path("sso/", include("vbv_lernwelt.sso.urls")), path('cms/', include(wagtailadmin_urls)), path('documents/', include(wagtaildocs_urls)), path('pages/', include(wagtail_urls)), path('learnpath/', include("vbv_lernwelt.learnpath.urls")), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) if settings.DEBUG: # Static file serving when using Gunicorn + Uvicorn for local web socket development urlpatterns += staticfiles_urlpatterns() if settings.ALLOW_LOCAL_LOGIN: urlpatterns += [path("login/", django_view_authentication_exempt( auth_views.LoginView.as_view(template_name="core/login.html"))),] # API URLS urlpatterns += [ # API base url path("api/", include("config.api_router")), path('wagtailapi/v2/', wagtail_api_router.urls), # DRF auth token path("auth-token/", obtain_auth_token), path("api/schema/", SpectacularAPIView.as_view(), name="api-schema"), path("api/docs/", SpectacularSwaggerView.as_view(url_name="api-schema"), name="api-docs",), path("", include(grapple_urls)), ] if settings.APP_ENVIRONMENT != 'production': urlpatterns += [ re_path(r'cypressreset/$', cypress_reset_view, name='cypress_reset_view'), ] # fmt: on def handler403(request, exception=None): if isinstance(exception, Ratelimited): # if request.path.startswith("/swisscom/customer"): # return SwisscomCustomerLandingPageErrorView.as_view()(request) return rate_limit_exceeded_view(request, exception) return permission_denied_view(request, exception) handler500 = "vbv_lernwelt.core.views.server_json_error" if settings.DEBUG: # This allows the error pages to be debugged during development, just visit # these url in browser to see how these error pages look like. urlpatterns += [ path( "400/", default_views.bad_request, kwargs={"exception": Exception("Bad Request!")}, ), path( "403/", default_views.permission_denied, kwargs={"exception": Exception("Permission Denied")}, ), path( "404/", default_views.page_not_found, kwargs={"exception": Exception("Page not Found")}, ), path("500/", default_views.server_error), ] if "debug_toolbar" in settings.INSTALLED_APPS: import debug_toolbar urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns # serve everything else via the vue app # urlpatterns += [re_path(r'^.*$', vue_home, name='home')]