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

user registration pages

This commit is contained in:
2025-01-20 20:43:21 +00:00
parent 650cee4b0e
commit 8d8bc47e79
7 changed files with 122 additions and 21 deletions

View File

@@ -0,0 +1,42 @@
from django import forms
from django.http import HttpResponseRedirect
from django.shortcuts import render
"""
This is the new individual user login registration, instead of everyone signing
in as "expo". This will be useful for the kanban expo organisation tool.
"""
def register(request):
if request.method == "POST":
form = register_form(request.POST)
if form.is_valid():
# <process form cleaned data>
return HttpResponseRedirect("/success/")
else:
form = register_form(initial={"visible": "True"})
return render(request, "login/register.html", {"form": form})
class register_form(forms.Form): # not a model-form, just a form-form
username = forms.CharField(strip=True, required=True,
label="Username",
widget=forms.TextInput(
attrs={"size": 35, "placeholder": "e.g. anathema-device",
"style": "vertical-align: text-top;"}
))
password1 = forms.CharField(strip=True, required=True,
label="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",
widget=forms.TextInput(
attrs={"size": 30, "placeholder": "same as the password above",
"style": "vertical-align: text-top;"}
) )
# )

View File

@@ -31,7 +31,7 @@ def load_users():
DataIssue.objects.filter(parser=PARSER_USERS).delete()
key = settings.LONGTERM_SECRET_KEY # Django generated
k = base64.urlsafe_b64encode(key.encode("utf8")[:32]) # make Fernet compatible
k = base64.urlsafe_b64encode(key.encode("utf8")[:32]) # make Fernet compatible
f = Fernet(k)
jsonfile = settings.EXPOWEB / ENCRYPTED_DIR / USERS_FILE
@@ -43,15 +43,16 @@ def load_users():
return None
with open(jsonfile, 'r', encoding='utf-8') as json_f:
message = ""
try:
registered_users_dict = json.load(json_f)
except FileNotFoundError:
print("File not found!")
message = f"File {jsonfile} not found!"
except json.JSONDecodeError:
print("Invalid JSON format! - JSONDecodeError")
message = f"Invalid JSON format! - JSONDecodeError for {jsonfile}"
except Exception as e:
print(f"An exception occurred: {str(e)}")
message = f"! Troggle USERs. Failed to load {jsonfile} JSON file"
message = f"! Troggle USERs. Failed to load {jsonfile} JSON file. Exception <{e}>"
if message:
print(message)
DataIssue.objects.update_or_create(parser=PARSER_USERS, message=message, url=jsonurl)
return None
@@ -86,11 +87,6 @@ def load_users():
return None
else:
print(f" - user: BAD username for {userdata} ")
# if userdata["date"] != "" or userdata["date"] != "None":
# message = f"! {str(self.walletname)} Date format not ISO {userdata['date']}. Failed to load from {jsonfile} JSON file"
# from troggle.core.models.troggle import DataIssue
# DataIssue.objects.update_or_create(parser="wallets", message=message, url=wurl)
ru = []
for u in User.objects.all():
@@ -106,7 +102,8 @@ def load_users():
jsondict = { "registered_users": ru }
encryptedfile = settings.EXPOWEB / ENCRYPTED_DIR / "encrypt.json"
# with open(encryptedfile, 'w', encoding='utf-8') as json_f:
# json.dump(jsondict, json_f, indent=1)
if settings.DEVSERVER:
with open(encryptedfile, 'w', encoding='utf-8') as json_f:
json.dump(jsondict, json_f, indent=1)
return True

View File

@@ -50,4 +50,6 @@ This is because Django is Opinionated and does lots of Invisible Defaults
<p><input type="submit" value="Login &rarr;"></p>
</form>
</div>
<hr><hr>
{{form}}
{% endblock %}

View File

@@ -10,7 +10,7 @@ Note that we need to have TWO DIFFERENT logout templates to make this work,
the other one is in
troggle/templates/registration/
That one is for logging out of the Django Admin system.
This one is for logging out of the normal system whereas this one
This one is for logging out of the normal system whereas this one is for troggle
Not forgetting the template in
troggle/templates/login/index

View File

@@ -0,0 +1,51 @@
{% extends 'base.html' %}
{% block content %}
<!-- this overrides the django.contrib.auth default form
and it must be placed in
troggle/templates/login/register.html
because magic
This is because Django is Opinionated and does lots of Invisible Defaults
see
https://docs.djangoproject.com/en/5.0/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project
-->
<script>
function myFunction() {
var x = document.getElementById("id_password1");
if (x.type === "password") {
x.type = "text";
} else {
x.type = "password";
}
var x = document.getElementById("id_password2");
if (x.type === "password") {
x.type = "text";
} else {
x.type = "password";
}
}
</script>
<div class='middle'>
<h2>User registration - for a personal login to Troggle</h2>
</div>
<h3>Register a password and your email</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>
<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
<br /><br /><input type="submit" value="Register &rarr;">
</div>
</form>
{% endblock %}

View File

@@ -33,10 +33,10 @@ This file is actually identical to troggle/templates/login/index.html
<div class='space'></div>
{% if invalid %}
<p class='error'>The username and password you provided don't match. Please try again.</p>
<p>Have you <a href='/accounts/forgottenpassword/'>forgotten your password</a>?<br/>
Or perhaps <a href='/accounts/forgottenusername/'>your username</a>?</p>
<p>Have you <a href='/accounts/password_reset/'>forgotten your password - reset it</a>?<br/>
Or perhaps <a href='/accounts/password_change/'>change your password</a>?</p>
<p>Neither of those links work yet, by the way, I'm only trying to *appear* helpful.
<p>Neither of those links work properly yet, by the way, I'm only trying to *appear* helpful.
<div class='space'></div>
{% endif %}
@@ -51,5 +51,8 @@ This file is actually identical to troggle/templates/login/index.html
<br/>
<p><input type="submit" value="Login &rarr;"></p>
</form>
<hr/>
{{form}}
</div>
{% endblock %}

16
urls.py
View File

@@ -47,16 +47,20 @@ from troggle.core.views.logbooks import (
logentrydelete,
logreport,
notablepersons,
people_ids,
person,
personexpedition,
)
from troggle.core.views.other import controlpanel, exportlogbook, frontpage, todos
from troggle.core.views.prospect import prospecting
from troggle.core.views.user_registration import register
from troggle.core.views.scans import allscans, cavewallets, scansingle, walletslistperson, walletslistyear
from troggle.core.views.signup import signup
from troggle.core.views.uploads import dwgupload, expofilerename, gpxupload, photoupload
from troggle.core.views.wallets_edit import walletedit
# from troggle.core.views.user_registration import SignUpView # Warning: a Class-based View
"""This sets the actualurlpatterns[] and urlpatterns[] lists which django uses
to resolve urls - in both directions as these are declarative.
@@ -134,12 +138,13 @@ trogglepatterns = [
re_path(r'^caves$', caveindex, name="caveindex"),
re_path(r'^indxal.htm$', caveindex, name="caveindex"), # ~420 hrefs to this url in expoweb files
re_path(r'^people/?$', notablepersons, name="notablepersons"),
path('people_ids', people_ids, name="people_ids"),
path('caveslist', caveslist, name="caveslist"),
path('entrances', entranceindex, name="entranceindex"),
re_path(r'^admin/doc/', include('django.contrib.admindocs.urls')), # needs docutils Python module (http://docutils.sf.net/).
re_path(r'^admin/', admin.site.urls), # includes admin login & logout urls & /admin/jsi18n/
path('admin/', admin.site.urls), # includes admin login & logout urls & /admin/jsi18n/
# Uploads - uploading a file
path('walletedit/', walletedit, name='walletedit'),
@@ -163,11 +168,12 @@ trogglepatterns = [
# 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
#re_path(r'^accounts/', include('django.contrib.auth.urls')), # see site-packages\registration\auth_urls_classes.py
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
# Persons - nasty surname recognition logic fails for 19 people! See also Wallets by person below.
# path('person/<str:name>', person, name="person"), # This is much more complex than it looks..
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"),