Merge branch 'develop' into 'master'

Fix multiple form and table issues

See merge request vtmk/web2.0!87
This commit is contained in:
Jan Tuomi
2017-10-29 12:25:12 +02:00
19 changed files with 852 additions and 732 deletions
+1
View File
@@ -16,3 +16,4 @@ db.sqlite3
requirements_henu.txt
/collected_static/
mydatabase
settings.json
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
+6 -8
View File
@@ -30,14 +30,6 @@ class MemberForm(forms.ModelForm):
self.members = members
self.payments = payments
def clean_email(self):
email = self.cleaned_data['email']
if Member.objects.filter(email=email).exists():
raise forms.ValidationError('Member with email "{}" already exists.'.format(email), code='exists')
return email
def _clean_boolean_field(self, key):
value = self.data.get(key, None)
if value in ['1', '0']:
@@ -124,3 +116,9 @@ class ApplicationForm(forms.ModelForm):
model = Request
fields = ['first_name', 'last_name', 'email', 'AYY', 'jas', 'POR']
def __init__(self, *args, **kwargs):
super(ApplicationForm, self).__init__(*args, **kwargs)
self.fields['AYY'].label = _("I'm a member of AYY")
self.fields['jas'].label = _("I want to receive a weekly newsletter")
+2
View File
@@ -100,6 +100,8 @@ class Member(BaseMember):
('check_by_email', 'Can check if user exists by email'),
('read_member', 'Can see member in list'),
)
verbose_name = _('Member')
verbose_name_plural = _('Members')
def last_paid(self):
"""Return member's last payment."""
+3 -3
View File
@@ -17,7 +17,7 @@ class MemberTable(tables.Table):
'href="/members/edit/{{ record.id }}">') +
_('Edit') +
'</a>',
verbose_name=_('Options')
verbose_name=""
)
class Meta:
@@ -36,7 +36,7 @@ class PaymentTable(tables.Table):
'href="/members/edit_payment/{{ record.id }}">') +
_('Edit') +
'</a>',
verbose_name=_('Options')
verbose_name=""
)
class Meta:
@@ -53,7 +53,7 @@ class RequestTable(tables.Table):
'href="/members/edit_application/{{ record.id }}">') +
_('Edit') +
'</a>',
verbose_name=_('Options')
verbose_name=""
)
class Meta:
@@ -0,0 +1,24 @@
{% extends "members_base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block content %}
<div>
<div>
<h3>{% trans "Are you sure you want to delete this application?" %}</h3>
</div>
<div>
<table class="table readonly" >
{{ form }}
</table>
<form name="applicationForm" action="/members/delete_application" method="post" class="form">{% csrf_token %}
<input type="hidden" name="id" value="{{ application_id }}">
<button type="submit" class="btn btn-danger">
{% trans "Yes, I'm sure" %}
</button>
</form>
</div>
</div>
{% endblock content %}
+1 -1
View File
@@ -11,7 +11,7 @@
<div id="input_form">
<form name="applicationForm" action="/members/accept_application" method="post" class="form">{% csrf_token %}
<input type="hidden" name="id" value="{{ application_id }}">
<input type="hidden" name="id" value="{{ application_id }}">
{% bootstrap_form form %}
{% buttons %}
<button type="submit" class="btn btn-primary">
+13 -59
View File
@@ -1,67 +1,21 @@
{% extends "application_form_base.html" %}
{% load static %}
{% load bootstrap3 %}
{% load i18n %}
{% block content %}
<link rel="stylesheet" href="{% static "css/application.css" %}">
<div id="input_form" ng-controller="applicationController">
<form name="applicationForm">
<div class="col-xs-12">
<h3>Killan jäseneksi liittyminen on helppoa ja hauskaa!</h3>
<h3>Täytä vain alla oleva lomake</h3>
<h4>Muista myös maksaa jäsenmaksusi!</h4>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label for="firstNameField">Etunimi: </label>
<input id="firstNameField" required type="text" placeholder="Sähkö" class="form-control" ng-model="member.first_name"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label for="lastNameField">Sukunimi: </label>
<input id="lastNameField" required type="text" placeholder="Insinööri" class="form-control" ng-model="member.last_name"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label for="emailField">Sähköposti: </label>
<input id="emailField" required type="text" placeholder="sahko.insinoori@aalto.fi" class="form-control" ng-model="member.email"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label>Olen AYY:n jäsen: </label>
<input type="checkbox" autocomplete="off" id="AYY" value="0" ng-model="member.AYY">
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label>Haluan saada viikottaisia jäsenmaileja: </label>
<input type="checkbox" class="custom-control-input" autocomplete="off" id="JAS" value="0" ng-model="member.jas">
</label>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label>Asuinkunta: </label>
<input id="PORField" required type="text" placeholder="Otaniemi" class="form-control" ng-model="member.POR"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div
id="captcha"
vc-recaptcha
theme="'light'"
key="'6LevHAcUAAAAAA45B7c-7qja-2aSwHztr9xb4K2Z'"
on-create="setWidgetId(widgetId)"
on-success="setResponse(response)"
on-expire="cbExpiration()"
></div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<button ng-click="applicationForm.$valid && send()" type="submit" class="btn btn-success" id="sendmember">Liity</button>
</div>
<h3>{% trans "Killan jäseneksi liittyminen on helppoa ja hauskaa!" %}</h3>
<h3>{% trans "Täytä vain alla oleva lomake" %}</h3>
<h4>{% trans "Muista myös maksaa jäsenmaksusi!" %}</h4>
<div class="form">
<form method="POST" action="/members/submit_application">{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button type="submit" class="btn btn-primary">
{% trans "Send" %}
</button>
{% endbuttons %}
</form>
</div>
{% endblock content %}
+6 -2
View File
@@ -1,6 +1,10 @@
{% extends "application_form_base.html" %}
{% load static %}
{% load bootstrap3 %}
{% load i18n %}
{% block content %}
<h1>Hienoa! Jäsenhakemuksesi on nyt lähetetty.</h1>
<a href="https://sahkoinsinoorikilta.fi">Takaisin Sähköinsinöörikillan web-sivuille</a>
<link rel="stylesheet" href="{% static "css/application.css" %}">
<h3>{% trans "Hienoa! Jäsenhakemuksesi on nyt lähetetty." %}</h3>
<a href="/"><h4>{% trans "Takaisin Sähköinsinöörikillan web-sivuille" %}</h4></a>
{% endblock content %}
+2 -4
View File
@@ -32,7 +32,7 @@ from rest_framework.authtoken import views
from members.views import application_form
from members.views import application_list
from members.views import application_edit
from members.views import application_form_success
from members.views import application_submit
# email validation
# from members.views import validateEmail, validate_success, validate_fail
@@ -76,15 +76,13 @@ urlpatterns = [
url(r'^submit_payment$', payment_submit),
url(r'^update_payment$', payment_update),
url(r'^delete_payment$', payment_delete),
url(r'^submit_application$', application_submit),
url(r'^accept_application$', application_accept),
url(r'^delete_application$', application_delete),
# the actual member application form
url(r'^application/$', application_form),
# success page for the application
url(r'^application/success$', application_form_success),
# delete confirmation view for applications
url(r'^delete_application_confirm/(?P<index>\d+)$',
application_delete_confirm),
+51 -21
View File
@@ -64,27 +64,46 @@ def application_edit(request, *args, **kwargs):
@permission_required('members.add_member', raise_exception=True)
def application_accept(request, *args, **kwargs):
"""Accept application."""
form = ApplicationForm(request.POST)
if form.is_valid():
id = request.POST['id']
id = request.POST.get('id', None)
if id is not None:
application = Request.objects.get(id=id)
member = application.to_member()
member.save()
application.delete()
logging.info(
"Accepted application in member "
"register with the following info: {}"
.format(form))
notification = "{} {}.".format(_("Successfully accepted application"),
str(application))
return HttpResponseRedirect(
'/members/list?notification={}'.format(html.escape(notification)))
else:
return render(request,
'error.html',
{'error': _('Could not accept application object')})
{'error': _("Application missing 'id' field.")})
form = ApplicationForm(request.POST, instance=application)
if form.is_valid():
try:
application = form.save()
if Member.objects.filter(email=application.email).exists():
return render(request,
'error.html',
{'error': _('Email {} is already in use by a member. Application cannot be accepted.').format(application.email)})
member = application.to_member()
member.save()
application.delete()
logging.info(
"Accepted application in member "
"register with the following info: {}"
.format(form))
notification = "{} {}.".format(_("Successfully accepted application"),
str(application))
return HttpResponseRedirect(
'/members/list?notification={}'.format(html.escape(notification)))
except Exception as ex:
logging.exception('Exception while accepting application')
return render(request,
'error.html',
{'error': str(ex)})
else:
logging.info(form)
return render(request,
'error.html',
{'error': form.errors})
@ensure_csrf_cookie
@@ -138,10 +157,21 @@ def application_delete_confirm(request, *args, **kwargs):
@ensure_csrf_cookie
def application_form(request, *args, **kwargs):
"""Render member application form."""
return render(request, 'application_index.html', {})
form = ApplicationForm()
return render(request, 'application_index.html', {'form': form})
@ensure_csrf_cookie
def application_form_success(request, *args, **kwargs):
"""Render application Successfully sent page."""
return render(request, 'application_success.html', {})
@require_http_methods(["POST"])
@login_required(login_url='/login')
@permission_required('members.delete_request', raise_exception=True)
def application_submit(request, *args, **kwargs):
"""Submit member application"""
form = ApplicationForm(request.POST)
if form.is_valid():
form.save()
return render(request, 'application_success.html', {})
else:
return render(request,
'error.html',
{'error': form.errors})
+12 -5
View File
@@ -138,11 +138,18 @@ def member_submit(request, *args, **kwargs):
@permission_required('members.change_member', raise_exception=True)
def member_update(request, *args, **kwargs):
"""Update member information."""
form = MemberForm(request.POST)
if form.is_valid():
id = request.POST['id']
id = request.POST.get('id', None)
logging.debug(id)
if id is not None:
member = Member.objects.get(id=id)
form = MemberForm(request.POST, instance=member)
else:
return render(request,
'error.html',
{'error': _("Member missing 'id' field.")})
logging.debug(member)
form = MemberForm(request.POST, instance=member)
if form.is_valid():
form.save()
logging.info(
@@ -156,7 +163,7 @@ def member_update(request, *args, **kwargs):
return render(
request,
'error.html',
{'error': _('Could not update member object')})
{'error': form.errors})
@ensure_csrf_cookie
-10
View File
@@ -1,10 +0,0 @@
{% extends "base.html" %}
{% block navigation %}
{% endblock navigation %}
{% block content %}
<div class="alert alert-danger" role="alert">
{{ errors|safe }}
</div>
{% endblock content %}
+18
View File
@@ -0,0 +1,18 @@
{% extends "base.html" %}
{% load static %}
{% load i18n %}
{% block content %}
<div>
<div>
<h3>{% trans "Error" %}</h3>
</div>
<div class="alert alert-danger">
{{ error|safe }}
</div>
<div>
<button onclick="window.history.back();" class="btn btn-primary">{% trans "Back" %}</button>
</div>
</div>
{% endblock content %}
+4 -4
View File
@@ -184,9 +184,9 @@ def kaehmy_submit(request, *args, **kwargs):
else:
context = {
'errors': form.errors
'error': form.errors
}
return render(request, 'error.html', context)
return render(request, 'kaehmy_error.html', context)
return HttpResponseRedirect('/kaehmy')
@@ -283,9 +283,9 @@ def kaehmy_comment(request, *args, **kwargs):
else:
print(form)
context = {
'errors': form.errors
'error': form.errors
}
return render(request, 'error.html', context)
return render(request, 'kaehmy_error.html', context)
@require_http_methods(["GET"])