Files
web2.0-backend/members/views/applications.py
T
2018-10-29 15:09:23 +02:00

178 lines
6.7 KiB
Python

from django.shortcuts import render
from django.contrib.auth.decorators import permission_required, login_required
from django.views.decorators.http import require_http_methods
from django.views.decorators.csrf import ensure_csrf_cookie
from django.http import HttpResponse, HttpResponseRedirect
from django.core.mail import send_mail
from django.conf import settings
from django.utils.translation import ugettext as _
from django.forms.models import model_to_dict
from django.db import DatabaseError
from smtplib import SMTPAuthenticationError
import logging
import html
from members.views.utils import *
from members.tables import RequestTable
from members.forms import ApplicationForm
from members.views import error_view
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/admin/login')
@permission_required('members.read_application', raise_exception=True)
def application_list(request, *args, **kwargs):
"""List member applications not yet processed."""
applications = Request.objects.all()
application_count = len(applications)
table = RequestTable(applications,
request=request,
exclude=['id'],
attrs={'class': 'table table-bordered table-hover'})
table.paginate(page=request.GET.get('page', 1), per_page=25)
table_html = convert_table_to_html(table, request)
context = {
'table': table_html,
'application_count': application_count,
'notification': request.GET.get('notification', None)
}
return render(request, 'application_list.html', context)
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/admin/login')
@permission_required('members.change_request', raise_exception=True)
def application_edit(request, *args, **kwargs):
"""Edit member request information."""
i = kwargs.pop('index', None)
if i is None:
return error_view(request, _('No application id specified'))
else:
application = Request.objects.get(id=i)
form = ApplicationForm(instance=application)
return render(
request,
'application_edit.html',
{'application_id': i, 'form': form})
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/admin/login')
@permission_required('members.add_member', raise_exception=True)
def application_accept(request, *args, **kwargs):
"""Accept application."""
id = request.POST.get('id', None)
if id is not None:
application = Request.objects.get(id=id)
else:
return error_view(request, _("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 error_view(request, _(
'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 error_view(request, str(ex))
else:
logging.info(form)
return error_view(request, form.errors)
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/admin/login')
@permission_required('members.delete_request', raise_exception=True)
def application_delete(request, *args, **kwargs):
"""Delete member application."""
try:
id = request.POST['id']
except KeyError:
return error_view(request, _('No application id specified'))
try:
application = Request.objects.get(id=id)
notification = "{} {}.".format(_("Successfully deleted application"),
str(application))
application.delete()
logging.info(
"Delete application in member register with the following id: {}"
.format(id))
return HttpResponseRedirect(
'/members/applications?notification={}'
.format(html.escape(notification)))
except DatabaseError:
return error_view(request, _('Could not delete application object'))
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/admin/login')
@permission_required('members.delete_request', raise_exception=True)
def application_delete_confirm(request, *args, **kwargs):
"""Confirm application deletion."""
i = kwargs.pop('index', None)
if i is None:
return error_view(request, _('No application id specified'))
else:
application = Request.objects.get(id=i)
form = ApplicationForm(instance=application)
return render(request,
'application_delete_confirm.html',
{'application_id': i, 'form': form})
@ensure_csrf_cookie
def application_form(request, *args, **kwargs):
"""Render member application form."""
form = ApplicationForm()
return render(request, 'application_index.html', {'form': form})
@ensure_csrf_cookie
@require_http_methods(["POST"])
def application_submit(request, *args, **kwargs):
"""Submit member application"""
form = ApplicationForm(request.POST)
if form.is_valid():
form.save()
if settings.ENABLE_AUTOMATIC_EMAILS:
try:
subject = _('Jäsenhakemuksesi on vastaanotettu')
message = (_('Hei',) + '\r\n\r\n' +
_('Olet onnistuneesti lähettänyt jäsenhakemuksen Aalto-yliopiston Sähköinsinöörikiltaan.') + '\r\n' +
_('Muistathan maksaa jäsenmaksun, jos mielit jäseneksi. Maksuohjeet löydät alta.') + '\r\n\r\n' +
_('Summa: 8 €') + '\r\n' +
_('Tilinumero: FI97 1309 3000 1118 23') + '\r\n' +
_('BIC: NDEAFIHH') + '\r\n' +
_('Viite: 1313') + '\r\n')
send_mail_wrapper(subject, message, form.cleaned_data['email'])
except SMTPAuthenticationError:
logging.error('Failed to send email to accepted request!')
return render(request, 'application_success.html', {})
else:
return error_view(request, form.errors)