forked from expo/troggle
form now working with basic validation
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
|
|
||||||
"""
|
"""
|
||||||
This is the new individual user login registration, instead of everyone signing
|
This is the new individual user login registration, instead of everyone signing
|
||||||
@@ -13,7 +14,10 @@ def register(request):
|
|||||||
form = register_form(request.POST)
|
form = register_form(request.POST)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
# <process form cleaned data>
|
# <process form cleaned data>
|
||||||
return HttpResponseRedirect("/success/")
|
un = form.cleaned_data["username"]
|
||||||
|
pw= form.cleaned_data["password1"]
|
||||||
|
|
||||||
|
return HttpResponseRedirect("/accounts/login/")
|
||||||
else:
|
else:
|
||||||
form = register_form(initial={"visible": "True"})
|
form = register_form(initial={"visible": "True"})
|
||||||
|
|
||||||
@@ -26,17 +30,31 @@ class register_form(forms.Form): # not a model-form, just a form-form
|
|||||||
attrs={"size": 35, "placeholder": "e.g. anathema-device",
|
attrs={"size": 35, "placeholder": "e.g. anathema-device",
|
||||||
"style": "vertical-align: text-top;"}
|
"style": "vertical-align: text-top;"}
|
||||||
))
|
))
|
||||||
|
email = forms.CharField(strip=True, required=True,
|
||||||
|
label="email",
|
||||||
|
widget=forms.TextInput(
|
||||||
|
attrs={"size": 35, "placeholder": "e.g. anathema@potatohut.exp",
|
||||||
|
"style": "vertical-align: text-top;"}
|
||||||
|
))
|
||||||
password1 = forms.CharField(strip=True, required=True,
|
password1 = forms.CharField(strip=True, required=True,
|
||||||
label="Password",
|
label="Troggle password",
|
||||||
widget=forms.TextInput(
|
widget=forms.TextInput(
|
||||||
attrs={"size": 30, "placeholder": "your new login password",
|
attrs={"size": 30, "placeholder": "your new login password",
|
||||||
"style": "vertical-align: text-top;"}
|
"style": "vertical-align: text-top;"}
|
||||||
))
|
))
|
||||||
password2 = forms.CharField(strip=True, required=True,
|
password2 = forms.CharField(strip=True, required=True,
|
||||||
label="Re-type your password",
|
label="Re-type your troggle password",
|
||||||
widget=forms.TextInput(
|
widget=forms.TextInput(
|
||||||
attrs={"size": 30, "placeholder": "same as the password above",
|
attrs={"size": 30, "placeholder": "same as the password above",
|
||||||
"style": "vertical-align: text-top;"}
|
"style": "vertical-align: text-top;"}
|
||||||
) )
|
) )
|
||||||
|
|
||||||
# )
|
def clean(self):
|
||||||
|
cleaned_data = super().clean()
|
||||||
|
pw1 = cleaned_data.get("password1")
|
||||||
|
pw2 = cleaned_data.get("password2")
|
||||||
|
|
||||||
|
if pw1 != pw2:
|
||||||
|
raise ValidationError(
|
||||||
|
"Retyped password does not match initial password: please fix this."
|
||||||
|
)
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
<a id="handbook" href="/handbook/computing/onlinesystems.html">Handbook</a> |
|
<a id="handbook" href="/handbook/computing/onlinesystems.html">Handbook</a> |
|
||||||
{% if user.username %}User:{{ user.username }}
|
{% if user.username %}User:{{ user.username }}
|
||||||
{% if user.person %}(<a href="{{ user.person.get_absolute_url }}">{{ user.person }}</a>){% endif %}
|
{% if user.person %}(<a href="{{ user.person.get_absolute_url }}">{{ user.person }}</a>){% endif %}
|
||||||
| <a <a href='/accounts/logout/'>Log out</a> {% else %} <a href='/accounts/login/'>Log in</a> {% endif %}
|
| <a href='/accounts/logout/'>Log out</a> {% else %} <a href='/accounts/register/'>Register</a> <a href='/accounts/login/'>Log in</a> {% endif %}
|
||||||
{% endblock%}
|
{% endblock%}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -29,23 +29,55 @@ function myFunction() {
|
|||||||
<div class='middle'>
|
<div class='middle'>
|
||||||
<h2>User registration - for a personal login to Troggle</h2>
|
<h2>User registration - for a personal login to Troggle</h2>
|
||||||
</div>
|
</div>
|
||||||
<h3>Register a password and your email</h3>
|
<h3>Register a password and your email address</h3>
|
||||||
<!--using template login/register.html -->
|
<!--using template login/register.html -->
|
||||||
<p>For previous expoers, your username must be your id as listed on the <a href='/people'>past expoers list</a>
|
<p>For previous expoers, your username must be your 'troggle id' as listed on the <a href='/people_ids'>past expoers list</a>
|
||||||
|
<p>This will eventually sign you up automatically to the
|
||||||
|
<a href="https://lists.wookware.org/cgi-bin/mailman/roster/expo">expo email list</a>.
|
||||||
|
So type in the same email address that you use there.
|
||||||
<div style='width: 40%' align="right">
|
<div style='width: 40%' align="right">
|
||||||
<form method="post" accept-charset="utf-8">{% csrf_token %}
|
<form method="post" accept-charset="utf-8">{% csrf_token %}
|
||||||
{{form.as_p}}
|
{{form.as_p}}
|
||||||
|
|
||||||
<div class='align-right'>
|
<div class='align-right'>
|
||||||
<input type="checkbox" checked name="visible" onclick="myFunction()">Make Passwords visible
|
<input type="checkbox" checked name="visible" onclick="myFunction()">Make Passwords visible (on this form only)
|
||||||
|
|
||||||
<br /><br /><input type="submit" value="Register →">
|
<br /><br /><input type="submit" value="Register →">
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
</div>
|
||||||
|
<div style='width: 40%' align="left">
|
||||||
|
<span style="color:red">
|
||||||
|
{{ form.non_field_errors }} <!-- form validation errors appear here -->
|
||||||
|
</span>
|
||||||
|
<p>Unfortunately cavers tend to use weird and playful names when signing up for things,
|
||||||
|
so we can't automatically connect the troggle names and ids with the email addresses
|
||||||
|
on the email list. And we don't believe in signing people up for things without their
|
||||||
|
direct permission anyway.
|
||||||
|
Having said that, we <em>will</em> sign you up automatically to the expo email list as
|
||||||
|
that is how expo manages everything and it is a condition of coming on expo.
|
||||||
|
|
||||||
|
<p>But the automatic sign-up to the email list is not working yet, and may not be before April 2025.
|
||||||
|
So if you don't want to miss out on anything important, make sure you sign up to the
|
||||||
|
<a href="https://lists.wookware.org/cgi-bin/mailman/roster/expo">email list</a>
|
||||||
|
right now.
|
||||||
|
|
||||||
|
<h3>Students !</h3>
|
||||||
|
Please do not use an email address which will expire when you leave your current institution.
|
||||||
|
This will happen much sooner than you realise.
|
||||||
|
|
||||||
|
<h3>Security note</h3>
|
||||||
|
We never store passwords at all, we only store a cryptographic hash.
|
||||||
|
We do store your email address but only 'in clear' inside the live database online
|
||||||
|
where it is accessible only to the database administrators. There is no troggle report
|
||||||
|
which publishes your email address.
|
||||||
|
For permanent storage all email addresses are encrypted. Your troggle
|
||||||
|
username is public however, and we do not have anonymous people attending expo.
|
||||||
|
<p>The password we are asking for is used only to log on to troggle to keep track of
|
||||||
|
who is editing the current expo records, website content, historic survey data and
|
||||||
|
when using the expo kanban software. It is not the same as the password to access your email
|
||||||
|
and it is not the same as the password you use to interact with the expo email list.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
12
urls.py
12
urls.py
@@ -166,16 +166,12 @@ trogglepatterns = [
|
|||||||
|
|
||||||
# setting LOGIN_URL = '/accounts/login/' is default.
|
# setting LOGIN_URL = '/accounts/login/' is default.
|
||||||
# NB setting url pattern name to 'login' instea dof 'expologin' with override Django, see https://docs.djangoproject.com/en/dev/topics/http/urls/#naming-url-patterns
|
# NB setting url pattern name to 'login' instea dof 'expologin' with override Django, see https://docs.djangoproject.com/en/dev/topics/http/urls/#naming-url-patterns
|
||||||
path('accounts/logout/', expologout, name='expologout'), # same as in django.contrib.auth.urls
|
path('accounts/logout/', expologout, name='expologout'), # same as in django.contrib.auth.urls
|
||||||
path('accounts/login/', expologin, name='expologin'), # same as in django.contrib.auth.urls
|
path('accounts/login/', expologin, name='expologin'), # same as in django.contrib.auth.urls
|
||||||
path("accounts/register", register, name="register"),
|
path("accounts/register/", register, name="register"),
|
||||||
#path("accounts/register", SignUpView.as_view(), name="signup"),
|
|
||||||
path('accounts/', include('django.contrib.auth.urls')), # see site-packages\registration\auth_urls_classes.py
|
path('accounts/', include('django.contrib.auth.urls')), # see site-packages\registration\auth_urls_classes.py
|
||||||
|
|
||||||
|
|
||||||
path('person/<slug:slug>', person, name="person"),
|
path('person/<slug:slug>', person, name="person"),
|
||||||
#re_path(r'^person/(?P<first_name>[A-Z]*[a-z\-\'&;]*)[^a-zA-Z]*(?P<last_name>[a-z\-\']*[^a-zA-Z]*[\-]*[A-Z]*[a-zA-Z\-&;]*)/?', person, name="person"),
|
|
||||||
#re_path(r'^personexpedition/(?P<first_name>[A-Z]*[a-z&;]*)[^a-zA-Z]*(?P<last_name>[A-Z]*[a-zA-Z&;]*)/(?P<year>\d+)/?$', personexpedition, name="personexpedition"),
|
|
||||||
path('personexpedition/<slug:slug>/<int:year>', personexpedition, name="personexpedition"),
|
path('personexpedition/<slug:slug>/<int:year>', personexpedition, name="personexpedition"),
|
||||||
|
|
||||||
# Expedition master page & API exports
|
# Expedition master page & API exports
|
||||||
|
|||||||
Reference in New Issue
Block a user