You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
316 lines
12 KiB
Python
316 lines
12 KiB
Python
from django.shortcuts import render
|
|
from django.utils.translation import gettext_lazy as _
|
|
from django.http import HttpResponseRedirect
|
|
from django.forms import ModelForm, TextInput, DateInput
|
|
from members.models import Member, RegistrationPassword, MemberUnconfirmedProxy, MemberWaitingList, Group
|
|
from django.urls import reverse
|
|
from django.utils import timezone
|
|
|
|
|
|
class MemberForm(ModelForm):
|
|
class Meta:
|
|
model = Member
|
|
fields = ['prename', 'lastname', 'street', 'plz', 'town', 'phone_number',
|
|
'phone_number_parents', 'birth_date']
|
|
widgets = {
|
|
'birth_date': DateInput(format='%d.%m.%Y', attrs={'class': 'datepicker'})
|
|
}
|
|
|
|
class MemberRegistrationForm(ModelForm):
|
|
def __init__(self, *args, **kwargs):
|
|
super(MemberRegistrationForm, self).__init__(*args, **kwargs)
|
|
|
|
for field in self.Meta.required:
|
|
self.fields[field].required = True
|
|
|
|
self.fields['cc_email_parents'].initial = False
|
|
|
|
class Meta:
|
|
model = Member
|
|
fields = ['prename', 'lastname', 'street', 'plz', 'town', 'phone_number',
|
|
'phone_number_parents', 'birth_date', 'email', 'email_parents', 'cc_email_parents',
|
|
'registration_form']
|
|
widgets = {
|
|
'birth_date': DateInput(format='%d.%m.%Y', attrs={'class': 'datepicker'})
|
|
}
|
|
required = ['registration_form', 'street', 'plz', 'town']
|
|
|
|
|
|
class MemberRegistrationWaitingListForm(ModelForm):
|
|
def __init__(self, *args, **kwargs):
|
|
super(MemberRegistrationWaitingListForm, self).__init__(*args, **kwargs)
|
|
|
|
for field in self.Meta.required:
|
|
self.fields[field].required = True
|
|
|
|
self.fields['cc_email_parents'].initial = False
|
|
|
|
class Meta:
|
|
model = MemberWaitingList
|
|
fields = ['prename', 'lastname', 'birth_date', 'email', 'email_parents', 'cc_email_parents']
|
|
widgets = {
|
|
'birth_date': DateInput(format='%d.%m.%Y', attrs={'class': 'datepicker'})
|
|
}
|
|
required = []
|
|
|
|
|
|
def render_echo_failed(request, reason=""):
|
|
context = {}
|
|
if reason:
|
|
context['reason'] = reason
|
|
return render(request, 'members/echo_failed.html', context)
|
|
|
|
|
|
def render_echo(request, key, form):
|
|
return render(request, 'members/echo.html', {'form': form.as_table(),
|
|
'key' : key})
|
|
|
|
|
|
def render_echo_success(request, name):
|
|
return render(request, 'members/echo_success.html', {'name': name})
|
|
|
|
|
|
def echo(request):
|
|
if request.method == 'GET' and 'key' in request.GET:
|
|
try:
|
|
key = request.GET['key']
|
|
member = Member.objects.get(echo_key=key)
|
|
if not member.may_echo(key):
|
|
raise KeyError
|
|
form = MemberForm(instance=member)
|
|
return render_echo(request, key, form)
|
|
except Member.DoesNotExist:
|
|
return render_echo_failed(request, _("invalid"))
|
|
except KeyError:
|
|
return render_echo_failed(request, _("expired"))
|
|
elif request.method == 'POST':
|
|
try:
|
|
key = request.POST['key']
|
|
member = Member.objects.get(echo_key=key)
|
|
if not member.may_echo(key):
|
|
raise KeyError
|
|
form = MemberForm(request.POST, instance=member)
|
|
try:
|
|
form.save()
|
|
member.echo_key, member.echo_expire = "", timezone.now()
|
|
member.echoed = True
|
|
member.save()
|
|
return render_echo_success(request, member.prename)
|
|
except ValueError:
|
|
# when input is invalid
|
|
form = MemberForm(request.POST)
|
|
return render_echo(request, key, form)
|
|
except (Member.DoesNotExist, KeyError):
|
|
return render_echo_failed(request, _("invalid"))
|
|
|
|
|
|
def render_register_password(request):
|
|
return render(request, 'members/register_password.html')
|
|
|
|
|
|
def render_register_wrong_password(request):
|
|
return render(request,
|
|
'members/register_password.html',
|
|
{'error_message': _("The entered password is wrong.")})
|
|
|
|
|
|
def render_register_success(request, groupname, membername, needs_mail_confirmation):
|
|
return render(request,
|
|
'members/register_success.html',
|
|
{'groupname': groupname,
|
|
'membername': membername,
|
|
'needs_mail_confirmation': needs_mail_confirmation})
|
|
|
|
|
|
def render_register(request, group, form=None, pwd=None, waiter_key=''):
|
|
if form is None:
|
|
form = MemberRegistrationForm()
|
|
return render(request,
|
|
'members/register.html',
|
|
{'form': form,
|
|
'group': group,
|
|
'waiter_key': waiter_key,
|
|
'pwd': pwd,
|
|
})
|
|
|
|
|
|
def render_register_failed(request, reason=""):
|
|
context = {}
|
|
if reason:
|
|
context['reason'] = reason
|
|
return render(request, 'members/register_failed.html', context)
|
|
|
|
|
|
def register(request):
|
|
if request.method == 'GET' or ("password" not in request.POST and "waiter_key" not in request.POST):
|
|
# show password
|
|
return render_register_password(request)
|
|
|
|
# find group and potential waiter
|
|
group = None
|
|
waiter = None
|
|
pwd = None
|
|
waiter_key = request.POST['waiter_key'] if 'waiter_key' in request.POST else ''
|
|
if "password" in request.POST and request.POST['password']:
|
|
# confirm password
|
|
try:
|
|
pwd = RegistrationPassword.objects.get(password=request.POST['password'])
|
|
group = pwd.group
|
|
except RegistrationPassword.DoesNotExist:
|
|
return render_register_wrong_password(request)
|
|
elif waiter_key:
|
|
try:
|
|
waiter = MemberWaitingList.objects.get(registration_key=waiter_key)
|
|
group = waiter.invited_for_group
|
|
except MemberWaitingList.DoesNotExist:
|
|
return render_register_failed(request)
|
|
|
|
# group must not be None
|
|
if group is None:
|
|
return render_register_failed(request)
|
|
|
|
if "save" in request.POST:
|
|
# process registration
|
|
form = MemberRegistrationForm(request.POST, request.FILES)
|
|
try:
|
|
new_member = form.save()
|
|
new_member.group.add(group)
|
|
new_member.confirmed = False
|
|
needs_mail_confirmation = True
|
|
if waiter:
|
|
if new_member.email == waiter.email and new_member.email_parents == waiter.email_parents:
|
|
new_member.confirmed_mail = True
|
|
new_member.confirmed_mail_parents = True
|
|
needs_mail_confirmation = False
|
|
new_member.notify_jugendleiters_about_confirmed_mail()
|
|
waiter.delete()
|
|
|
|
new_member.save()
|
|
if needs_mail_confirmation:
|
|
new_member.request_mail_confirmation()
|
|
return render_register_success(request, group.name, new_member.prename, needs_mail_confirmation)
|
|
except ValueError:
|
|
# when input is invalid
|
|
return render_register(request, group, form, pwd=pwd, waiter_key=waiter_key)
|
|
# we are not saving yet
|
|
return render_register(request, group, form=None, pwd=pwd, waiter_key=waiter_key)
|
|
|
|
|
|
def confirm_mail(request):
|
|
if request.method == 'GET' and 'key' in request.GET:
|
|
key = request.GET['key']
|
|
matching_unconfirmed = MemberUnconfirmedProxy.objects.filter(confirm_mail_key=key) \
|
|
| MemberUnconfirmedProxy.objects.filter(confirm_mail_parents_key=key)
|
|
matching_waiter = MemberWaitingList.objects.filter(confirm_mail_key=key) \
|
|
| MemberWaitingList.objects.filter(confirm_mail_parents_key=key)
|
|
if len(matching_unconfirmed) + len(matching_waiter) != 1:
|
|
return render_mail_confirmation_invalid(request)
|
|
person = matching_unconfirmed[0] if len(matching_unconfirmed) == 1 else matching_waiter[0]
|
|
email, parents = person.confirm_mail(key)
|
|
return render_mail_confirmation_success(request, email, person.prename, parents)
|
|
return HttpResponseRedirect(reverse('startpage:index'))
|
|
|
|
|
|
def render_mail_confirmation_invalid(request):
|
|
return render(request, 'members/mail_confirmation_invalid.html')
|
|
|
|
|
|
def render_mail_confirmation_success(request, email, name, parents=False):
|
|
return render(request, 'members/mail_confirmation_success.html',
|
|
{'email': email, 'name': name, 'parents': parents})
|
|
|
|
|
|
def render_register_waiting_list(request, form=None):
|
|
if form is None:
|
|
form = MemberRegistrationWaitingListForm()
|
|
return render(request,
|
|
'members/register_waiting_list.html',
|
|
{'form': form})
|
|
|
|
|
|
def render_register_waiting_list_success(request, membername):
|
|
return render(request,
|
|
'members/register_waiting_list_success.html',
|
|
{'membername': membername})
|
|
|
|
|
|
def register_waiting_list(request):
|
|
if request.method == 'GET':
|
|
# ask to fill in form
|
|
return render_register_waiting_list(request)
|
|
if "save" in request.POST:
|
|
# process registration for waiting list
|
|
form = MemberRegistrationWaitingListForm(request.POST, request.FILES)
|
|
try:
|
|
new_waiter = form.save()
|
|
new_waiter.save()
|
|
new_waiter.request_mail_confirmation()
|
|
return render_register_waiting_list_success(request, new_waiter.prename)
|
|
except ValueError:
|
|
# when input is invalid
|
|
return render_register_waiting_list(request, form)
|
|
# we are not saving yet
|
|
return render_register_waiting_list(request, form=None)
|
|
|
|
|
|
def invited_registration(request):
|
|
if request.method == 'GET' and 'key' in request.GET:
|
|
try:
|
|
key = request.GET['key']
|
|
waiter = MemberWaitingList.objects.get(registration_key=key)
|
|
if not waiter.may_register(key):
|
|
raise KeyError
|
|
if not waiter.invited_for_group:
|
|
raise KeyError
|
|
form = MemberRegistrationForm(instance=waiter)
|
|
return render_register(request, group=waiter.invited_for_group, form=form, waiter_key=key)
|
|
except MemberWaitingList.DoesNotExist:
|
|
return render_invited_registration_failed(request, _("invalid"))
|
|
except KeyError:
|
|
return render_invited_registration_failed(request, _("expired"))
|
|
|
|
# if its a POST request
|
|
return register(request)
|
|
|
|
|
|
def render_invited_registration_failed(request, reason=""):
|
|
context = {}
|
|
if reason:
|
|
context['reason'] = reason
|
|
return render(request, 'members/invited_registration_failed.html', context)
|
|
|
|
|
|
def confirm_waiting(request):
|
|
if request.method == 'GET' and 'key' in request.GET:
|
|
key = request.GET['key']
|
|
try:
|
|
waiter = MemberWaitingList.objects.get(wait_confirmation_key=key)
|
|
except MemberWaitingList.DoesNotExist:
|
|
return render_waiting_confirmation_invalid(request)
|
|
status = waiter.confirm_waiting(key)
|
|
if status == MemberWaitingList.WAITING_CONFIRMATION_SUCCESS:
|
|
return render_waiting_confirmation_success(request,
|
|
waiter.prename,
|
|
already_confirmed=False)
|
|
elif status == MemberWaitingList.WAITING_CONFIRMED:
|
|
return render_waiting_confirmation_success(request,
|
|
waiter.prename,
|
|
already_confirmed=True)
|
|
elif status == MemberWaitingList.WAITING_CONFIRMATION_EXPIRED:
|
|
return render_waiting_confirmation_invalid(request, prename=waiter.prename, expired=True)
|
|
else:
|
|
# invalid
|
|
return render_waiting_confirmation_invalid(request)
|
|
return HttpResponseRedirect(reverse('startpage:index'))
|
|
|
|
|
|
def render_waiting_confirmation_invalid(request, prename=None, expired=False):
|
|
return render(request,
|
|
'members/waiting_confirmation_invalid.html',
|
|
{'expired': expired, 'prename': prename})
|
|
|
|
|
|
def render_waiting_confirmation_success(request, prename, already_confirmed):
|
|
return render(request, 'members/waiting_confirmation_success.html',
|
|
{'prename': prename, 'already_confirmed': already_confirmed})
|