[Fix] Registering Issue (#125)

Co-authored-by: Tim Lorsbach <tim@lorsba.ch>
Reviewed-on: enviPath/enviPy#125
This commit is contained in:
2025-09-19 01:17:03 +12:00
parent f03ade0e94
commit b3079834c1
6 changed files with 152 additions and 65 deletions

View File

@ -348,6 +348,7 @@ FLAGS = {
# path of the URL are checked via "startswith" # path of the URL are checked via "startswith"
# -> /password_reset/done is covered as well # -> /password_reset/done is covered as well
LOGIN_EXEMPT_URLS = [ LOGIN_EXEMPT_URLS = [
'/register',
'/api/legacy/', '/api/legacy/',
'/o/token/', '/o/token/',
'/o/userinfo/', '/o/userinfo/',

View File

@ -164,7 +164,7 @@ class UserManager(object):
if 'uuid' in kwargs: if 'uuid' in kwargs:
extra_fields['uuid'] = kwargs['uuid'] extra_fields['uuid'] = kwargs['uuid']
u = get_user_model().objects.create_user(username, email, password, **kwargs) u = get_user_model().objects.create_user(username, email, password, **extra_fields)
# Create package # Create package
package_name = f"{u.username}{'' if u.username[-1] in 'sxzß' else 's'} Package" package_name = f"{u.username}{'' if u.username[-1] in 'sxzß' else 's'} Package"

View File

@ -12,6 +12,7 @@ urlpatterns = [
# Login # Login
re_path(r'^login', v.login, name='login'), re_path(r'^login', v.login, name='login'),
re_path(r'^logout', v.logout, name='logout'), re_path(r'^logout', v.logout, name='logout'),
re_path(r'^register', v.register, name='register'),
# Built In views # Built In views
path('password_reset/', auth_views.PasswordResetView.as_view( path('password_reset/', auth_views.PasswordResetView.as_view(

View File

@ -51,71 +51,44 @@ def login(request):
return render(request, 'static/login.html', context) return render(request, 'static/login.html', context)
elif request.method == 'POST': elif request.method == 'POST':
is_login = bool(request.POST.get('login', False)) from django.contrib.auth import authenticate
is_register = bool(request.POST.get('register', False)) from django.contrib.auth import login
if is_login: username = request.POST.get('username')
from django.contrib.auth import authenticate password = request.POST.get('password')
from django.contrib.auth import login
username = request.POST.get('username') # Get email for username and check if the account is active
password = request.POST.get('password') try:
temp_user = get_user_model().objects.get(username=username)
# Get email for username and check if the account is active if not temp_user.is_active:
try: context['message'] = "User account is not activated yet!"
temp_user = get_user_model().objects.get(username=username)
if not temp_user.is_active:
context['message'] = "User account is not activated yet!"
return render(request, 'static/login.html', context)
email = temp_user.email
except get_user_model().DoesNotExist:
context['message'] = "Login failed!"
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, 'static/login.html', context) return render(request, 'static/login.html', context)
if user is not None: email = temp_user.email
login(request, user) except get_user_model().DoesNotExist:
context['message'] = "Login failed!"
if next := request.POST.get('next'):
return redirect(next)
return redirect(s.SERVER_URL)
else:
context['message'] = "Login failed!"
return render(request, 'static/login.html', context)
elif is_register:
username = request.POST.get('username')
email = request.POST.get('email')
password = request.POST.get('password', '').strip()
rpassword = request.POST.get('rpassword', '').strip()
if password != rpassword or password == '':
context['message'] = "Registration failed, provided passwords differ!"
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, '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, 'static/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, 'static/login.html', context)
if user is not None:
login(request, user)
if next := request.POST.get('next'):
return redirect(next)
return redirect(s.SERVER_URL)
else: else:
return HttpResponseBadRequest() context['message'] = "Login failed!"
return render(request, 'static/login.html', context)
else: else:
return HttpResponseNotAllowed(['GET', 'POST']) return HttpResponseNotAllowed(['GET', 'POST'])
def logout(request): def logout(request):
if request.method == 'POST': if request.method == 'POST':
is_logout = bool(request.POST.get('logout', False)) is_logout = bool(request.POST.get('logout', False))
@ -128,6 +101,48 @@ def logout(request):
return HttpResponseBadRequest() return HttpResponseBadRequest()
def register(request):
current_user = _anonymous_or_real(request)
context = get_base_context(request)
if request.method == 'GET':
context['title'] = 'enviPath'
context['next'] = request.GET.get('next', '')
return render(request, 'static/register.html', context)
elif request.method == 'POST':
context['title'] = 'enviPath'
if next := request.POST.get('next'):
context['next'] = next
username = request.POST.get('username', '').strip()
email = request.POST.get('email', '').strip()
password = request.POST.get('password', '').strip()
rpassword = request.POST.get('rpassword', '').strip()
if not (username and email and password):
context["message"] = "Invalid username/email/password"
return render(request, 'static/register.html', context)
if password != rpassword or password == '':
context['message'] = "Registration failed, provided passwords differ!"
return render(request, 'static/register.html', context)
try:
u = UserManager.create_user(username, email, password)
except Exception:
context['message'] = "Registration failed! Couldn't create User Account."
return render(request, 'static/register.html', context)
if s.ADMIN_APPROVAL_REQUIRED:
context['success_message'] = "Your account has been created! An admin will activate it soon!"
else:
context['success_message'] = "Account has been created! You'll receive a mail to activate your account shortly."
return render(request, 'static/login.html', context)
else:
return HttpResponseNotAllowed(['GET', 'POST'])
def editable(request, user): def editable(request, user):
if user.is_superuser: if user.is_superuser:

View File

@ -5,6 +5,10 @@
<div class="alert alert-danger" role="alert"> <div class="alert alert-danger" role="alert">
{{ message }} {{ message }}
</div> </div>
{% elif success_message %}
<div class="alert alert-success" role="alert">
{{ success_message }}
</div>
{% else %} {% else %}
<div class="alert alert-success" role="alert"> <div class="alert alert-success" role="alert">
Kia ora! We are running our closed beta tests at the moment. It would be great to get your help as tester, Kia ora! We are running our closed beta tests at the moment. It would be great to get your help as tester,
@ -22,7 +26,6 @@
<form class="form-horizontal" method="post" action="{% url 'login' %}"> <form class="form-horizontal" method="post" action="{% url 'login' %}">
{% csrf_token %} {% csrf_token %}
<fieldset> <fieldset>
<input type="hidden" name="login" id="login" value="true"/>
<div class="control-group"> <div class="control-group">
<label class="control-label" for="username">Username</label> <label class="control-label" for="username">Username</label>
<div class="controls"> <div class="controls">
@ -38,15 +41,17 @@
<a href="{% url 'password_reset' %}">Forgot your password?</a> <a href="{% url 'password_reset' %}">Forgot your password?</a>
</div> </div>
</div> </div>
</fieldset>
<div class="control-group"> <div class="control-group">
<label class="control-label" for="signin"></label> <label class="control-label" for="signin"></label>
<div class="controls"> <div class="controls">
<button id="signin" name="signin" class="btn btn-success">Sign In <button id="signin" name="signin" class="btn btn-success pull-right">Sign In
</button> </button>
<a class="btn btn-primary" href="{% url 'register' %}">Create an Account</a>
</div>
</div> </div>
</div> <input type="hidden" name="next" value="{{ next }}"/>
<input type="hidden" name="next" value="{{ next }}"/> </fieldset>
</form> </form>
</div> </div>
</div> </div>

View File

@ -0,0 +1,65 @@
{% extends "static/static_base.html" %}
{% block content %}
{% if message %}
<div class="alert alert-danger" role="alert">
{{ message }}
</div>
{% else %}
<div class="alert alert-success" role="alert">
Kia ora! We are running our closed beta tests at the moment. It would be great to get your help as tester,
you
can apply to become tester by registering for this page, just hit the button below. More information on the
beta
test is available in our <a href="https://community.envipath.org/t/apply-to-join-our-closed-beta/95">
community
form</a>
</div>
{% endif %}
<div class="modal-dialog" style="margin:30px auto; z-index:9999;">
<div class="modal-content">
<div class="modal-body">
<form class="form-horizontal" method="post" action="{% url 'register' %}">
{% csrf_token %}
<fieldset>
<div class="control-group">
<label class="control-label" for="username">Username</label>
<div class="controls">
<input required id="username" name="username" type="text"
class="form-control" placeholder="username" autocomplete="username">
</div>
<label class="control-label" for="email">Email</label>
<div class="controls">
<input required id="email" name="email" type="text"
class="form-control" placeholder="email" autocomplete="email">
</div>
<label class="control-label" for="passwordinput">Password:</label>
<div class="controls">
<input required id="passwordinput" name="password" class="form-control"
type="password" placeholder="********" autocomplete="current-password">
</div>
<label class="control-label" for="passwordinput2">Password:</label>
<div class="controls">
<input required id="passwordinput2" name="rpassword" class="form-control"
type="password" placeholder="********" autocomplete="current-password">
</div>
<div class="form-group text-center" style="margin-top:15px;">
<a href="{% url 'password_reset' %}">Forgot your password?</a>
</div>
</div>
<div class="control-group">
<label class="control-label" for="signin"></label>
<div class="controls">
<button id="signin" name="signin" class="btn btn-success pull-right">Sign Up
</button>
<a class="btn btn-primary" href="{% url 'login' %}">Already have an Account?</a>
</div>
</div>
<input type="hidden" name="next" value="{{ next }}"/>
</fieldset>
</form>
</div>
</div>
</div>
{% endblock %}