mirror of
https://gitlab.crans.org/bde/nk20
synced 2024-12-22 23:42:25 +00:00
Membership fees for paid and unpaid students, closes #43
This commit is contained in:
parent
d5b010980b
commit
0df0f3f66b
@ -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"
|
||||
|
@ -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={
|
||||
|
@ -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')
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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();
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user