[Feature] Password Reset Flow (#88)

Fixes #83

Co-authored-by: Tim Lorsbach <tim@lorsba.ch>
Reviewed-on: enviPath/enviPy#88
This commit is contained in:
2025-09-06 19:53:36 +12:00
parent a16035677c
commit 1a6608287d
10 changed files with 226 additions and 223 deletions

View File

@ -1,21 +1,36 @@
from django.urls import path, re_path
from django.contrib.auth import views as auth_views
from . import views as v
# from sesame.views import LoginView
UUID = '[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}'
urlpatterns = [
# Sesame
# path("login/", v.EmailLoginView.as_view(), name="email_login"),
# path("login/auth/", LoginView.as_view(), name="login"),
# Home
re_path(r'^$', v.index, name='index'),
# Login
re_path(r'^login', v.login, name='login'),
re_path(r'^logout', v.logout, name='logout'),
# Built In views
path('password_reset/', auth_views.PasswordResetView.as_view(
template_name='static/password_reset_form.html'
), name='password_reset'),
path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(
template_name='static/password_reset_done.html'
), name='password_reset_done'),
path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(
template_name='static/password_reset_confirm.html'
), name='password_reset_confirm'),
path('reset/done/', auth_views.PasswordResetCompleteView.as_view(
template_name='static/password_reset_complete.html'
), name='password_reset_complete'),
# Top level urls
re_path(r'^package$', v.packages, name='packages'),
re_path(r'^compound$', v.compounds, name='compounds'),
@ -78,5 +93,6 @@ urlpatterns = [
re_path(r'^depict$', v.depict, name='depict'),
# OAuth Stuff
path("o/userinfo/", v.userinfo, name="oauth_userinfo"),
]

View File

@ -48,7 +48,7 @@ def login(request):
if request.method == 'GET':
context['title'] = 'enviPath'
context['next'] = request.GET.get('next', '')
return render(request, 'login.html', context)
return render(request, 'static/login.html', context)
elif request.method == 'POST':
is_login = bool(request.POST.get('login', False))
@ -67,17 +67,17 @@ def login(request):
if not temp_user.is_active:
context['message'] = "User account is not activated yet!"
return render(request, 'login.html', context)
return render(request, 'static/login.html', context)
email = temp_user.email
except get_user_model().DoesNotExist:
context['message'] = "Login failed!"
return render(request, 'login.html', context)
return render(request, 'static/login.html', context)
try:
user = authenticate(username=email, password=password)
except Exception as e:
context['message'] = "Login failed!"
return render(request, 'login.html', context)
return render(request, 'static/login.html', context)
if user is not None:
login(request, user)
@ -88,7 +88,7 @@ def login(request):
return redirect(s.SERVER_URL)
else:
context['message'] = "Login failed!"
return render(request, 'login.html', context)
return render(request, 'static/login.html', context)
elif is_register:
username = request.POST.get('username')
@ -98,19 +98,19 @@ def login(request):
if password != rpassword or password == '':
context['message'] = "Registration failed, provided passwords differ!"
return render(request, 'login.html', context)
return render(request, 'static/login.html', context)
try:
u = UserManager.create_user(username, email, password)
except Exception:
context['message'] = "Registration failed! Couldn't create User Account."
return render(request, 'login.html', context)
return render(request, 'static/login.html', context)
if s.ADMIN_APPROVAL_REQUIRED:
context['message'] = "Your account has been created! An admin will activate it soon!"
else:
context['message'] = "Account has been created! You'll receive a mail to activate your account shortly."
return render(request, 'login.html', context)
return render(request, 'static/login.html', context)
else:
return HttpResponseBadRequest()
else: