Membership fees for paid and unpaid students, closes #43

This commit is contained in:
Yohann D'ANELLO 2020-04-01 04:07:55 +02:00
parent d5b010980b
commit 0df0f3f66b
12 changed files with 301 additions and 150 deletions

View File

@ -6,7 +6,8 @@
"name": "BDE",
"email": "tresorerie.bde@example.com",
"require_memberships": true,
"membership_fee": 500,
"membership_fee_paid": 500,
"membership_fee_unpaid": 500,
"membership_duration": 396,
"membership_start": "2019-08-31",
"membership_end": "2020-09-30"
@ -20,7 +21,8 @@
"email": "tresorerie.bde@example.com",
"parent_club": 1,
"require_memberships": true,
"membership_fee": 3500,
"membership_fee_paid": 3500,
"membership_fee_unpaid": 3500,
"membership_duration": 396,
"membership_start": "2019-08-31",
"membership_end": "2020-09-30"

View File

@ -4,7 +4,6 @@
from django import forms
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
from note_kfet.inputs import Autocomplete, AmountInput, DatePickerInput
from permission.models import PermissionMask
@ -46,7 +45,8 @@ class ClubForm(forms.ModelForm):
model = Club
fields = '__all__'
widgets = {
"membership_fee": AmountInput(),
"membership_fee_paid": AmountInput(),
"membership_fee_unpaid": AmountInput(),
"parent_club": Autocomplete(
Club,
attrs={

View File

@ -9,7 +9,6 @@ from django.core.exceptions import ValidationError, PermissionDenied
from django.db import models
from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext_lazy as _
from note.models import MembershipTransaction
@ -89,9 +88,14 @@ class Club(models.Model):
help_text=_("Uncheck if this club don't require memberships."),
)
membership_fee = models.PositiveIntegerField(
membership_fee_paid = models.PositiveIntegerField(
default=0,
verbose_name=_('membership fee'),
verbose_name=_('membership fee (paid students)'),
)
membership_fee_unpaid = models.PositiveIntegerField(
default=0,
verbose_name=_('membership fee (unpaid students)'),
)
membership_duration = models.PositiveIntegerField(
@ -136,7 +140,8 @@ class Club(models.Model):
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
if not self.require_memberships:
self.membership_fee = 0
self.membership_fee_paid = 0
self.membership_fee_unpaid = 0
self.membership_duration = None
self.membership_start = None
self.membership_end = None
@ -225,7 +230,10 @@ class Membership(models.Model):
).exists():
raise ValidationError(_('User is already a member of the club'))
self.fee = self.club.membership_fee
if self.user.profile.paid:
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:
@ -235,18 +243,23 @@ class Membership(models.Model):
super().save(*args, **kwargs)
if created and self.fee:
try:
MembershipTransaction.objects.create(
membership=self,
source=self.user.note,
destination=self.club.note,
quantity=1,
amount=self.fee,
reason="Adhésion",
)
except PermissionDenied:
self.delete()
self.make_transaction()
def make_transaction(self):
if self.transaction is not None or not self.fee:
return
if self.fee:
transaction = MembershipTransaction(
membership=self,
source=self.user.note,
destination=self.club.note,
quantity=1,
amount=self.fee,
reason="Adhésion",
)
transaction._force_save = True
transaction.save(force_insert=True)
class Meta:
verbose_name = _('membership')

View File

@ -5,11 +5,10 @@ import django_tables2 as tables
from django.contrib.auth.models import User
from django.urls import reverse_lazy
from django.utils.html import format_html
from django_tables2 import A
from note.templatetags.pretty_money import pretty_money
from note_kfet.middlewares import get_current_authenticated_user
from permission.backends import PermissionBackend
from .models import Club, Membership

View File

@ -380,7 +380,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
return super().form_invalid(form)
if form.instance.date_start > form.instance.club.membership_end:
form.add_error('user', _("The membership must end before {:%m-%d-%Y}.")
form.add_error('user', _("The membership must begin before {:%m-%d-%Y}.")
.format(form.instance.club.membership_start))
return super().form_invalid(form)
@ -412,7 +412,7 @@ class ClubManageRolesView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
return super().form_invalid(form)
if form.instance.date_start > form.instance.club.membership_end:
form.add_error('user', _("The membership must end before {:%m-%d-%Y}.")
form.add_error('user', _("The membership must begin before {:%m-%d-%Y}.")
.format(form.instance.club.membership_start))
return super().form_invalid(form)

View File

@ -798,6 +798,51 @@
"description": "Update club"
}
},
{
"model": "permission.permission",
"pk": 48,
"fields": {
"model": [
"member",
"membership"
],
"query": "{\"user\": [\"user\"]}",
"type": "view",
"mask": 1,
"field": "",
"description": "View our memberships"
}
},
{
"model": "permission.permission",
"pk": 49,
"fields": {
"model": [
"member",
"membership"
],
"query": "{\"club\": [\"club\"]}",
"type": "view",
"mask": 1,
"field": "",
"description": "View club's memberships"
}
},
{
"model": "permission.permission",
"pk": 50,
"fields": {
"model": [
"member",
"membership"
],
"query": "{\"club\": [\"club\"]}",
"type": "add",
"mask": 2,
"field": "",
"description": "Add a membership to a club"
}
},
{
"model": "permission.rolepermissions",
"pk": 1,
@ -810,7 +855,8 @@
8,
9,
10,
11
11,
48
]
}
},
@ -906,5 +952,64 @@
47
]
}
},
{
"model": "permission.rolepermissions",
"pk": 7,
"fields": {
"role": 5,
"permissions": [
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50
]
}
}
]

View File

@ -49,6 +49,8 @@ class InstancedPermission:
# Force insertion, no data verification, no trigger
obj._force_save = True
Model.save(obj, force_insert=True)
# We don't want log anything
obj._no_log = True
ret = self.model.model_class().objects.filter(self.query & Q(pk=obj.pk)).exists()
# Delete testing object
obj._force_delete = True

View File

@ -2,8 +2,6 @@
# SPDX-License-Identifier: GPL-3.0-or-later
from django.core.exceptions import PermissionDenied
from django.db.models.signals import pre_save, pre_delete, post_save, post_delete
from logs import signals as logs_signals
from note_kfet.middlewares import get_current_authenticated_user
from permission.backends import PermissionBackend
@ -29,7 +27,7 @@ def pre_save_object(sender, instance, **kwargs):
if instance._meta.label_lower in EXCLUDED:
return
if hasattr(instance, "_force_save"):
if hasattr(instance, "_no_log"):
return
user = get_current_authenticated_user()
@ -76,7 +74,7 @@ def pre_delete_object(instance, **kwargs):
if instance._meta.label_lower in EXCLUDED:
return
if hasattr(instance, "_force_delete"):
if hasattr(instance, "_no_log"):
return
user = get_current_authenticated_user()

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-03-31 23:49+0200\n"
"POT-Creation-Date: 2020-04-01 04:00+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -44,9 +44,9 @@ msgid "You can't invite more than 3 people to this activity."
msgstr ""
#: apps/activity/models.py:23 apps/activity/models.py:48
#: apps/member/models.py:64 apps/member/models.py:158
#: apps/member/models.py:66 apps/member/models.py:166
#: apps/note/models/notes.py:188 apps/note/models/transactions.py:24
#: apps/note/models/transactions.py:44 apps/note/models/transactions.py:231
#: apps/note/models/transactions.py:44 apps/note/models/transactions.py:232
#: templates/member/club_info.html:13 templates/member/profile_info.html:14
msgid "name"
msgstr ""
@ -68,7 +68,7 @@ msgid "activity types"
msgstr ""
#: apps/activity/models.py:53 apps/note/models/transactions.py:69
#: apps/permission/models.py:99 templates/activity/activity_detail.html:16
#: apps/permission/models.py:103 templates/activity/activity_detail.html:16
msgid "description"
msgstr ""
@ -251,129 +251,145 @@ msgstr ""
msgid "member"
msgstr ""
#: apps/member/models.py:26
#: apps/member/models.py:28
msgid "phone number"
msgstr ""
#: apps/member/models.py:32 templates/member/profile_info.html:27
#: apps/member/models.py:34 templates/member/profile_info.html:27
msgid "section"
msgstr ""
#: apps/member/models.py:33
#: apps/member/models.py:35
msgid "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\""
msgstr ""
#: apps/member/models.py:39 templates/member/profile_info.html:30
#: apps/member/models.py:41 templates/member/profile_info.html:30
msgid "address"
msgstr ""
#: apps/member/models.py:45
#: apps/member/models.py:47
msgid "paid"
msgstr ""
#: apps/member/models.py:50 apps/member/models.py:51
#: apps/member/models.py:52 apps/member/models.py:53
msgid "user profile"
msgstr ""
#: apps/member/models.py:69 templates/member/club_info.html:38
#: apps/member/models.py:71 templates/member/club_info.html:41
msgid "email"
msgstr ""
#: apps/member/models.py:76
#: apps/member/models.py:78
msgid "parent club"
msgstr ""
#: apps/member/models.py:85
#: apps/member/models.py:87
msgid "require memberships"
msgstr ""
#: apps/member/models.py:86
#: apps/member/models.py:88
msgid "Uncheck if this club don't require memberships."
msgstr ""
#: apps/member/models.py:91 templates/member/club_info.html:31
msgid "membership fee"
#: apps/member/models.py:93 templates/member/club_info.html:31
msgid "membership fee (paid students)"
msgstr ""
#: apps/member/models.py:97 templates/member/club_info.html:28
#: apps/member/models.py:98 templates/member/club_info.html:34
msgid "membership fee (unpaid students)"
msgstr ""
#: apps/member/models.py:104 templates/member/club_info.html:28
msgid "membership duration"
msgstr ""
#: apps/member/models.py:98
#: apps/member/models.py:105
msgid "The longest time (in days) a membership can last (NULL = infinite)."
msgstr ""
#: apps/member/models.py:105 templates/member/club_info.html:22
#: apps/member/models.py:112 templates/member/club_info.html:22
msgid "membership start"
msgstr ""
#: apps/member/models.py:106
#: apps/member/models.py:113
msgid "How long after January 1st the members can renew their membership."
msgstr ""
#: apps/member/models.py:113 templates/member/club_info.html:25
#: apps/member/models.py:120 templates/member/club_info.html:25
msgid "membership end"
msgstr ""
#: apps/member/models.py:114
#: apps/member/models.py:121
msgid ""
"How long the membership can last after January 1st of the next year after "
"members can renew their membership."
msgstr ""
#: apps/member/models.py:143 apps/note/models/notes.py:139
#: apps/member/models.py:151 apps/note/models/notes.py:139
msgid "club"
msgstr ""
#: apps/member/models.py:144
#: apps/member/models.py:152
msgid "clubs"
msgstr ""
#: apps/member/models.py:164 apps/permission/models.py:284
#: apps/member/models.py:172 apps/permission/models.py:288
msgid "role"
msgstr ""
#: apps/member/models.py:165
#: apps/member/models.py:173 apps/member/models.py:196
msgid "roles"
msgstr ""
#: apps/member/models.py:191
#: apps/member/models.py:200
msgid "membership starts on"
msgstr ""
#: apps/member/models.py:195
#: apps/member/models.py:204
msgid "membership ends on"
msgstr ""
#: apps/member/models.py:200
#: apps/member/models.py:209
msgid "fee"
msgstr ""
#: apps/member/models.py:212
#: apps/member/models.py:221 apps/member/views.py:365
msgid "User is not a member of the parent club"
msgstr ""
#: apps/member/models.py:224
#: apps/member/models.py:231 apps/member/views.py:374
msgid "User is already a member of the club"
msgstr ""
#: apps/member/models.py:265
msgid "membership"
msgstr ""
#: apps/member/models.py:225
#: apps/member/models.py:266
msgid "memberships"
msgstr ""
#: apps/member/views.py:77 templates/member/profile_info.html:45
#: apps/member/views.py:78 templates/member/profile_info.html:45
msgid "Update Profile"
msgstr ""
#: apps/member/views.py:90
#: apps/member/views.py:91
msgid "An alias with a similar name already exists."
msgstr ""
#: apps/member/views.py:378 apps/member/views.py:410
msgid "The membership must start after {:%m-%d-%Y}."
msgstr ""
#: apps/member/views.py:383 apps/member/views.py:415
msgid "The membership must start before {:%m-%d-%Y}."
msgstr ""
#: apps/note/admin.py:120 apps/note/models/transactions.py:94
msgid "source"
msgstr ""
#: apps/note/admin.py:128 apps/note/admin.py:156
#: apps/note/admin.py:128 apps/note/admin.py:163
#: apps/note/models/transactions.py:53 apps/note/models/transactions.py:107
msgid "destination"
msgstr ""
@ -470,7 +486,7 @@ msgstr ""
msgid "alias"
msgstr ""
#: apps/note/models/notes.py:211 templates/member/club_info.html:35
#: apps/note/models/notes.py:211 templates/member/club_info.html:38
#: templates/member/profile_info.html:36
msgid "aliases"
msgstr ""
@ -532,45 +548,45 @@ msgstr ""
msgid "invalidity reason"
msgstr ""
#: apps/note/models/transactions.py:146
#: apps/note/models/transactions.py:147
msgid "transaction"
msgstr ""
#: apps/note/models/transactions.py:147
#: apps/note/models/transactions.py:148
msgid "transactions"
msgstr ""
#: apps/note/models/transactions.py:201 templates/base.html:84
#: apps/note/models/transactions.py:202 templates/base.html:84
#: templates/note/transaction_form.html:19
#: templates/note/transaction_form.html:140
msgid "Transfer"
msgstr ""
#: apps/note/models/transactions.py:221
#: apps/note/models/transactions.py:222
msgid "Template"
msgstr ""
#: apps/note/models/transactions.py:236
#: apps/note/models/transactions.py:237
msgid "first_name"
msgstr ""
#: apps/note/models/transactions.py:241
#: apps/note/models/transactions.py:242
msgid "bank"
msgstr ""
#: apps/note/models/transactions.py:247 templates/note/transaction_form.html:24
#: apps/note/models/transactions.py:248 templates/note/transaction_form.html:24
msgid "Credit"
msgstr ""
#: apps/note/models/transactions.py:247 templates/note/transaction_form.html:28
#: apps/note/models/transactions.py:248 templates/note/transaction_form.html:28
msgid "Debit"
msgstr ""
#: apps/note/models/transactions.py:263 apps/note/models/transactions.py:268
#: apps/note/models/transactions.py:264 apps/note/models/transactions.py:269
msgid "membership transaction"
msgstr ""
#: apps/note/models/transactions.py:264
#: apps/note/models/transactions.py:265
msgid "membership transactions"
msgstr ""
@ -594,21 +610,21 @@ msgstr ""
msgid "Consumptions"
msgstr ""
#: apps/permission/models.py:78 apps/permission/models.py:271
#: apps/permission/models.py:82 apps/permission/models.py:275
#, python-brace-format
msgid "Can {type} {model}.{field} in {query}"
msgstr ""
#: apps/permission/models.py:80 apps/permission/models.py:273
#: apps/permission/models.py:84 apps/permission/models.py:277
#, python-brace-format
msgid "Can {type} {model} in {query}"
msgstr ""
#: apps/permission/models.py:93
#: apps/permission/models.py:97
msgid "rank"
msgstr ""
#: apps/permission/models.py:156
#: apps/permission/models.py:160
msgid "Specifying field applies only to view and change permission types."
msgstr ""
@ -892,19 +908,15 @@ msgstr ""
msgid "days"
msgstr ""
#: templates/member/club_info.html:43
#: templates/member/club_info.html:47
msgid "Add member"
msgstr ""
#: templates/member/club_info.html:44 templates/note/conso_form.html:121
#: templates/member/club_info.html:50 templates/note/conso_form.html:121
msgid "Edit"
msgstr ""
#: templates/member/club_info.html:45
msgid "Add roles"
msgstr ""
#: templates/member/club_info.html:48 templates/member/profile_info.html:48
#: templates/member/club_info.html:54 templates/member/profile_info.html:48
msgid "View Profile"
msgstr ""

View File

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-03-31 23:49+0200\n"
"POT-Creation-Date: 2020-04-01 04:00+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -40,9 +40,9 @@ msgid "You can't invite more than 3 people to this activity."
msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité."
#: apps/activity/models.py:23 apps/activity/models.py:48
#: apps/member/models.py:64 apps/member/models.py:158
#: apps/member/models.py:66 apps/member/models.py:166
#: apps/note/models/notes.py:188 apps/note/models/transactions.py:24
#: apps/note/models/transactions.py:44 apps/note/models/transactions.py:231
#: apps/note/models/transactions.py:44 apps/note/models/transactions.py:232
#: templates/member/club_info.html:13 templates/member/profile_info.html:14
msgid "name"
msgstr "nom"
@ -64,7 +64,7 @@ msgid "activity types"
msgstr "types d'activité"
#: apps/activity/models.py:53 apps/note/models/transactions.py:69
#: apps/permission/models.py:99 templates/activity/activity_detail.html:16
#: apps/permission/models.py:103 templates/activity/activity_detail.html:16
msgid "description"
msgstr "description"
@ -247,73 +247,77 @@ msgstr "Les logs ne peuvent pas être détruits."
msgid "member"
msgstr "adhérent"
#: apps/member/models.py:26
#: apps/member/models.py:28
msgid "phone number"
msgstr "numéro de téléphone"
#: apps/member/models.py:32 templates/member/profile_info.html:27
#: apps/member/models.py:34 templates/member/profile_info.html:27
msgid "section"
msgstr "section"
#: apps/member/models.py:33
#: apps/member/models.py:35
msgid "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\""
msgstr "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\""
#: apps/member/models.py:39 templates/member/profile_info.html:30
#: apps/member/models.py:41 templates/member/profile_info.html:30
msgid "address"
msgstr "adresse"
#: apps/member/models.py:45
#: apps/member/models.py:47
msgid "paid"
msgstr "payé"
#: apps/member/models.py:50 apps/member/models.py:51
#: apps/member/models.py:52 apps/member/models.py:53
msgid "user profile"
msgstr "profil utilisateur"
#: apps/member/models.py:69 templates/member/club_info.html:38
#: apps/member/models.py:71 templates/member/club_info.html:41
msgid "email"
msgstr "courriel"
#: apps/member/models.py:76
#: apps/member/models.py:78
msgid "parent club"
msgstr "club parent"
#: apps/member/models.py:85
#: apps/member/models.py:87
msgid "require memberships"
msgstr "nécessite des adhésions"
#: apps/member/models.py:86
#: apps/member/models.py:88
msgid "Uncheck if this club don't require memberships."
msgstr "Décochez si ce club n'utilise pas d'adhésions."
#: apps/member/models.py:91 templates/member/club_info.html:31
msgid "membership fee"
msgstr "cotisation pour adhérer"
#: apps/member/models.py:93 templates/member/club_info.html:31
msgid "membership fee (paid students)"
msgstr "cotisation pour adhérer (normalien élève)"
#: apps/member/models.py:97 templates/member/club_info.html:28
#: apps/member/models.py:98 templates/member/club_info.html:34
msgid "membership fee (unpaid students)"
msgstr "cotisation pour adhérer (normalien étudiant)"
#: apps/member/models.py:104 templates/member/club_info.html:28
msgid "membership duration"
msgstr "durée de l'adhésion"
#: apps/member/models.py:98
#: apps/member/models.py:105
msgid "The longest time (in days) a membership can last (NULL = infinite)."
msgstr "La durée maximale (en jours) d'une adhésion (NULL = infinie)."
#: apps/member/models.py:105 templates/member/club_info.html:22
#: apps/member/models.py:112 templates/member/club_info.html:22
msgid "membership start"
msgstr "début de l'adhésion"
#: apps/member/models.py:106
#: apps/member/models.py:113
msgid "How long after January 1st the members can renew their membership."
msgstr ""
"Combien de temps après le 1er Janvier les adhérents peuvent renouveler leur "
"adhésion."
#: apps/member/models.py:113 templates/member/club_info.html:25
#: apps/member/models.py:120 templates/member/club_info.html:25
msgid "membership end"
msgstr "fin de l'adhésion"
#: apps/member/models.py:114
#: apps/member/models.py:121
msgid ""
"How long the membership can last after January 1st of the next year after "
"members can renew their membership."
@ -321,59 +325,71 @@ msgstr ""
"Combien de temps l'adhésion peut durer après le 1er Janvier de l'année "
"suivante avant que les adhérents peuvent renouveler leur adhésion."
#: apps/member/models.py:143 apps/note/models/notes.py:139
#: apps/member/models.py:151 apps/note/models/notes.py:139
msgid "club"
msgstr "club"
#: apps/member/models.py:144
#: apps/member/models.py:152
msgid "clubs"
msgstr "clubs"
#: apps/member/models.py:164 apps/permission/models.py:284
#: apps/member/models.py:172 apps/permission/models.py:288
msgid "role"
msgstr "rôle"
#: apps/member/models.py:165
#: apps/member/models.py:173 apps/member/models.py:196
msgid "roles"
msgstr "rôles"
#: apps/member/models.py:191
#: apps/member/models.py:200
msgid "membership starts on"
msgstr "l'adhésion commence le"
#: apps/member/models.py:195
#: apps/member/models.py:204
msgid "membership ends on"
msgstr "l'adhésion finie le"
msgstr "l'adhésion finit le"
#: apps/member/models.py:200
#: apps/member/models.py:209
msgid "fee"
msgstr "cotisation"
#: apps/member/models.py:212
#: apps/member/models.py:221 apps/member/views.py:365
msgid "User is not a member of the parent club"
msgstr "L'utilisateur n'est pas membre du club parent"
#: apps/member/models.py:224
#: apps/member/models.py:231 apps/member/views.py:374
msgid "User is already a member of the club"
msgstr "L'utilisateur est déjà membre du club"
#: apps/member/models.py:265
msgid "membership"
msgstr "adhésion"
#: apps/member/models.py:225
#: apps/member/models.py:266
msgid "memberships"
msgstr "adhésions"
#: apps/member/views.py:77 templates/member/profile_info.html:45
#: apps/member/views.py:78 templates/member/profile_info.html:45
msgid "Update Profile"
msgstr "Modifier le profil"
#: apps/member/views.py:90
#: apps/member/views.py:91
msgid "An alias with a similar name already exists."
msgstr "Un alias avec un nom similaire existe déjà."
#: apps/member/views.py:378 apps/member/views.py:410
msgid "The membership must start after {:%m-%d-%Y}."
msgstr "L'adhésion doit commencer après le {:%d/%m/%Y}."
#: apps/member/views.py:383 apps/member/views.py:415
msgid "The membership must begin before {:%m-%d-%Y}."
msgstr "L'adhésion doit commencer avant le {:%d/%m/%Y}."
#: apps/note/admin.py:120 apps/note/models/transactions.py:94
msgid "source"
msgstr "source"
#: apps/note/admin.py:128 apps/note/admin.py:156
#: apps/note/admin.py:128 apps/note/admin.py:163
#: apps/note/models/transactions.py:53 apps/note/models/transactions.py:107
msgid "destination"
msgstr "destination"
@ -471,7 +487,7 @@ msgstr "Alias invalide"
msgid "alias"
msgstr "alias"
#: apps/note/models/notes.py:211 templates/member/club_info.html:35
#: apps/note/models/notes.py:211 templates/member/club_info.html:38
#: templates/member/profile_info.html:36
msgid "aliases"
msgstr "alias"
@ -533,45 +549,45 @@ msgstr "raison"
msgid "invalidity reason"
msgstr "Motif d'invalidité"
#: apps/note/models/transactions.py:146
#: apps/note/models/transactions.py:147
msgid "transaction"
msgstr "transaction"
#: apps/note/models/transactions.py:147
#: apps/note/models/transactions.py:148
msgid "transactions"
msgstr "transactions"
#: apps/note/models/transactions.py:201 templates/base.html:84
#: apps/note/models/transactions.py:202 templates/base.html:84
#: templates/note/transaction_form.html:19
#: templates/note/transaction_form.html:140
msgid "Transfer"
msgstr "Virement"
#: apps/note/models/transactions.py:221
#: apps/note/models/transactions.py:222
msgid "Template"
msgstr "Bouton"
#: apps/note/models/transactions.py:236
#: apps/note/models/transactions.py:237
msgid "first_name"
msgstr "prénom"
#: apps/note/models/transactions.py:241
#: apps/note/models/transactions.py:242
msgid "bank"
msgstr "banque"
#: apps/note/models/transactions.py:247 templates/note/transaction_form.html:24
#: apps/note/models/transactions.py:248 templates/note/transaction_form.html:24
msgid "Credit"
msgstr "Crédit"
#: apps/note/models/transactions.py:247 templates/note/transaction_form.html:28
#: apps/note/models/transactions.py:248 templates/note/transaction_form.html:28
msgid "Debit"
msgstr "Débit"
#: apps/note/models/transactions.py:263 apps/note/models/transactions.py:268
#: apps/note/models/transactions.py:264 apps/note/models/transactions.py:269
msgid "membership transaction"
msgstr "transaction d'adhésion"
#: apps/note/models/transactions.py:264
#: apps/note/models/transactions.py:265
msgid "membership transactions"
msgstr "transactions d'adhésion"
@ -595,21 +611,21 @@ msgstr "Transférer de l'argent"
msgid "Consumptions"
msgstr "Consommations"
#: apps/permission/models.py:78 apps/permission/models.py:271
#: apps/permission/models.py:82 apps/permission/models.py:275
#, python-brace-format
msgid "Can {type} {model}.{field} in {query}"
msgstr ""
#: apps/permission/models.py:80 apps/permission/models.py:273
#: apps/permission/models.py:84 apps/permission/models.py:277
#, python-brace-format
msgid "Can {type} {model} in {query}"
msgstr ""
#: apps/permission/models.py:93
#: apps/permission/models.py:97
msgid "rank"
msgstr "Rang"
#: apps/permission/models.py:156
#: apps/permission/models.py:160
msgid "Specifying field applies only to view and change permission types."
msgstr ""
@ -895,19 +911,15 @@ msgstr "Club parent"
msgid "days"
msgstr "jours"
#: templates/member/club_info.html:43
#: templates/member/club_info.html:47
msgid "Add member"
msgstr "Ajouter un membre"
#: templates/member/club_info.html:44 templates/note/conso_form.html:121
#: templates/member/club_info.html:50 templates/note/conso_form.html:121
msgid "Edit"
msgstr "Éditer"
#: templates/member/club_info.html:45
msgid "Add roles"
msgstr "Ajouter des rôles"
#: templates/member/club_info.html:48 templates/member/profile_info.html:48
#: templates/member/club_info.html:54 templates/member/profile_info.html:48
msgid "View Profile"
msgstr "Voir le profil"
@ -1217,5 +1229,8 @@ msgstr "Il n'y a pas de transaction associée à une remise ouverte."
msgid "Closed remittances"
msgstr "Remises fermées"
#~ msgid "Add roles"
#~ msgstr "Ajouter des rôles"
#~ msgid "linked notes"
#~ msgstr "notes liées"

View File

@ -15,14 +15,16 @@
require_memberships_obj = $("#id_require_memberships");
if (!require_memberships_obj.is(":checked")) {
$("#div_id_membership_fee").toggle();
$("#div_id_membership_fee_paid").toggle();
$("#div_id_membership_fee_unpaid").toggle();
$("#div_id_membership_duration").toggle();
$("#div_id_membership_start").toggle();
$("#div_id_membership_end").toggle();
}
require_memberships_obj.change(function () {
$("#div_id_membership_fee").toggle();
$("#div_id_membership_fee_paid").toggle();
$("#div_id_membership_fee_unpaid").toggle();
$("#div_id_membership_duration").toggle();
$("#div_id_membership_start").toggle();
$("#div_id_membership_end").toggle();

View File

@ -28,8 +28,11 @@
<dt class="col-xl-6">{% trans 'membership duration'|capfirst %}</dt>
<dd class="col-xl-6">{{ club.membership_duration }} {% trans "days" %}</dd>
<dt class="col-xl-6">{% trans 'membership fee'|capfirst %}</dt>
<dd class="col-xl-6">{{ club.membership_fee|pretty_money }}</dd>
<dt class="col-xl-6">{% trans 'membership fee (paid students)'|capfirst %}</dt>
<dd class="col-xl-6">{{ club.membership_fee_paid|pretty_money }}</dd>
<dt class="col-xl-6">{% trans 'membership fee (unpaid students)'|capfirst %}</dt>
<dd class="col-xl-6">{{ club.membership_fee_unpaid|pretty_money }}</dd>
{% endif %}
<dt class="col-xl-6"><a href="{% url 'member:club_alias' club.pk %}">{% trans 'aliases'|capfirst %}</a></dt>