From e468227fbe59aa03e8f7b8f7d09f45d6178afb7a Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 8 Aug 2023 14:37:38 +1000 Subject: [PATCH] Email fix (#5396) * Construct absolute URL when sending email confirmation * Implement required changes to auth URLs * Fix unit test --- InvenTree/InvenTree/forms.py | 9 +++++++++ InvenTree/InvenTree/helpers_model.py | 4 +--- InvenTree/InvenTree/settings.py | 3 ++- InvenTree/InvenTree/tests.py | 5 ++++- InvenTree/InvenTree/urls.py | 20 ++++++++++++-------- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/InvenTree/InvenTree/forms.py b/InvenTree/InvenTree/forms.py index fb5c37ebdc..263a9a6cfa 100644 --- a/InvenTree/InvenTree/forms.py +++ b/InvenTree/InvenTree/forms.py @@ -292,6 +292,15 @@ class CustomAccountAdapter(CustomUrlMixin, RegistratonMixin, OTPAdapter, Default return False + def get_email_confirmation_url(self, request, emailconfirmation): + """Construct the email confirmation url""" + + from InvenTree.helpers_model import construct_absolute_url + + url = super().get_email_confirmation_url(request, emailconfirmation) + url = construct_absolute_url(url) + return url + class CustomSocialAccountAdapter(CustomUrlMixin, RegistratonMixin, DefaultSocialAccountAdapter): """Override of adapter to use dynamic settings.""" diff --git a/InvenTree/InvenTree/helpers_model.py b/InvenTree/InvenTree/helpers_model.py index 5fa514e682..9a2f8fb77a 100644 --- a/InvenTree/InvenTree/helpers_model.py +++ b/InvenTree/InvenTree/helpers_model.py @@ -50,9 +50,7 @@ def construct_absolute_url(*arg, **kwargs): # Otherwise, try to use the InvenTree setting try: site_url = common.models.InvenTreeSetting.get_setting('INVENTREE_BASE_URL', create=False, cache=False) - except ProgrammingError: - pass - except OperationalError: + except (ProgrammingError, OperationalError): pass if not site_url: diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index ec043da87b..2c67860e97 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -608,7 +608,8 @@ REMOTE_LOGIN_HEADER = get_setting('INVENTREE_REMOTE_LOGIN_HEADER', 'remote_login # Magic login django-sesame SESAME_MAX_AGE = 300 -LOGIN_REDIRECT_URL = "/platform/logged-in/" +# LOGIN_REDIRECT_URL = "/platform/logged-in/" +LOGIN_REDIRECT_URL = "/index/" # sentry.io integration for error reporting SENTRY_ENABLED = get_boolean_setting('INVENTREE_SENTRY_ENABLED', 'sentry_enabled', False) diff --git a/InvenTree/InvenTree/tests.py b/InvenTree/InvenTree/tests.py index 4e6b50c84c..4f4bdc3d7c 100644 --- a/InvenTree/InvenTree/tests.py +++ b/InvenTree/InvenTree/tests.py @@ -1180,6 +1180,9 @@ class MagicLoginTest(InvenTreeTestCase): # Check that the login works resp = self.client.get(reverse('sesame-login') + '?sesame=' + token) self.assertEqual(resp.status_code, 302) - self.assertEqual(resp.url, '/platform/logged-in/') + self.assertEqual(resp.url, '/index/') + # Note: 2023-08-08 - This test has been changed because "platform UI" is not generally available yet + # TODO: In the future, the URL comparison will need to be reverted + # self.assertEqual(resp.url, '/platform/logged-in/') # And we should be logged in again self.assertEqual(resp.wsgi_request.user, self.user) diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 95f04a0206..4db1c7106e 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -10,7 +10,8 @@ from django.urls import include, path, re_path from django.views.decorators.csrf import csrf_exempt from django.views.generic.base import RedirectView -from dj_rest_auth.registration.views import (SocialAccountDisconnectView, +from dj_rest_auth.registration.views import (ConfirmEmailView, + SocialAccountDisconnectView, SocialAccountListView) from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView from sesame.views import LoginView @@ -79,13 +80,16 @@ apipatterns = [ # InvenTree information endpoint path('', InfoView.as_view(), name='api-inventree-info'), - # Third party API endpoints - path('auth/', include('dj_rest_auth.urls')), - path('auth/registration/', include('dj_rest_auth.registration.urls')), - path('auth/providers/', SocialProvierListView.as_view(), name='social_providers'), - path('auth/social/', include(social_auth_urlpatterns)), - path('auth/social/', SocialAccountListView.as_view(), name='social_account_list'), - path('auth/social//disconnect/', SocialAccountDisconnectView.as_view(), name='social_account_disconnect'), + # Auth API endpoints + path('auth/', include([ + re_path(r'^registration/account-confirm-email/(?P[-:\w]+)/$', ConfirmEmailView.as_view(), name='account_confirm_email'), + path('registration/', include('dj_rest_auth.registration.urls')), + path('providers/', SocialProvierListView.as_view(), name='social_providers'), + path('social/', include(social_auth_urlpatterns)), + path('social/', SocialAccountListView.as_view(), name='social_account_list'), + path('social//disconnect/', SocialAccountDisconnectView.as_view(), name='social_account_disconnect'), + path('', include('dj_rest_auth.urls')), + ])), # Magic login URLs path("email/generate/", csrf_exempt(GetSimpleLoginView().as_view()), name="sesame-generate",),