Files
web2.0-backend/members/views/applications.py
T
2022-08-06 16:54:16 +03:00

207 lines
7.0 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.conf import settings
from django.utils.translation import gettext as _
from django.forms.models import model_to_dict
from django.template.loader import render_to_string
import logging
import html
from webapp.utils import send_email
from webapp.utils import add_to_mailinglist
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, "members/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,
"members/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),
)
if application.jas:
add_to_mailinglist(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)
)
subject = _("Jäsenhakemuksesi Sähköinsinöörikiltaan on hyväksytty!")
message = render_to_string(
"members/email_application_accept.html",
{"first_name": application.first_name},
)
send_email(member.email, subject, message, True)
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:
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,
"members/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, "members/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()
try:
application = form.instance
email = form.cleaned_data.get("email", "")
subject = _(
"Jäsenhakemuksesi Sähköinsinöörikiltaan on lähetetty onnistuneesti!"
)
message = render_to_string(
"members/email_application_submit.html",
{
"application": application,
"ayy": _("Kyllä") if application.AYY else _("Ei"),
"jas": _("Kyllä") if application.jas else _("Ei"),
},
)
send_email(email, subject, message)
finally:
return render(request, "members/application_success.html", {})
else:
return error_view(request, form.errors)