mirror of
https://gitlab.crans.org/bde/nk20
synced 2025-06-20 17:41:55 +02:00
Renew memberships
This commit is contained in:
@ -187,11 +187,13 @@ class Membership(models.Model):
|
||||
user = models.ForeignKey(
|
||||
User,
|
||||
on_delete=models.PROTECT,
|
||||
verbose_name=_("user"),
|
||||
)
|
||||
|
||||
club = models.ForeignKey(
|
||||
Club,
|
||||
on_delete=models.PROTECT,
|
||||
verbose_name=_("club"),
|
||||
)
|
||||
|
||||
roles = models.ManyToManyField(
|
||||
@ -237,6 +239,7 @@ class Membership(models.Model):
|
||||
self.fee = self.club.membership_fee_paid
|
||||
else:
|
||||
self.fee = self.club.membership_fee_unpaid
|
||||
|
||||
if self.club.membership_duration is not None:
|
||||
self.date_end = self.date_start + datetime.timedelta(days=self.club.membership_duration)
|
||||
else:
|
||||
|
@ -1,8 +1,10 @@
|
||||
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
from datetime import datetime
|
||||
|
||||
import django_tables2 as tables
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.urls import reverse_lazy
|
||||
from django.utils.html import format_html
|
||||
from note.templatetags.pretty_money import pretty_money
|
||||
@ -49,8 +51,39 @@ class MembershipTable(tables.Table):
|
||||
}
|
||||
)
|
||||
|
||||
def render_fee(self, value):
|
||||
return pretty_money(value)
|
||||
def render_club(self, value):
|
||||
s = value.name
|
||||
if PermissionBackend().has_perm(get_current_authenticated_user(), "member.view_club", value):
|
||||
s = format_html("<a href={url}>{name}</a>",
|
||||
url=reverse_lazy('member:club_detail', kwargs={"pk": value.pk}), name=s)
|
||||
|
||||
return s
|
||||
|
||||
def render_fee(self, value, record):
|
||||
t = pretty_money(value)
|
||||
|
||||
# If it is required and if the user has the right, the renew button is displayed.
|
||||
if record.club.membership_start is not None:
|
||||
if record.date_start < record.club.membership_start: # If the renew is available
|
||||
if not Membership.objects.filter(
|
||||
club=record.club,
|
||||
user=record.user,
|
||||
date_start__gte=record.club.membership_start,
|
||||
date_end__lte=record.club.membership_end,
|
||||
).exists(): # If the renew is not yet performed
|
||||
empty_membership = Membership(
|
||||
club=record.club,
|
||||
user=record.user,
|
||||
date_start=datetime.now().date(),
|
||||
date_end=datetime.now().date(),
|
||||
fee=0,
|
||||
)
|
||||
if PermissionBackend().has_perm(get_current_authenticated_user(),
|
||||
"member:add_membership", empty_membership): # If the user has right
|
||||
t = format_html(t + ' <a class="btn btn-warning" href="{url}">{text}</a>',
|
||||
url=reverse_lazy('member:club_renew_membership',
|
||||
kwargs={"pk": record.pk}), text=_("Renew"))
|
||||
return t
|
||||
|
||||
def render_roles(self, record):
|
||||
roles = record.roles.all()
|
||||
|
@ -10,10 +10,11 @@ urlpatterns = [
|
||||
path('signup/', views.UserCreateView.as_view(), name="signup"),
|
||||
|
||||
path('club/', views.ClubListView.as_view(), name="club_list"),
|
||||
path('club/create/', views.ClubCreateView.as_view(), name="club_create"),
|
||||
path('club/<int:pk>/', views.ClubDetailView.as_view(), name="club_detail"),
|
||||
path('club/<int:pk>/add_member/', views.ClubAddMemberView.as_view(), name="club_add_member"),
|
||||
path('club/manage_roles/<int:pk>/', views.ClubManageRolesView.as_view(), name="club_manage_roles"),
|
||||
path('club/create/', views.ClubCreateView.as_view(), name="club_create"),
|
||||
path('club/renew_membership/<int:pk>/', views.ClubRenewMembershipView.as_view(), name="club_renew_membership"),
|
||||
path('club/<int:pk>/update/', views.ClubUpdateView.as_view(), name="club_update"),
|
||||
path('club/<int:pk>/update_pic/', views.ClubPictureUpdateView.as_view(), name="club_update_pic"),
|
||||
path('club/<int:pk>/aliases/', views.ClubAliasView.as_view(), name="club_alias"),
|
||||
|
@ -2,19 +2,21 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import io
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from PIL import Image
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.auth.views import LoginView
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db.models import Q
|
||||
from django.forms import HiddenInput
|
||||
from django.shortcuts import redirect
|
||||
from django.urls import reverse_lazy
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.views.generic import CreateView, DetailView, UpdateView, TemplateView
|
||||
from django.views.generic.base import View
|
||||
from django.views.generic.edit import FormMixin
|
||||
from django_tables2.views import SingleTableView
|
||||
from rest_framework.authtoken.models import Token
|
||||
@ -137,8 +139,8 @@ class UserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
|
||||
Transaction.objects.all().filter(Q(source=user.note) | Q(destination=user.note)).order_by("-id")\
|
||||
.filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view"))
|
||||
context['history_list'] = HistoryTable(history_list)
|
||||
club_list = Membership.objects.all().filter(user=user)\
|
||||
.filter(PermissionBackend.filter_queryset(self.request.user, Membership, "view")).only("club")
|
||||
club_list = Membership.objects.filter(user=user, date_end__gte=datetime.today())\
|
||||
.filter(PermissionBackend.filter_queryset(self.request.user, Membership, "view"))
|
||||
context['club_list'] = MembershipTable(data=club_list)
|
||||
return context
|
||||
|
||||
@ -292,9 +294,8 @@ class ClubDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
|
||||
context['history_list'] = HistoryTable(club_transactions)
|
||||
club_member = Membership.objects.filter(
|
||||
club=club,
|
||||
date_start__lte=datetime.now().date(),
|
||||
date_end__gte=datetime.now().date(),
|
||||
).filter(PermissionBackend.filter_queryset(self.request.user, Membership, "view")).all()
|
||||
date_end__gte=datetime.today(),
|
||||
).filter(PermissionBackend.filter_queryset(self.request.user, Membership, "view"))
|
||||
|
||||
context['member_list'] = MembershipTable(data=club_member)
|
||||
|
||||
@ -366,7 +367,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
|
||||
else:
|
||||
fee = club.membership_fee_unpaid
|
||||
if user.note.balance < fee and not Membership.objects.filter(
|
||||
club=2,
|
||||
club__name="Kfet",
|
||||
user=user,
|
||||
date_start__lte=datetime.now().date(),
|
||||
date_end__gte=datetime.now().date(),
|
||||
@ -437,3 +438,28 @@ class ClubManageRolesView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse_lazy('member:club_detail', kwargs={'pk': self.object.club.id})
|
||||
|
||||
|
||||
class ClubRenewMembershipView(ProtectQuerysetMixin, LoginRequiredMixin, View):
|
||||
def get(self, *args, **kwargs):
|
||||
user = self.request.user
|
||||
membership = Membership.objects.filter(PermissionBackend.filter_queryset(user, Membership, "change"))\
|
||||
.filter(pk=self.kwargs["pk"]).get()
|
||||
|
||||
if Membership.objects.filter(
|
||||
club=membership.club,
|
||||
user=membership.user,
|
||||
date_start__gte=membership.club.membership_start,
|
||||
date_end__lte=membership.club.membership_end,
|
||||
).exists():
|
||||
raise ValidationError(_("This membership is already renewed"))
|
||||
|
||||
new_membership = Membership.objects.create(
|
||||
user=user,
|
||||
club=membership.club,
|
||||
date_start=membership.date_end + timedelta(days=1),
|
||||
)
|
||||
new_membership.roles.set(membership.roles.all())
|
||||
new_membership.save()
|
||||
|
||||
return redirect(reverse_lazy('member:club_detail', kwargs={'pk': membership.club.pk}))
|
||||
|
Reference in New Issue
Block a user