Skip to content
Snippets Groups Projects
views.py 5.24 KiB
Newer Older
ynerant's avatar
ynerant committed
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later

ynerant's avatar
ynerant committed
from datetime import datetime

ynerant's avatar
ynerant committed
from django.contrib.auth.mixins import LoginRequiredMixin
ynerant's avatar
ynerant committed
from django.contrib.auth.models import User
from django.db.models import Q
ynerant's avatar
ynerant committed
from django.urls import reverse_lazy
ynerant's avatar
ynerant committed
from django.views.generic import DetailView, UpdateView, CreateView
ynerant's avatar
ynerant committed
from django_tables2 import SingleTableView
ynerant's avatar
ynerant committed
from member.models import Membership, Club
ynerant's avatar
ynerant committed
from member.tables import MembershipTable
ynerant's avatar
ynerant committed
from note.models import Transaction, NoteClub
ynerant's avatar
ynerant committed
from note.tables import HistoryTable
from permission.backends import PermissionBackend
ynerant's avatar
ynerant committed
from permission.views import ProtectQuerysetMixin
from .models import WEIClub, WEIRegistration, WEIMembership
ynerant's avatar
ynerant committed
from .forms import WEIForm, WEIRegistrationForm
from .tables import WEITable, WEIRegistrationTable
ynerant's avatar
ynerant committed


class WEIListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView):
    """
    List existing WEI
    """
    model = WEIClub
    table_class = WEITable
ynerant's avatar
ynerant committed
class WEICreateView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
    """
    Create WEI
    """
    model = WEIClub
    form_class = WEIForm

    def form_valid(self, form):
        form.instance.requires_membership = True
        form.instance.parent_club = Club.objects.get(name="Kfet")
        ret = super().form_valid(form)
        NoteClub.objects.create(club=form.instance)
        return ret

    def get_success_url(self):
        self.object.refresh_from_db()
        return reverse_lazy("wei:wei_detail", kwargs={"pk": self.object.pk})


ynerant's avatar
ynerant committed
class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
    """
    View WEI information
    """
    model = WEIClub
    context_object_name = "club"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        club = context["club"]
        if PermissionBackend.check_perm(self.request.user, "member.change_club_membership_start", club):
            club.update_membership_dates()

        club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note)) \
            .filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view")).order_by('-id')
        history_table = HistoryTable(club_transactions, prefix="history-")
        history_table.paginate(per_page=20, page=self.request.GET.get('history-page', 1))
        context['history_list'] = history_table

        club_member = WEIMembership.objects.filter(
ynerant's avatar
ynerant committed
            club=club,
            date_end__gte=datetime.today(),
        ).filter(PermissionBackend.filter_queryset(self.request.user, WEIMembership, "view"))
ynerant's avatar
ynerant committed
        membership_table = MembershipTable(data=club_member, prefix="membership-")
        membership_table.paginate(per_page=20, page=self.request.GET.get('membership-page', 1))
        context['member_list'] = membership_table

        WEIRegistrationTable.base_columns["delete"].visible = False
        WEIRegistrationTable.base_columns["validate"].visible = False
        all_registrations = WEIRegistration.objects.filter(
            PermissionBackend.filter_queryset(self.request.user, WEIRegistration, "view"))
        all_registrations_table = WEIRegistrationTable(data=all_registrations, prefix="all-registration-")
        all_registrations_table.paginate(per_page=20, page=self.request.GET.get('membership-page', 1))
        context['all_registrations'] = all_registrations_table

        WEIRegistrationTable.base_columns["delete"].visible = True
        WEIRegistrationTable.base_columns["validate"].visible = True
        pre_registrations = all_registrations.filter(membership=None)
        pre_registrations_table = WEIRegistrationTable(data=pre_registrations, prefix="pre-registration-")
        pre_registrations_table.paginate(per_page=20, page=self.request.GET.get('membership-page', 1))
        context['pre_registrations'] = pre_registrations_table

ynerant's avatar
ynerant committed
        # Check if the user has the right to create a membership, to display the button.
        empty_membership = Membership(
            club=club,
            user=User.objects.first(),
            date_start=datetime.now().date(),
            date_end=datetime.now().date(),
            fee=0,
        )
        context["can_add_members"] = PermissionBackend() \
            .has_perm(self.request.user, "member.add_membership", empty_membership)

        return context
ynerant's avatar
ynerant committed


class WEIUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
    """
    Update the information of the WEI.
    """
    model = WEIClub
    context_object_name = "club"
    form_class = WEIForm

    def get_success_url(self):
        return reverse_lazy("wei:wei_detail", kwargs={"pk": self.object.pk})
ynerant's avatar
ynerant committed


class WEIRegisterView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
    """
    Register to the WEI
    """
    model = WEIRegistration
    form_class = WEIRegistrationForm

    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.fields["user"].initial = self.request.user
        return form

    def form_valid(self, form):
        form.instance.wei = WEIClub.objects.get(pk=self.kwargs["wei_pk"])
        return super().form_valid(form)
ynerant's avatar
ynerant committed

    def get_success_url(self):
        self.object.refresh_from_db()
        return reverse_lazy("wei:wei_detail", kwargs={"pk": self.object.wei.pk})