2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-20 05:46:34 +00:00
Files
InvenTree/InvenTree/web/urls.py
Matthias Mair be30cec2ad [PUI] SSO Support (#6333)
* Add sso buttons
Fixes #5753

* Added more icons

* fix callback url

* made heading dynamic

* allow either sso or normal reg

* Added SSO registration

* added divider

* added preferred ui API

* fix test

* fix update function

* refactor

* fix naming

* fix import

* add coverage ignore

* more ignore

* fixed missing key

* renamed button

* revert coverage statements

* set prefered mode before sso login

* added dynamic login redirect

* fixed test assert

* use API Endpoints instead of hardcoding

* fix lookup
2024-02-02 20:15:13 +11:00

99 lines
3.0 KiB
Python

"""URLs for web app."""
from django.conf import settings
from django.http import JsonResponse
from django.shortcuts import redirect
from django.urls import include, path, re_path
from django.views.decorators.csrf import ensure_csrf_cookie
from django.views.generic import TemplateView
from rest_framework import permissions, serializers
from InvenTree.mixins import RetrieveUpdateAPI
class RedirectAssetView(TemplateView):
"""View to redirect to static asset."""
def get(self, request, *args, **kwargs):
"""Redirect to static asset."""
return redirect(
f"{settings.STATIC_URL}web/assets/{kwargs['path']}", permanent=True
)
class PreferredSerializer(serializers.Serializer):
"""Serializer for the preferred serializer session setting."""
preferred_method = serializers.ChoiceField(choices=['cui', 'pui'])
pui = serializers.SerializerMethodField(read_only=True)
cui = serializers.SerializerMethodField(read_only=True)
def get_pui(self, obj):
"""Return true if preferred method is PUI."""
return obj['preferred_method'] == 'pui'
def get_cui(self, obj):
"""Return true if preferred method is CUI."""
return obj['preferred_method'] == 'cui'
class Meta:
"""Meta class for PreferedSerializer."""
fields = '__all__'
class PreferredUiView(RetrieveUpdateAPI):
"""Set preferred UI (CIU/PUI)."""
permission_classes = [permissions.AllowAny]
serializer_class = PreferredSerializer
http_method_names = ['get', 'post', 'put', 'head', 'options']
def retrieve(self, request, *args, **kwargs):
"""Retrieve the preferred UI method."""
session = self.request.session
session['preferred_method'] = session.get('preferred_method', 'cui')
serializer = self.get_serializer(data=dict(session))
serializer.is_valid(raise_exception=True)
return JsonResponse(serializer.data)
def update(self, request, *args, **kwargs):
"""Update the preferred UI method."""
serializer = self.get_serializer(data=self.clean_data(request.data))
serializer.is_valid(raise_exception=True)
# Run update
session = self.request.session
session['preferred_method'] = serializer.validated_data['preferred_method']
session.modified = True
return JsonResponse(serializer.data)
spa_view = ensure_csrf_cookie(TemplateView.as_view(template_name='web/index.html'))
assets_path = path('assets/<path:path>', RedirectAssetView.as_view())
urlpatterns = [
path(
f'{settings.FRONTEND_URL_BASE}/',
include([
assets_path,
path(
'set-password?uid=<uid>&token=<token>',
spa_view,
name='password_reset_confirm',
),
re_path('.*', spa_view),
]),
),
assets_path,
path(settings.FRONTEND_URL_BASE, spa_view, name='platform'),
]
api_urls = [
# UI Preference
path('ui_preference/', PreferredUiView.as_view(), name='api-ui-preference')
]