2
0
mirror of https://expo.survex.com/repositories/troggle/.git synced 2025-12-15 09:07:06 +00:00

form now working with basic validation

This commit is contained in:
2025-01-20 21:57:11 +00:00
parent d79ffd8354
commit ba5987b674
4 changed files with 63 additions and 17 deletions

View File

@@ -1,6 +1,7 @@
from django import forms
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.core.exceptions import ValidationError
"""
This is the new individual user login registration, instead of everyone signing
@@ -13,7 +14,10 @@ def register(request):
form = register_form(request.POST)
if form.is_valid():
# <process form cleaned data>
return HttpResponseRedirect("/success/")
un = form.cleaned_data["username"]
pw= form.cleaned_data["password1"]
return HttpResponseRedirect("/accounts/login/")
else:
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",
"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,
label="Password",
label="Troggle password",
widget=forms.TextInput(
attrs={"size": 30, "placeholder": "your new login password",
"style": "vertical-align: text-top;"}
))
password2 = forms.CharField(strip=True, required=True,
label="Re-type your password",
label="Re-type your troggle password",
widget=forms.TextInput(
attrs={"size": 30, "placeholder": "same as the password above",
"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."
)

View File

@@ -28,7 +28,7 @@
<a id="handbook" href="/handbook/computing/onlinesystems.html">Handbook</a> |
{% if user.username %}User:{{ user.username }}
{% 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%}
</div>

View File

@@ -29,23 +29,55 @@ function myFunction() {
<div class='middle'>
<h2>User registration - for a personal login to Troggle</h2>
</div>
<h3>Register a password and your email</h3>
<h3>Register a password and your email address</h3>
<!--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">
<form method="post" accept-charset="utf-8">{% csrf_token %}
{{form.as_p}}
<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 &rarr;">
</div>
</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 %}

12
urls.py
View File

@@ -166,16 +166,12 @@ trogglepatterns = [
# 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
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/register", register, name="register"),
#path("accounts/register", SignUpView.as_view(), name="signup"),
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/register/", register, name="register"),
path('accounts/', include('django.contrib.auth.urls')), # see site-packages\registration\auth_urls_classes.py
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('person/<slug:slug>', person, name="person"),
path('personexpedition/<slug:slug>/<int:year>', personexpedition, name="personexpedition"),
# Expedition master page & API exports