members: invite member as user
parent
a49aab51b1
commit
e178f56369
@ -1,6 +1,8 @@
|
|||||||
from django.apps import AppConfig
|
from django.apps import AppConfig
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class LoginDataConfig(AppConfig):
|
class LoginDataConfig(AppConfig):
|
||||||
default_auto_field = 'django.db.models.BigAutoField'
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
name = 'logindata'
|
name = 'logindata'
|
||||||
|
verbose_name = _('Authentication')
|
||||||
|
|||||||
@ -0,0 +1,55 @@
|
|||||||
|
# Generated by Django 4.0.1 on 2024-11-23 21:15
|
||||||
|
|
||||||
|
import django.contrib.auth.models
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('auth', '0012_alter_user_first_name_max_length'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='RegistrationPassword',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('password', models.CharField(max_length=100, verbose_name='Password')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='AuthGroup',
|
||||||
|
fields=[
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Permission group',
|
||||||
|
'verbose_name_plural': 'Permission groups',
|
||||||
|
'proxy': True,
|
||||||
|
'indexes': [],
|
||||||
|
'constraints': [],
|
||||||
|
},
|
||||||
|
bases=('auth.group',),
|
||||||
|
managers=[
|
||||||
|
('objects', django.contrib.auth.models.GroupManager()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='LoginDatum',
|
||||||
|
fields=[
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Login Datum',
|
||||||
|
'verbose_name_plural': 'Login Data',
|
||||||
|
'proxy': True,
|
||||||
|
'indexes': [],
|
||||||
|
'constraints': [],
|
||||||
|
},
|
||||||
|
bases=('auth.user',),
|
||||||
|
managers=[
|
||||||
|
('objects', django.contrib.auth.models.UserManager()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
{% extends "members/base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Registration" %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<h1>{% trans "Set login data" %}</h1>
|
||||||
|
|
||||||
|
<p>{% trans "Something went wrong. The registration key is invalid or has expired." %}</p>
|
||||||
|
|
||||||
|
<p>{% trans "If you think this is a mistake, please" %} <a href="mailto:jugendreferent@jdav-ludwigsburg.de">{% trans "contact us." %}</a></p>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
{% extends "members/base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Register" %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="{% static "ludwigsburgalpin/termine.css" static %}">
|
||||||
|
|
||||||
|
<h1>{% trans "Set login data" %}</h1>
|
||||||
|
|
||||||
|
<p>{% trans "Welcome, " %} {{ member.prename }}.
|
||||||
|
{% blocktrans %}To set your personal login data, please enter the password that you received.{% endblocktrans %}</p>
|
||||||
|
|
||||||
|
{% if error_message %}
|
||||||
|
<p><b>{{ error_message }}</b></p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<form action="" method="post" enctype="multipart/form-data">
|
||||||
|
<table class="termine">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{form}}
|
||||||
|
</table>
|
||||||
|
<input name="key" type="hidden" value="{{key}}">
|
||||||
|
<input name="password" type="hidden" value="{{password}}">
|
||||||
|
<input name="save" type="hidden">
|
||||||
|
<input type="submit" value="{% trans "submit" %}"/>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
{% extends "members/base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Register" %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<h1>{% trans "Set login data" %}</h1>
|
||||||
|
|
||||||
|
<p>{% trans "Welcome, " %} {{ member.prename }}. {% blocktrans %}To set your personal login data for Kompass, please enter the password that you received.{% endblocktrans%}</p>
|
||||||
|
|
||||||
|
{% if error_message %}
|
||||||
|
<p class="errorlist">{{ error_message }}</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<form action="" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="password" name="password" required>
|
||||||
|
<input type="hidden" name="key" value="{{key}}">
|
||||||
|
<p><input type="submit" value="{% trans "submit" %}"/></p>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
{% extends "members/base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Registration successful" %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<h1>{% trans "Set login data" %}</h1>
|
||||||
|
|
||||||
|
<p>{% blocktrans %}You successfully set your login data. You can now proceed to{% endblocktrans%}
|
||||||
|
<a href="/kompass">login</a>.</p>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
from django.urls import re_path
|
||||||
|
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
app_name = "logindata"
|
||||||
|
urlpatterns = [
|
||||||
|
re_path(r'^register', views.register , name='register'),
|
||||||
|
]
|
||||||
@ -1,3 +1,76 @@
|
|||||||
|
from django import forms
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from django.urls import reverse
|
||||||
|
from django.contrib.auth.forms import UserCreationForm
|
||||||
|
from members.models import Member
|
||||||
|
from .models import initial_user_setup, RegistrationPassword
|
||||||
|
|
||||||
|
|
||||||
|
def render_register_password(request, key, member, error_message=''):
|
||||||
|
return render(request, 'logindata/register_password.html',
|
||||||
|
context={'key': key,
|
||||||
|
'member': member,
|
||||||
|
'error_message': error_message})
|
||||||
|
|
||||||
|
|
||||||
|
def render_register_failed(request):
|
||||||
|
return render(request, 'logindata/register_failed.html')
|
||||||
|
|
||||||
|
|
||||||
|
def render_register_form(request, key, password, member, form):
|
||||||
|
return render(request, 'logindata/register_form.html',
|
||||||
|
context={'key': key,
|
||||||
|
'password': password,
|
||||||
|
'member': member,
|
||||||
|
'form': form})
|
||||||
|
|
||||||
|
|
||||||
|
def render_register_success(request):
|
||||||
|
return render(request, 'logindata/register_success.html')
|
||||||
|
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
def register(request):
|
||||||
|
if request.method == 'GET' and 'key' not in request.GET:
|
||||||
|
return HttpResponseRedirect(reverse('startpage:index'))
|
||||||
|
if request.method == 'POST' and 'key' not in request.POST:
|
||||||
|
return HttpResponseRedirect(reverse('startpage:index'))
|
||||||
|
|
||||||
|
key = request.GET['key'] if request.method == 'GET' else request.POST['key']
|
||||||
|
if not key:
|
||||||
|
return render_register_failed(request)
|
||||||
|
try:
|
||||||
|
member = Member.objects.get(invite_as_user_key=key)
|
||||||
|
except (Member.DoesNotExist, Member.MultipleObjectsReturned):
|
||||||
|
return render_register_failed(request)
|
||||||
|
|
||||||
|
if request.method == 'GET':
|
||||||
|
return render_register_password(request, request.GET['key'], member)
|
||||||
|
|
||||||
|
if 'password' not in request.POST:
|
||||||
|
return render_register_failed(request)
|
||||||
|
|
||||||
|
password = request.POST['password']
|
||||||
|
|
||||||
|
# check if the entered password is one of the active registration passwords
|
||||||
|
if RegistrationPassword.objects.filter(password=password).count() == 0:
|
||||||
|
return render_register_password(request, key, member, error_message=_('You entered a wrong password.'))
|
||||||
|
|
||||||
|
if "save" in request.POST:
|
||||||
|
form = UserCreationForm(request.POST)
|
||||||
|
if not form.is_valid():
|
||||||
|
# form is invalid, reprint form with (automatic) error messages
|
||||||
|
return render_register_form(request, key, password, member, form)
|
||||||
|
user = form.save(commit=False)
|
||||||
|
success = initial_user_setup(user, member)
|
||||||
|
if success:
|
||||||
|
return render_register_success(request)
|
||||||
|
else:
|
||||||
|
return render_register_failed(request)
|
||||||
|
else:
|
||||||
|
prefill = {
|
||||||
|
'username': '{prename}.{lastname}'.format(prename=member.prename.lower(), lastname=member.lastname.lower()) }
|
||||||
|
form = UserCreationForm(initial=prefill)
|
||||||
|
return render_register_form(request, key, password, member, form)
|
||||||
|
|||||||
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.0.1 on 2024-11-23 19:28
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('members', '0023_alter_member_user'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='member',
|
||||||
|
name='invite_as_user_key',
|
||||||
|
field=models.CharField(default='', max_length=32),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
{% extends "admin/change_form_object_tools.html" %}
|
||||||
|
{% load i18n admin_urls %}
|
||||||
|
|
||||||
|
{% block object-tools-items %}
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a class="historylink" href="{% url 'admin:members_member_inviteasuser' original.pk %}">{% trans 'Invite as user' %}</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
{{block.super}}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
Loading…
Reference in New Issue