Source code for registrations.views
"""Views provided by the registrations package"""
from django.conf import settings
from django.contrib import messages
from django.contrib.admin.utils import model_ngettext
from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.http import Http404
from django.shortcuts import redirect, get_object_or_404
from django.template.defaultfilters import floatformat
from django.urls import reverse
from django.utils import timezone
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _
from django.views import View
from django.views.generic import FormView, CreateView
from django.views.generic.base import TemplateResponseMixin, TemplateView
from members.decorators import membership_required
from members.models import Membership
from . import emails, forms, services
from .models import Entry, Registration, Renewal, Reference
[docs]class BecomeAMemberView(TemplateView):
"""View that render a HTML template with context data"""
template_name = "registrations/become_a_member.html"
[docs] def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["year_fees"] = floatformat(
settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_YEAR], 2
)
context["study_fees"] = floatformat(
settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_STUDY], 2
)
return context
[docs]@method_decorator(staff_member_required, name="dispatch")
@method_decorator(
permission_required("registrations.review_entries"), name="dispatch",
)
class EntryAdminView(View):
"""
View that handles the processing of entries
"""
[docs] def post(self, request, *args, **kwargs):
action = request.POST.get("action")
entry_qs = Entry.objects.filter(pk=kwargs["pk"])
try:
entry = entry_qs.get()
except Entry.DoesNotExist:
return redirect("admin:index")
if action == "accept":
if not services.check_unique_user(entry):
messages.error(
request,
_("Could not accept %s. Username is not unique.")
% model_ngettext(entry, 1),
)
elif services.accept_entries(request.user.pk, entry_qs) > 0:
messages.success(
request, _("Successfully accepted %s.") % model_ngettext(entry, 1)
)
else:
messages.error(
request, _("Could not accept %s.") % model_ngettext(entry, 1)
)
elif action == "reject":
if services.reject_entries(request.user.pk, entry_qs) > 0:
messages.success(
request, _("Successfully rejected %s.") % model_ngettext(entry, 1)
)
else:
messages.error(
request, _("Could not reject %s.") % model_ngettext(entry, 1)
)
elif action == "resend":
try:
emails.send_registration_email_confirmation(entry.registration)
except Registration.DoesNotExist:
pass
elif action == "revert":
services.revert_entry(request.user.pk, entry)
if entry_qs.filter(renewal=None).exists():
content_type = ContentType.objects.get_for_model(Registration)
else:
content_type = ContentType.objects.get_for_model(Renewal)
return redirect(
f"admin:{content_type.app_label}_{content_type.model}_change", kwargs["pk"],
)
[docs]class ConfirmEmailView(View, TemplateResponseMixin):
"""
View that renders an HTML template and confirms the email address
of the provided registration
"""
template_name = "registrations/confirm_email.html"
[docs] def get(self, request, *args, **kwargs):
queryset = Registration.objects.filter(pk=kwargs["pk"])
processed = 0
try:
processed = services.confirm_entry(queryset)
except ValidationError:
pass
if processed == 0:
return redirect("registrations:register-member")
registration = queryset.get()
if (
registration.membership_type == Membership.BENEFACTOR
and not registration.no_references
):
emails.send_references_information_message(registration)
emails.send_new_registration_board_message(registration)
return self.render_to_response({})
[docs]class BaseRegistrationFormView(FormView):
"""
View that renders a membership registration form
"""
form_class = forms.MemberRegistrationForm
template_name = "registrations/register_member.html"
[docs] def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["google_api_key"] = settings.GOOGLE_PLACES_API_KEY
context["year_fees"] = floatformat(
settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_YEAR], 2
)
context["study_fees"] = floatformat(
settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_STUDY], 2
)
return context
[docs] def get(self, request, *args, **kwargs):
if request.user.is_authenticated:
return redirect("registrations:renew")
return super().get(request, args, kwargs)
[docs] def form_valid(self, form):
form.save()
emails.send_registration_email_confirmation(form.instance)
return redirect("registrations:register-success")
[docs]class MemberRegistrationFormView(BaseRegistrationFormView):
"""
View that renders the `member` membership registration form
"""
form_class = forms.MemberRegistrationForm
template_name = "registrations/register_member.html"
[docs] def post(self, request, *args, **kwargs):
request.POST = request.POST.dict()
request.POST["language"] = request.LANGUAGE_CODE
request.POST["membership_type"] = Membership.MEMBER
return super().post(request, *args, **kwargs)
[docs]class BenefactorRegistrationFormView(BaseRegistrationFormView):
"""
View that renders the `benefactor` membership registration form
"""
form_class = forms.BenefactorRegistrationForm
template_name = "registrations/register_benefactor.html"
[docs] def post(self, request, *args, **kwargs):
request.POST = request.POST.dict()
request.POST["language"] = request.LANGUAGE_CODE
request.POST["membership_type"] = Membership.BENEFACTOR
request.POST["length"] = Entry.MEMBERSHIP_YEAR
request.POST["remarks"] = (
"Registered as iCIS employee" if "icis_employee" in request.POST else ""
)
request.POST["no_references"] = "icis_employee" in request.POST
return super().post(request, *args, **kwargs)
[docs]@method_decorator(login_required, name="dispatch")
class RenewalFormView(FormView):
"""
View that renders the membership renewal form
"""
form_class = forms.RenewalForm
template_name = "registrations/renewal.html"
[docs] def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["year_fees"] = floatformat(
settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_YEAR], 2
)
context["study_fees"] = floatformat(
settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_STUDY], 2
)
context["latest_membership"] = self.request.member.latest_membership
context["was_member"] = Membership.objects.filter(
user=self.request.member, type=Membership.MEMBER
).exists()
context["benefactor_type"] = Membership.BENEFACTOR
return context
[docs] def get_form(self, form_class=None):
form = super().get_form(form_class)
member = self.request.member
if member is not None and member.latest_membership is not None:
latest_membership = member.latest_membership
# If latest membership has not ended or does not ends
# within 1 month: do not show 'year' length
hide_year_choice = not (
latest_membership is not None
and latest_membership.until is not None
and (latest_membership.until - timezone.now().date()).days <= 31
)
if hide_year_choice:
form.fields["length"].choices = [
c
for c in form.fields["length"].choices
if c[0] != Entry.MEMBERSHIP_YEAR
]
return form
[docs] def post(self, request, *args, **kwargs):
request.POST = request.POST.dict()
if request.member.latest_membership.type == Membership.BENEFACTOR:
request.POST["membership_type"] = Membership.BENEFACTOR
request.POST["length"] = Entry.MEMBERSHIP_YEAR
request.POST["member"] = request.member.pk
request.POST["remarks"] = ""
request.POST["no_references"] = True
if request.POST["membership_type"] == Membership.BENEFACTOR:
request.POST["no_references"] = False
if Membership.objects.filter(
user=request.member, type=Membership.MEMBER
).exists():
request.POST["remarks"] = "Was a Thalia member in the past."
request.POST["no_references"] = True
if "icis_employee" in request.POST:
request.POST["remarks"] = "Registered as iCIS employee."
request.POST["no_references"] = True
return super().post(request, *args, **kwargs)
[docs] def form_valid(self, form):
renewal = form.save()
if not renewal.no_references:
emails.send_references_information_message(renewal)
emails.send_new_renewal_board_message(renewal)
return redirect("registrations:renew-success")
[docs]@method_decorator(login_required, name="dispatch")
@method_decorator(membership_required, name="dispatch")
class ReferenceCreateView(CreateView):
"""
View that renders a reference creation form
"""
model = Reference
form_class = forms.ReferenceForm
template_name = "registrations/reference.html"
entry = None
success = False
[docs] def get_success_url(self):
return reverse("registrations:reference-success", args=(self.entry.pk,))
[docs] def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["success"] = self.success
try:
context["name"] = self.entry.registration.get_full_name()
except Registration.DoesNotExist:
context["name"] = self.entry.renewal.member.get_full_name()
return context
[docs] def dispatch(self, request, *args, **kwargs):
self.entry = get_object_or_404(Entry, pk=kwargs.get("pk"))
if (
self.entry.no_references
or self.entry.membership_type != Membership.BENEFACTOR
):
raise Http404
return super().dispatch(request, *args, **kwargs)
[docs] def post(self, request, *args, **kwargs):
request.POST = request.POST.dict()
request.POST["member"] = request.member.pk
request.POST["entry"] = kwargs["pk"]
return super().post(request, *args, **kwargs)