From 3c34033bf546331bd92a95bcca5ec744dbab50b2 Mon Sep 17 00:00:00 2001 From: bleizi Date: Thu, 12 Sep 2024 13:41:04 +0200 Subject: [PATCH 01/45] fix linters for WEI 2024 survey --- apps/wei/forms/surveys/wei2024.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/wei/forms/surveys/wei2024.py b/apps/wei/forms/surveys/wei2024.py index 76932bef..518d58f0 100644 --- a/apps/wei/forms/surveys/wei2024.py +++ b/apps/wei/forms/surveys/wei2024.py @@ -279,7 +279,6 @@ class WEISurveyAlgorithm2024(WEISurveyAlgorithm): # surveys = [s for s in surveys if s.bus_id != None] # surveys = [s for s in surveys if not hasattr(s.information, 'hardcoded') or not s.information.hardcoded] - # surveys = [s for s in surveys if s.registration.user_id in free_users] # hardcoded_first_year_mb = WEIMembership.objects.filter(bus != None,registration__first_year=True) @@ -288,15 +287,13 @@ class WEISurveyAlgorithm2024(WEISurveyAlgorithm): hardcoded_first_year_mb = WEIMembership.objects.filter(registration__first_year=True) hardcoded_first_year = {mb.user.id if mb.bus else None: mb.bus.id if mb.bus else None for mb in hardcoded_first_year_mb} - # Reset previous algorithm run for survey in surveys: survey.free() if survey.registration.user_id in hardcoded_first_year.keys(): - survey.select_bus(hardcoded_first_year[s.registration.user_id]) + survey.select_bus(hardcoded_first_year[survey.registration.user_id]) survey.save() - non_men = [s for s in surveys if s.registration.gender != 'male'] men = [s for s in surveys if s.registration.gender == 'male'] From 476fbceeea6e1f63665df9b0eeb782f403571557 Mon Sep 17 00:00:00 2001 From: quark Date: Thu, 10 Oct 2024 01:48:23 +0200 Subject: [PATCH 02/45] Donation goal la note kfet x les SdA --- note_kfet/templates/base.html | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/note_kfet/templates/base.html b/note_kfet/templates/base.html index 68cbf542..9539efd7 100644 --- a/note_kfet/templates/base.html +++ b/note_kfet/templates/base.html @@ -158,7 +158,12 @@ SPDX-License-Identifier: GPL-3.0-or-later
-
+
+ {% if user.is_authenticated %} +
+ Venez au festival des Sens de l'Art du 2 au 7 décembre 🐘 ! +
+ {% endif %} {% if user.is_authenticated %} {% if not user|is_member:"BDE" %}
From 2be613345881a157930e4e17e2b732d13d06adf7 Mon Sep 17 00:00:00 2001 From: thomasl Date: Sun, 22 Dec 2024 20:42:20 +0100 Subject: [PATCH 03/45] Update file initial.json --- apps/permission/fixtures/initial.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index baed9a8d..ca9d8810 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -3800,6 +3800,22 @@ "description": "Voir les utilisateurs adhérents au club parent" } }, + { + "model": "permission.permission", + "pk": 242, + "fields": { + "model": [ + "note", + "transaction" + ], + "query": "[\"AND\", [{\"destination\": [\"club\", \"note\"]}], [\"OR\", {\"source__balance__gte\": {\"F\": [\"SUB\", [\"MUL\", [\"F\", \"amount\"], [\"F\", \"quantity\"]], 2000]}}, {\"valid\": false}]]", + "type": "add", + "mask": 2, + "field": "", + "permanent": false, + "description": "Créer une transaction vers la note d'un club" + } + }, { "model": "permission.role", "pk": 1, From a63c34fe371f1079705bd4304bbeee1239409180 Mon Sep 17 00:00:00 2001 From: thomasl Date: Sun, 22 Dec 2024 21:38:17 +0100 Subject: [PATCH 04/45] Update file initial.json --- apps/permission/fixtures/initial.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index ca9d8810..766ea03a 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -3808,7 +3808,7 @@ "note", "transaction" ], - "query": "[\"AND\", [{\"destination\": [\"club\", \"note\"]}], [\"OR\", {\"source__balance__gte\": {\"F\": [\"SUB\", [\"MUL\", [\"F\", \"amount\"], [\"F\", \"quantity\"]], 2000]}}, {\"valid\": false}]]", + "query": "[\"AND\", {\"destination\": [\"club\", \"note\"]}, [\"OR\", {\"source__balance__gte\": {\"F\": [\"SUB\", [\"MUL\", [\"F\", \"amount\"], [\"F\", \"quantity\"]], 2000]}}, {\"valid\": false}]]", "type": "add", "mask": 2, "field": "", From 942d887c2e994bdefee0b0ee950db4d678eb1d14 Mon Sep 17 00:00:00 2001 From: thomasl Date: Mon, 23 Dec 2024 18:31:11 +0100 Subject: [PATCH 05/45] Update file initial.json --- apps/permission/fixtures/initial.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index 766ea03a..565a604c 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -3816,6 +3816,22 @@ "description": "Créer une transaction vers la note d'un club" } }, + { + "model": "permission.permission", + "pk": 243, + "fields": { + "model": [ + "member", + "profile" + ], + "query": "{\"user__memberships__club\": [\"club\"], \"user__memberships__date_start__lte\": [\"today\"],\"user__memberships__date_end__gte\": [\"today\"]}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir les profils des membres du club" + } + }, { "model": "permission.role", "pk": 1, From 414e103686df5b604d1b47cad0e1a698294d0040 Mon Sep 17 00:00:00 2001 From: mcngnt Date: Sun, 5 Jan 2025 23:17:01 +0100 Subject: [PATCH 06/45] finitio le message sda --- note_kfet/templates/base.html | 5 ----- 1 file changed, 5 deletions(-) diff --git a/note_kfet/templates/base.html b/note_kfet/templates/base.html index 9539efd7..a84f29b2 100644 --- a/note_kfet/templates/base.html +++ b/note_kfet/templates/base.html @@ -159,11 +159,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
- {% if user.is_authenticated %} -
- Venez au festival des Sens de l'Art du 2 au 7 décembre 🐘 ! -
- {% endif %} {% if user.is_authenticated %} {% if not user|is_member:"BDE" %}
From 80e109114f99c14bd3df29ad7be2d850d21818b2 Mon Sep 17 00:00:00 2001 From: thomasl Date: Fri, 17 Jan 2025 18:23:28 +0100 Subject: [PATCH 07/45] Update file initial.json --- apps/permission/fixtures/initial.json | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index 565a604c..33d71663 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -4410,6 +4410,41 @@ ] } }, + { + "model": "permission.role", + "pk": 23, + "fields": { + "for_club": 10, + "name": "Tr\u00e9sorièr\u22c5e BDA", + "permissions": [ + 33, + 55, + 56, + 57, + 58, + 135, + 143, + 176, + 177, + 178 + ] + } + }, + { + "model": "permission.role", + "pk": 24, + "fields": { + "for_club": 10, + "name": "Respo sortie", + "permissions": [ + 239, + 240, + 241, + 242, + 243 + ] + } + }, { "model": "wei.weirole", "pk": 12, From 54ba78688429ad2450935fa561f8abb2d1d304cc Mon Sep 17 00:00:00 2001 From: thomasl Date: Fri, 17 Jan 2025 19:03:59 +0100 Subject: [PATCH 08/45] Update file initial.json --- apps/permission/fixtures/initial.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index 33d71663..a5ba4dc9 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -4414,7 +4414,7 @@ "model": "permission.role", "pk": 23, "fields": { - "for_club": 10, + "for_club": 2, "name": "Tr\u00e9sorièr\u22c5e BDA", "permissions": [ 33, From caaeab6b0bafc5eda2a041053a577e563cb99162 Mon Sep 17 00:00:00 2001 From: thomasl Date: Fri, 17 Jan 2025 19:39:26 +0100 Subject: [PATCH 09/45] Update file initial.json --- apps/permission/fixtures/initial.json | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index a5ba4dc9..597b7fa7 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -4414,7 +4414,7 @@ "model": "permission.role", "pk": 23, "fields": { - "for_club": 2, + "for_club": 10, "name": "Tr\u00e9sorièr\u22c5e BDA", "permissions": [ 33, @@ -4445,6 +4445,28 @@ ] } }, + { + "model": "permission.role", + "pk": 25, + "fields": { + "for_club": 267, + "name": "Tr\u00e9sorièr\u22c5e Terre à terre", + "permissions": [ + 33, + 55, + 56, + 57, + 58, + 135, + 143, + 176, + 177, + 178 + ] + } + }, + + { "model": "wei.weirole", "pk": 12, From 43dc67674740e165ae6a63192155b2a412f1242e Mon Sep 17 00:00:00 2001 From: thomasl Date: Sat, 18 Jan 2025 12:57:42 +0100 Subject: [PATCH 10/45] Update file initial.json --- apps/permission/fixtures/initial.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index 597b7fa7..f1a5a50b 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -4465,6 +4465,17 @@ ] } }, + { + "model": "permission.role", + "pk": 26, + "fields": { + "for_club": 282, + "name": "Tr\u00e9sorièr\u22c5e Gala", + "permissions": [ + 33 + ] + } + }, { From bd6ed27ae54c5eea40f66f08045e1519036c5318 Mon Sep 17 00:00:00 2001 From: thomasl Date: Sat, 18 Jan 2025 15:11:57 +0100 Subject: [PATCH 11/45] Update 2 files - /apps/permission/fixtures/initial.json - /apps/permission/admin.py --- apps/permission/admin.py | 1 + apps/permission/fixtures/initial.json | 70 +-------------------------- 2 files changed, 2 insertions(+), 69 deletions(-) diff --git a/apps/permission/admin.py b/apps/permission/admin.py index a6fc713c..82f8d4ab 100644 --- a/apps/permission/admin.py +++ b/apps/permission/admin.py @@ -31,3 +31,4 @@ class RoleAdmin(admin.ModelAdmin): Admin customisation for Role """ list_display = ('name', ) + filter_horizontal = ('permissions',) diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index f1a5a50b..00f952cc 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -4409,75 +4409,7 @@ 238 ] } - }, - { - "model": "permission.role", - "pk": 23, - "fields": { - "for_club": 10, - "name": "Tr\u00e9sorièr\u22c5e BDA", - "permissions": [ - 33, - 55, - 56, - 57, - 58, - 135, - 143, - 176, - 177, - 178 - ] - } - }, - { - "model": "permission.role", - "pk": 24, - "fields": { - "for_club": 10, - "name": "Respo sortie", - "permissions": [ - 239, - 240, - 241, - 242, - 243 - ] - } - }, - { - "model": "permission.role", - "pk": 25, - "fields": { - "for_club": 267, - "name": "Tr\u00e9sorièr\u22c5e Terre à terre", - "permissions": [ - 33, - 55, - 56, - 57, - 58, - 135, - 143, - 176, - 177, - 178 - ] - } - }, - { - "model": "permission.role", - "pk": 26, - "fields": { - "for_club": 282, - "name": "Tr\u00e9sorièr\u22c5e Gala", - "permissions": [ - 33 - ] - } - }, - - + }, { "model": "wei.weirole", "pk": 12, From a87ce625f3d0fba6c8401cf9ac5953863d47b169 Mon Sep 17 00:00:00 2001 From: thomasl Date: Sat, 25 Jan 2025 13:55:21 +0100 Subject: [PATCH 12/45] Update file note.cron --- note.cron | 2 ++ 1 file changed, 2 insertions(+) diff --git a/note.cron b/note.cron index dc1f6460..2f75f989 100644 --- a/note.cron +++ b/note.cron @@ -26,3 +26,5 @@ MAILTO=notekfet2020@lists.crans.org 00 9 * * * root cd /var/www/note_kfet && env/bin/python manage.py refresh_highlighted_buttons -v 0 # Vider les tokens Oauth2 00 6 * * * root cd /var/www/note_kfet && env/bin/python manage.py cleartokens -v 0 +# Envoyer la liste des abonnés à la NL BDA + 00 8 * * 0 root cd /var/www/note_kfet && env/bin/python manage.py extract_ml_registrations -t art -v 0 \ No newline at end of file From 623290827aa6147c71d9282b962bc87de5ae034f Mon Sep 17 00:00:00 2001 From: thomasl Date: Mon, 27 Jan 2025 16:34:45 +0100 Subject: [PATCH 13/45] Update file forms.py --- apps/member/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/member/forms.py b/apps/member/forms.py index a74ddb90..62b1667e 100644 --- a/apps/member/forms.py +++ b/apps/member/forms.py @@ -76,7 +76,7 @@ class ProfileForm(forms.ModelForm): class Meta: model = Profile fields = '__all__' - exclude = ('user', 'email_confirmed', 'registration_valid', ) + exclude = ('user', 'email_confirmed', 'registration_valid','ml_sport_registration', ) class ImageForm(forms.Form): From 47fda0ea360de23e073982c9c6c30ff150933f47 Mon Sep 17 00:00:00 2001 From: thomasl Date: Sun, 2 Feb 2025 13:17:19 +0100 Subject: [PATCH 14/45] Update file forms.py --- apps/member/forms.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/member/forms.py b/apps/member/forms.py index 62b1667e..9bc4c8ec 100644 --- a/apps/member/forms.py +++ b/apps/member/forms.py @@ -76,7 +76,9 @@ class ProfileForm(forms.ModelForm): class Meta: model = Profile fields = '__all__' - exclude = ('user', 'email_confirmed', 'registration_valid','ml_sport_registration', ) + # Remove ml_[asso]_registration from exclude if the concerned association uses nk20 to manage its mailing list. + # Remove report_frequency from exclude if you want to use this feature. + exclude = ('user', 'email_confirmed', 'registration_valid', 'ml_sport_registration', "ml_events_registration", "report_frequency", ) class ImageForm(forms.Form): From 867bf9fd25247ceb8990424288c5d168848a3d20 Mon Sep 17 00:00:00 2001 From: thomasl Date: Sun, 2 Feb 2025 13:33:41 +0100 Subject: [PATCH 15/45] Update file forms.py --- apps/member/forms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/member/forms.py b/apps/member/forms.py index 9bc4c8ec..95b5978a 100644 --- a/apps/member/forms.py +++ b/apps/member/forms.py @@ -44,9 +44,9 @@ class ProfileForm(forms.ModelForm): """ A form for the extras field provided by the :model:`member.Profile` model. """ - report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency")) + # report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency")) - last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date")) + # last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date")) VSS_charter_read = forms.BooleanField( required=True, From 1481aa06358d5a2e3c1cb9556449698cce50ef2a Mon Sep 17 00:00:00 2001 From: thomasl Date: Sun, 2 Feb 2025 14:05:05 +0100 Subject: [PATCH 16/45] Update file forms.py --- apps/member/forms.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/member/forms.py b/apps/member/forms.py index 95b5978a..9a5c3166 100644 --- a/apps/member/forms.py +++ b/apps/member/forms.py @@ -44,9 +44,9 @@ class ProfileForm(forms.ModelForm): """ A form for the extras field provided by the :model:`member.Profile` model. """ - # report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency")) + report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency"), widget=django.forms.HiddenInput()) - # last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date")) + last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date")) VSS_charter_read = forms.BooleanField( required=True, @@ -77,8 +77,7 @@ class ProfileForm(forms.ModelForm): model = Profile fields = '__all__' # Remove ml_[asso]_registration from exclude if the concerned association uses nk20 to manage its mailing list. - # Remove report_frequency from exclude if you want to use this feature. - exclude = ('user', 'email_confirmed', 'registration_valid', 'ml_sport_registration', "ml_events_registration", "report_frequency", ) + exclude = ('user', 'email_confirmed', 'registration_valid', 'ml_sport_registration', "ml_events_registration", ) class ImageForm(forms.Form): From ef485e06281ba12e21b05203b86d3ae3d8e7fb45 Mon Sep 17 00:00:00 2001 From: thomasl Date: Sun, 2 Feb 2025 14:06:22 +0100 Subject: [PATCH 17/45] Update file forms.py --- apps/member/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/member/forms.py b/apps/member/forms.py index 9a5c3166..a8b106d6 100644 --- a/apps/member/forms.py +++ b/apps/member/forms.py @@ -44,7 +44,7 @@ class ProfileForm(forms.ModelForm): """ A form for the extras field provided by the :model:`member.Profile` model. """ - report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency"), widget=django.forms.HiddenInput()) + report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency"), widget=forms.HiddenInput()) last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date")) From a209e0d36639df404727dea966850bbf1b4a268e Mon Sep 17 00:00:00 2001 From: thomasl Date: Sun, 2 Feb 2025 14:30:53 +0100 Subject: [PATCH 18/45] Update file forms.py --- apps/member/forms.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/member/forms.py b/apps/member/forms.py index a8b106d6..352a5625 100644 --- a/apps/member/forms.py +++ b/apps/member/forms.py @@ -44,6 +44,7 @@ class ProfileForm(forms.ModelForm): """ A form for the extras field provided by the :model:`member.Profile` model. """ + # Remove widget=forms.HiddenInput() if you want to use report frequency. report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency"), widget=forms.HiddenInput()) last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date")) @@ -77,7 +78,7 @@ class ProfileForm(forms.ModelForm): model = Profile fields = '__all__' # Remove ml_[asso]_registration from exclude if the concerned association uses nk20 to manage its mailing list. - exclude = ('user', 'email_confirmed', 'registration_valid', 'ml_sport_registration', "ml_events_registration", ) + exclude = ('user', 'email_confirmed', 'registration_valid', 'ml_sport_registration', ) class ImageForm(forms.Form): From 7ed544b3acd8f0ea4217e432d8f7881261397811 Mon Sep 17 00:00:00 2001 From: quark Date: Sun, 9 Feb 2025 17:50:15 +0100 Subject: [PATCH 19/45] fix issues with activity entry view --- apps/activity/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/activity/views.py b/apps/activity/views.py index d559255d..579f7dc5 100644 --- a/apps/activity/views.py +++ b/apps/activity/views.py @@ -329,7 +329,7 @@ class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView): context["noteuser_ctype"] = ContentType.objects.get_for_model(NoteUser).pk context["notespecial_ctype"] = ContentType.objects.get_for_model(NoteSpecial).pk - activities_open = Activity.objects.filter(open=True).filter( + activities_open = Activity.objects.filter(open=True,activity_type__manage_entries=True).filter( PermissionBackend.filter_queryset(self.request, Activity, "view")).distinct().all() context["activities_open"] = [a for a in activities_open if PermissionBackend.check_perm(self.request, From 0d0fdef363087603869c0a0c3506b117ce33b243 Mon Sep 17 00:00:00 2001 From: quark Date: Sun, 9 Feb 2025 17:58:38 +0100 Subject: [PATCH 20/45] fix issue with activity entry view --- apps/activity/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/activity/views.py b/apps/activity/views.py index d559255d..17446947 100644 --- a/apps/activity/views.py +++ b/apps/activity/views.py @@ -329,7 +329,7 @@ class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView): context["noteuser_ctype"] = ContentType.objects.get_for_model(NoteUser).pk context["notespecial_ctype"] = ContentType.objects.get_for_model(NoteSpecial).pk - activities_open = Activity.objects.filter(open=True).filter( + activities_open = Activity.objects.filter(open=True, activity_type__manage_entries=True).filter( PermissionBackend.filter_queryset(self.request, Activity, "view")).distinct().all() context["activities_open"] = [a for a in activities_open if PermissionBackend.check_perm(self.request, From cd942779ca7c4175d6f989bf5524516e13ab15b4 Mon Sep 17 00:00:00 2001 From: quark Date: Tue, 11 Feb 2025 18:19:24 +0100 Subject: [PATCH 21/45] Wrapped apps --- apps/api/urls.py | 4 + apps/wrapped/__init__.py | 4 + apps/wrapped/admin.py | 16 ++++ apps/wrapped/api/__init__.py | 0 apps/wrapped/api/serializers.py | 28 ++++++ apps/wrapped/api/urls.py | 11 +++ apps/wrapped/api/views.py | 33 +++++++ apps/wrapped/apps.py | 10 +++ apps/wrapped/migrations/0001_initial.py | 86 ++++++++++++++++++ apps/wrapped/migrations/__init__.py | 0 apps/wrapped/models.py | 89 +++++++++++++++++++ apps/wrapped/tables.py | 72 +++++++++++++++ .../templates/wrapped/1/wrapped_view.html | 8 ++ .../templates/wrapped/wrapped_list.html | 62 +++++++++++++ apps/wrapped/urls.py | 13 +++ apps/wrapped/views.py | 63 +++++++++++++ note_kfet/settings/base.py | 1 + note_kfet/templates/base.html | 6 ++ note_kfet/urls.py | 1 + 19 files changed, 507 insertions(+) create mode 100644 apps/wrapped/__init__.py create mode 100644 apps/wrapped/admin.py create mode 100644 apps/wrapped/api/__init__.py create mode 100644 apps/wrapped/api/serializers.py create mode 100644 apps/wrapped/api/urls.py create mode 100644 apps/wrapped/api/views.py create mode 100644 apps/wrapped/apps.py create mode 100644 apps/wrapped/migrations/0001_initial.py create mode 100644 apps/wrapped/migrations/__init__.py create mode 100644 apps/wrapped/models.py create mode 100644 apps/wrapped/tables.py create mode 100644 apps/wrapped/templates/wrapped/1/wrapped_view.html create mode 100644 apps/wrapped/templates/wrapped/wrapped_list.html create mode 100644 apps/wrapped/urls.py create mode 100644 apps/wrapped/views.py diff --git a/apps/api/urls.py b/apps/api/urls.py index ef631004..ad2daf5f 100644 --- a/apps/api/urls.py +++ b/apps/api/urls.py @@ -47,6 +47,10 @@ if "wei" in settings.INSTALLED_APPS: from wei.api.urls import register_wei_urls register_wei_urls(router, 'wei') +if "wrapped" in settings.INSTALLED_APPS: + from wrapped.api.urls import register_wrapped_urls + register_wrapped_urls(router, 'wrapped') + app_name = 'api' # Wire up our API using automatic URL routing. diff --git a/apps/wrapped/__init__.py b/apps/wrapped/__init__.py new file mode 100644 index 00000000..e9c45ef0 --- /dev/null +++ b/apps/wrapped/__init__.py @@ -0,0 +1,4 @@ +# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +default_app_config = 'activity.apps.WrappedConfig' diff --git a/apps/wrapped/admin.py b/apps/wrapped/admin.py new file mode 100644 index 00000000..96a2b397 --- /dev/null +++ b/apps/wrapped/admin.py @@ -0,0 +1,16 @@ +# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.contrib import admin +from note_kfet.admin import admin_site + +from .models import Bde, Wrapped + + +@admin.register(Bde, site=admin_site) +class BdeAdmin(admin.ModelAdmin): + pass + +@admin.register(Wrapped, site=admin_site) +class WrappedAdmin(admin.ModelAdmin): + pass diff --git a/apps/wrapped/api/__init__.py b/apps/wrapped/api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/wrapped/api/serializers.py b/apps/wrapped/api/serializers.py new file mode 100644 index 00000000..d156ae75 --- /dev/null +++ b/apps/wrapped/api/serializers.py @@ -0,0 +1,28 @@ +# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from rest_framework import serializers + +from ..models import Wrapped, Bde + + +class WrappedSerializer(serializers.ModelSerializer): + """ + REST API Serializer for Wrapped. + The djangorestframework plugin will analyse the model `Wrapped` and parse all fields in the API. + """ + + class Meta: + model = Wrapped + fields = '__all__' + + +class BdeSerializer(serializers.ModelSerializer): + """ + REST API Serializer for Bde. + The djangorestframework plugin will analyse the model `Bde` and parse all fields in the API. + """ + + class Meta: + model = Bde + fields = '__all__' diff --git a/apps/wrapped/api/urls.py b/apps/wrapped/api/urls.py new file mode 100644 index 00000000..a989bb3c --- /dev/null +++ b/apps/wrapped/api/urls.py @@ -0,0 +1,11 @@ +# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from .views import WrappedViewSet, BdeViewSet + +def register_wrapped_urls(router, path): + """ + Configure router for Wrapped REST API. + """ + router.register(path + '/wrapped', WrappedViewSet) + router.register(path + '/bde', BdeViewSet) diff --git a/apps/wrapped/api/views.py b/apps/wrapped/api/views.py new file mode 100644 index 00000000..5fef0c66 --- /dev/null +++ b/apps/wrapped/api/views.py @@ -0,0 +1,33 @@ +# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from api.viewsets import ReadProtectedModelViewSet +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework.filters import SearchFilter + +from .serializers import WrappedSerializer, BdeSerializer +from ..models import Wrapped, Bde + +class WrappedViewSet(ReadProtectedModelViewSet): + """ + REST API View set. + The djangorestframework plugin will get all `Wrapped` objects, serialize it to JSON with the given + serializer, then render it on /api/wrapped/wrapped/ + """ + queryset = Wrapped.objects.order_by('id') + serializer_class = WrappedSerializer + filter_backends = [DjangoFilterBackend, SearchFilter] + filterset_fields = ['note', 'bde', ] + search_fields = ['$note', ] + +class BdeViewSet(ReadProtectedModelViewSet): + """ + REST API View set. + The djangorestframework plugin will get all `Bde` objects, serialize it to JSON with the given + serializer, then render it on /api/wrapped/bde/ + """ + queryset = Bde.objects.order_by('id') + serializer_class = BdeSerializer + filter_backends = [DjangoFilterBackend, SearchFilter] + filterset_fields = ['name', ] + search_fields = ['$name', ] diff --git a/apps/wrapped/apps.py b/apps/wrapped/apps.py new file mode 100644 index 00000000..83630287 --- /dev/null +++ b/apps/wrapped/apps.py @@ -0,0 +1,10 @@ +# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ + + +class WrappedConfig(AppConfig): + name = 'wrapped' + verbose_name = _('wrapped') diff --git a/apps/wrapped/migrations/0001_initial.py b/apps/wrapped/migrations/0001_initial.py new file mode 100644 index 00000000..15ffbd30 --- /dev/null +++ b/apps/wrapped/migrations/0001_initial.py @@ -0,0 +1,86 @@ +# Generated by Django 4.2.15 on 2025-02-10 12:41 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("note", "0007_alter_note_polymorphic_ctype_and_more"), + ] + + operations = [ + migrations.CreateModel( + name="Bde", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=255, verbose_name="name")), + ("date_start", models.DateTimeField(verbose_name="date start")), + ("date_end", models.DateTimeField(verbose_name="date end")), + ], + options={ + "verbose_name": "BDE", + "verbose_name_plural": "BDE", + }, + ), + migrations.CreateModel( + name="Wrapped", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "generated", + models.BooleanField(default=False, verbose_name="generated"), + ), + ("public", models.BooleanField(default=False, verbose_name="public")), + ( + "data_json", + models.TextField( + default="{}", + help_text="data in the wrapped and generated by the script generate_wrapped", + verbose_name="data json", + ), + ), + ( + "bde", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="+", + to="wrapped.bde", + verbose_name="bde", + ), + ), + ( + "note", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="+", + to="note.note", + verbose_name="note", + ), + ), + ], + options={ + "verbose_name": "Wrapped", + "verbose_name_plural": "Wrappeds", + "unique_together": {("note", "bde")}, + }, + ), + ] diff --git a/apps/wrapped/migrations/__init__.py b/apps/wrapped/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/wrapped/models.py b/apps/wrapped/models.py new file mode 100644 index 00000000..ea6f0efd --- /dev/null +++ b/apps/wrapped/models.py @@ -0,0 +1,89 @@ +# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +import os + +from django.db import models +from django.utils.translation import gettext_lazy as _ +from note.models import Note + + +class Bde(models.Model): + """ + describe a BDE + """ + + name = models.CharField( + max_length=255, + verbose_name=_('name'), + ) + + date_start = models.DateTimeField( + verbose_name=_('date start'), + ) + + date_end = models.DateTimeField( + verbose_name=_('date end'), + ) + + class Meta: + verbose_name=_('BDE') + verbose_name_plural=_('BDE') + + def __str__(self): + return self.name + + +class Wrapped(models.Model): + """ + A Wrapped is associated to a note, a BDE year, + """ + generated = models.BooleanField( + verbose_name=_('generated'), + default=False, + ) + + public = models.BooleanField( + verbose_name=_('public'), + default=False, + ) + + bde = models.ForeignKey( + Bde, + on_delete=models.PROTECT, + related_name='+', + verbose_name=_('bde'), + ) + + note = models.ForeignKey( + Note, + on_delete=models.PROTECT, + related_name='+', + verbose_name=_('note'), + ) + + data_json = models.TextField( + default='{}', + verbose_name=_('data json'), + help_text=_('data in the wrapped and generated by the script generate_wrapped'), + ) + + class Meta: + verbose_name=_('Wrapped') + verbose_name_plural=_('Wrappeds') + unique_together=('note','bde') + + def __str__(self): + return 'NoteKfet Wrapped of {note} sponsored by {bde}'.format(bde=str(self.bde),note=str(self.note)) + def makepublic(self): + self.public = not self.public + self.save() + return + + @property + def data(self): + return json.load(self.data_json) + + @data.setter + def data(self, data): + self.data_json = json.dumps(data, indent=2) diff --git a/apps/wrapped/tables.py b/apps/wrapped/tables.py new file mode 100644 index 00000000..4c3cc107 --- /dev/null +++ b/apps/wrapped/tables.py @@ -0,0 +1,72 @@ +# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.utils import timezone +from django.utils.html import escape +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ +from note_kfet.middlewares import get_current_request +import django_tables2 as tables +from django_tables2 import A +from permission.backends import PermissionBackend +from note.templatetags.pretty_money import pretty_money + +from .models import Wrapped, Bde + +class WrappedTable(tables.Table): + """ + List all wrapped + """ + class Meta: + attrs = { + 'class': 'table table-condensed table-striped table-hover', + 'id': 'wrapped_table' + } + row_attrs = { + 'class': lambda record: 'bg-danger' if not record.generated else '', + } + model = Wrapped + template_name = 'django_tables2/bootstrap4.html' + fields = ('note', 'bde', 'public', ) + + view = tables.LinkColumn( + 'wrapped:wrapped_detail', + args=[A('pk')], + + attrs={ + 'td': {'class': 'col-sm-2'}, + 'a': { + 'class': 'btn btn-sm btn-primary', + 'data-turbolinks': 'false', + } + }, + text=_('view the wrapped'), + accessor='pk', + verbose_name=_('View'), + orderable=False, + ) + + public = tables.Column( + accessor="pk", + orderable=False, + attrs={ + "td": { + "id": lambda record: "makepublic_"+ str(record.pk), + "class" : 'col-sm-1', + "data-toggle": "tooltip", + "title": lambda record: + (_("Click to make this wrapped private") if record.public else + _("Click to make this wrapped public")) if PermissionBackend.check_perm( + get_current_request(), "wrapped.change_wrapped_public", record) else None, + "onclick" : lambda record: + 'makepublic(' + str(record.id) + ', ' + str(not record.public).lower() + ')' + if PermissionBackend.check_perm(get_current_request(), "wrapped.change_wrapped_public", + record) else None + } + }, + ) + + def render_public(self, value, record): + val = "✔" if record.public else "✖" + return val + diff --git a/apps/wrapped/templates/wrapped/1/wrapped_view.html b/apps/wrapped/templates/wrapped/1/wrapped_view.html new file mode 100644 index 00000000..48ad8efe --- /dev/null +++ b/apps/wrapped/templates/wrapped/1/wrapped_view.html @@ -0,0 +1,8 @@ +{% comment %} +Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +SPDX-License-Identifier: GPL-3.0-or-later +{% endcomment %} +{% block content %} +{{ wrapped.data_json }} +{% endblock %} + diff --git a/apps/wrapped/templates/wrapped/wrapped_list.html b/apps/wrapped/templates/wrapped/wrapped_list.html new file mode 100644 index 00000000..fd6bcb7e --- /dev/null +++ b/apps/wrapped/templates/wrapped/wrapped_list.html @@ -0,0 +1,62 @@ +{% extends "base.html" %} +{% comment %} +SPDX-License-Identifier: GPL-3.0-or-later +{% endcomment %} +{% load render_table from django_tables2 %} +{% load i18n %} + +{% block content %} +
+
+
+
+
{{ title }}
+
+
+ {% render_table table %} +
+
+
+
+{% endblock %} + +{% block extrajavascript %} + +{% endblock %} diff --git a/apps/wrapped/urls.py b/apps/wrapped/urls.py new file mode 100644 index 00000000..dde4458b --- /dev/null +++ b/apps/wrapped/urls.py @@ -0,0 +1,13 @@ +# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.urls import path + +from . import views + +app_name = 'wrapped' + +urlpatterns = [ + path('', views.WrappedListView.as_view(), name='wrapped_list'), + path('/', views.WrappedDetailView.as_view(), name='wrapped_detail'), +] diff --git a/apps/wrapped/views.py b/apps/wrapped/views.py new file mode 100644 index 00000000..f6ec97c9 --- /dev/null +++ b/apps/wrapped/views.py @@ -0,0 +1,63 @@ +# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from hashlib import md5 + +from django.conf import settings +from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import PermissionDenied +from django.db import transaction +from django.db.models import F, Q +from django.http import HttpResponse +from django.urls import reverse_lazy +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.decorators.cache import cache_page +from django.views.generic import DetailView, TemplateView, UpdateView +from django.views.generic.list import ListView +from django_tables2.views import MultiTableMixin, SingleTableMixin, SingleTableView +from api.viewsets import is_regex +from note.models import Alias, NoteSpecial, NoteUser +from permission.backends import PermissionBackend +from permission.views import ProtectQuerysetMixin, ProtectedCreateView + +from .models import Wrapped +from .tables import WrappedTable + +class WrappedListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView): + """ + Display all Wrapped, and classify by year + """ + model = Wrapped + table_class = WrappedTable + template_name = 'wrapped/wrapped_list.html' + extra_context = {'title': _("List of wrapped")} + + def get_queryset(self, **kwargs): + return super().get_queryset(**kwargs).distinct() + + def get_table_data(self): + return Wrapped.objects.filter(PermissionBackend.filter_queryset( + self.request, Wrapped, "change", field='public')).distinct().order_by("-bde__date_start") + + def get_context_data(self, **kwargs): + return super().get_context_data(**kwargs) + +class WrappedDetailView(ProtectQuerysetMixin, DetailView): + """ + View a wrapped + """ + model = Wrapped + template_name = 'wrapped/0/wrapped_view.html' #by default + + def get(self, *args, **kwargs): + bde_id = Wrapped.objects.get(pk=kwargs['pk']).bde.id + self.template_name = 'wrapped/' + str(bde_id) + '/wrapped_view.html' + return super().get(*args, **kwargs) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + return context diff --git a/note_kfet/settings/base.py b/note_kfet/settings/base.py index 8378448d..113cf626 100644 --- a/note_kfet/settings/base.py +++ b/note_kfet/settings/base.py @@ -79,6 +79,7 @@ INSTALLED_APPS = [ 'scripts', 'treasury', 'wei', + 'wrapped', ] MIDDLEWARE = [ diff --git a/note_kfet/templates/base.html b/note_kfet/templates/base.html index a84f29b2..4f87228a 100644 --- a/note_kfet/templates/base.html +++ b/note_kfet/templates/base.html @@ -107,6 +107,12 @@ SPDX-License-Identifier: GPL-3.0-or-later {% url 'wei:current_wei_detail' as url %} {% trans 'WEI' %} + {% endif %} + {% if "wrapped.wrapped"|model_list_length >= 1 %} + {% endif %} {% if request.user.is_authenticated %}
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 2af3257e..44ac4a35 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-17 11:57+0200\n" +"POT-Creation-Date: 2025-02-25 13:47+0100\n" "PO-Revision-Date: 2022-04-11 22:05+0200\n" "Last-Translator: bleizi \n" "Language-Team: French \n" @@ -18,38 +18,43 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Poedit 3.0\n" -#: apps/activity/apps.py:10 apps/activity/models.py:127 -#: apps/activity/models.py:167 -#: apps/activity/models.py:323 +#: apps/activity/api/serializers.py:77 +#, fuzzy +#| msgid "This friendship already exists" +msgid "This opener already exists" +msgstr "Cette amitié existe déjà" + +#: apps/activity/apps.py:10 apps/activity/models.py:129 +#: apps/activity/models.py:169 apps/activity/models.py:323 msgid "activity" msgstr "activité" -#: apps/activity/forms.py:34 +#: apps/activity/forms.py:35 msgid "The note of this club is inactive." msgstr "La note du club est inactive." -#: apps/activity/forms.py:41 apps/activity/models.py:142 +#: apps/activity/forms.py:42 apps/activity/models.py:142 msgid "The end date must be after the start date." msgstr "La date de fin doit être après celle de début." -#: apps/activity/forms.py:82 apps/activity/models.py:271 +#: apps/activity/forms.py:83 apps/activity/models.py:271 msgid "You can't invite someone once the activity is started." msgstr "" "Vous ne pouvez pas inviter quelqu'un une fois que l'activité a démarré." -#: apps/activity/forms.py:85 apps/activity/models.py:274 +#: apps/activity/forms.py:86 apps/activity/models.py:274 msgid "This activity is not validated yet." msgstr "Cette activité n'est pas encore validée." -#: apps/activity/forms.py:95 apps/activity/models.py:282 +#: apps/activity/forms.py:96 apps/activity/models.py:282 msgid "This person has been already invited 5 times this year." msgstr "Cette personne a déjà été invitée 5 fois cette année." -#: apps/activity/forms.py:99 apps/activity/models.py:286 +#: apps/activity/forms.py:100 apps/activity/models.py:286 msgid "This person is already invited." msgstr "Cette personne est déjà invitée." -#: apps/activity/forms.py:103 apps/activity/models.py:290 +#: apps/activity/forms.py:104 apps/activity/models.py:290 msgid "You can't invite more than 3 people to this activity." msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité." @@ -63,7 +68,7 @@ msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité." #: apps/registration/templates/registration/future_profile_detail.html:16 #: apps/wei/models.py:67 apps/wei/models.py:131 apps/wei/tables.py:282 #: apps/wei/templates/wei/base.html:26 -#: apps/wei/templates/wei/weimembership_form.html:14 +#: apps/wei/templates/wei/weimembership_form.html:14 apps/wrapped/models.py:16 msgid "name" msgstr "nom" @@ -115,7 +120,7 @@ msgstr "Lieu où l'activité est organisée, par exemple la Kfet." msgid "type" msgstr "type" -#: apps/activity/models.py:91 apps/logs/models.py:22 apps/member/models.py:318 +#: apps/activity/models.py:91 apps/logs/models.py:22 apps/member/models.py:325 #: apps/note/models/notes.py:148 apps/treasury/models.py:293 #: apps/wei/models.py:171 apps/wei/templates/wei/attribute_bus_1A.html:13 #: apps/wei/templates/wei/survey.html:15 @@ -172,7 +177,7 @@ msgid "entry time" msgstr "heure d'entrée" #: apps/activity/models.py:180 apps/note/apps.py:14 -#: apps/note/models/notes.py:77 +#: apps/note/models/notes.py:77 apps/wrapped/models.py:60 msgid "note" msgstr "note" @@ -200,7 +205,7 @@ msgstr "Entrée de la note {note} pour l'activité « {activity} »" msgid "Already entered on " msgstr "Déjà rentré·e le " -#: apps/activity/models.py:204 apps/activity/tables.py:56 +#: apps/activity/models.py:204 apps/activity/tables.py:58 msgid "{:%Y-%m-%d %H:%M:%S}" msgstr "{:%d/%m/%Y %H:%M:%S}" @@ -239,68 +244,96 @@ msgstr "invité·e·s" msgid "Invitation" msgstr "Invitation" -#: apps/activity/models.py:330 -#: apps/activity/models.py:334 +#: apps/activity/models.py:330 apps/activity/models.py:334 msgid "Opener" msgstr "Ouvreur⋅se" #: apps/activity/models.py:335 -#: apps/activity/templates/activity_detail.html:16 +#: apps/activity/templates/activity/activity_detail.html:16 msgid "Openers" msgstr "Ouvreur⋅ses" -#: apps/activity/tables.py:27 +#: apps/activity/models.py:339 +#, fuzzy, python-brace-format +#| msgid "Entry for {note} to the activity {activity}" +msgid "{opener} is opener of activity {acivity}" +msgstr "Entrée de la note {note} pour l'activité « {activity} »" + +#: apps/activity/tables.py:29 msgid "The activity is currently open." msgstr "Cette activité est actuellement ouverte." -#: apps/activity/tables.py:28 +#: apps/activity/tables.py:30 msgid "The validation of the activity is pending." msgstr "La validation de cette activité est en attente." -#: apps/activity/tables.py:43 +#: apps/activity/tables.py:45 #: apps/member/templates/member/picture_update.html:18 -#: apps/treasury/tables.py:107 +#: apps/treasury/tables.py:110 msgid "Remove" msgstr "Supprimer" -#: apps/activity/tables.py:56 +#: apps/activity/tables.py:58 msgid "Entered on " msgstr "Entré·e le " -#: apps/activity/tables.py:58 +#: apps/activity/tables.py:60 msgid "remove" msgstr "supprimer" -#: apps/activity/tables.py:82 apps/note/forms.py:68 apps/treasury/models.py:208 +#: apps/activity/tables.py:84 apps/note/forms.py:69 apps/treasury/models.py:208 msgid "Type" msgstr "Type" -#: apps/activity/tables.py:84 apps/member/forms.py:196 +#: apps/activity/tables.py:86 apps/member/forms.py:199 #: apps/registration/forms.py:91 apps/treasury/forms.py:131 -#: apps/wei/forms/registration.py:104 +#: apps/wei/forms/registration.py:110 msgid "Last name" msgstr "Nom de famille" -#: apps/activity/tables.py:86 apps/member/forms.py:201 +#: apps/activity/tables.py:88 apps/member/forms.py:204 #: apps/note/templates/note/transaction_form.html:138 #: apps/registration/forms.py:96 apps/treasury/forms.py:133 -#: apps/wei/forms/registration.py:109 +#: apps/wei/forms/registration.py:115 msgid "First name" msgstr "Prénom" -#: apps/activity/tables.py:88 apps/note/models/notes.py:86 +#: apps/activity/tables.py:90 apps/note/models/notes.py:86 msgid "Note" msgstr "Note" -#: apps/activity/tables.py:90 apps/member/tables.py:50 +#: apps/activity/tables.py:92 apps/member/tables.py:50 msgid "Balance" msgstr "Solde du compte" -#: apps/activity/templates/activity/activity_detail.html:15 +#: apps/activity/tables.py:141 apps/activity/tables.py:148 +#: apps/note/tables.py:166 apps/note/tables.py:173 apps/note/tables.py:234 +#: apps/note/tables.py:281 apps/treasury/tables.py:39 +#: apps/treasury/templates/treasury/invoice_confirm_delete.html:30 +#: apps/treasury/templates/treasury/sogecredit_detail.html:65 +#: apps/wei/tables.py:75 apps/wei/tables.py:118 +#: apps/wei/templates/wei/weiregistration_confirm_delete.html:31 +#: note_kfet/templates/oauth2_provider/application_confirm_delete.html:18 +#: note_kfet/templates/oauth2_provider/application_detail.html:39 +#: note_kfet/templates/oauth2_provider/authorized-token-delete.html:12 +msgid "Delete" +msgstr "Supprimer" + +#: apps/activity/templates/activity/activity_detail.html:24 +#: apps/member/templates/member/club_alias.html:20 +#: apps/member/templates/member/profile_alias.html:19 +#: apps/member/templates/member/profile_trust.html:19 +#: apps/treasury/tables.py:101 +#: apps/treasury/templates/treasury/sogecredit_list.html:34 +#: apps/treasury/templates/treasury/sogecredit_list.html:73 +msgid "Add" +msgstr "Ajouter" + +#: apps/activity/templates/activity/activity_detail.html:35 msgid "Guests list" msgstr "Liste des invité·e·s" -#: apps/activity/templates/activity/activity_detail.html:33 +#: apps/activity/templates/activity/activity_detail.html:55 msgid "Guest deleted" msgstr "Invité·e supprimé·e" @@ -347,7 +380,7 @@ msgstr "Entrée effectuée !" #: apps/activity/templates/activity/activity_form.html:16 #: apps/food/templates/food/add_ingredient_form.html:16 #: apps/food/templates/food/basicfood_form.html:16 -#: apps/food/templates/food/create_qrcode_form.html:19 +#: apps/food/templates/food/create_qrcode_form.html:20 #: apps/food/templates/food/transformedfood_form.html:16 #: apps/member/templates/member/add_members.html:46 #: apps/member/templates/member/club_form.html:16 @@ -414,41 +447,41 @@ msgstr "modifier" msgid "Invite" msgstr "Inviter" -#: apps/activity/views.py:37 +#: apps/activity/views.py:38 msgid "Create new activity" msgstr "Créer une nouvelle activité" -#: apps/activity/views.py:67 note_kfet/templates/base.html:96 +#: apps/activity/views.py:71 note_kfet/templates/base.html:96 msgid "Activities" msgstr "Activités" -#: apps/activity/views.py:108 +#: apps/activity/views.py:105 msgid "Activity detail" msgstr "Détails de l'activité" -#: apps/activity/views.py:128 +#: apps/activity/views.py:150 msgid "Update activity" msgstr "Modifier l'activité" -#: apps/activity/views.py:155 +#: apps/activity/views.py:177 msgid "Invite guest to the activity \"{}\"" msgstr "Invitation pour l'activité « {} »" -#: apps/activity/views.py:193 +#: apps/activity/views.py:217 msgid "You are not allowed to display the entry interface for this activity." msgstr "" "Vous n'êtes pas autorisé·e à afficher l'interface des entrées pour cette " "activité." -#: apps/activity/views.py:196 +#: apps/activity/views.py:220 msgid "This activity does not support activity entries." msgstr "Cette activité ne requiert pas d'entrées." -#: apps/activity/views.py:199 +#: apps/activity/views.py:223 msgid "This activity is closed." msgstr "Cette activité est fermée." -#: apps/activity/views.py:295 +#: apps/activity/views.py:328 msgid "Entry for activity \"{}\"" msgstr "Entrées pour l'activité « {} »" @@ -468,7 +501,7 @@ msgstr "Entièrement utilisé" msgid "Pasta METRO 5kg" msgstr "Pâtes METRO 5kg" -#: apps/food/forms.py:96 +#: apps/food/forms.py:100 msgid "Lasagna" msgstr "Lasagnes" @@ -554,7 +587,7 @@ msgstr "ingrédients tranformées" msgid "shelf life" msgstr "durée de vie" -#: apps/food/models.py:225 apps/food/views.py:365 +#: apps/food/models.py:225 apps/food/views.py:375 msgid "Transformed food" msgstr "Aliment transformé" @@ -562,20 +595,20 @@ msgstr "Aliment transformé" msgid "Transformed foods" msgstr "Aliments transformés" -#: apps/food/templates/food/create_qrcode_form.html:31 #: apps/food/templates/food/basicfood_detail.html:14 +#: apps/food/templates/food/create_qrcode_form.html:31 #: apps/food/templates/food/qrcode_detail.html:15 #: apps/food/templates/food/transformedfood_detail.html:14 msgid "Owner" msgstr "Propriétaire" -#: apps/food/templates/food/create_qrcode_form.html:34 #: apps/food/templates/food/basicfood_detail.html:15 +#: apps/food/templates/food/create_qrcode_form.html:34 msgid "Arrival date" msgstr "Date d'arrivée" -#: apps/food/templates/food/create_qrcode_form.html:37 #: apps/food/templates/food/basicfood_detail.html:16 +#: apps/food/templates/food/create_qrcode_form.html:37 #: apps/food/templates/food/qrcode_detail.html:16 #: apps/food/templates/food/transformedfood_detail.html:19 msgid "Expiry date" @@ -604,7 +637,7 @@ msgstr "Modifier" msgid "Add to a meal" msgstr "Ajouter à un plat" -#: apps/food/templates/food/create_qrcode_form.html:14 +#: apps/food/templates/food/create_qrcode_form.html:15 msgid "New basic food" msgstr "Nouvel aliment basique" @@ -612,10 +645,6 @@ msgstr "Nouvel aliment basique" msgid "Copy constructor" msgstr "Constructeur de copie" -#: apps/food/templates/food/qrcode_detail.html:10 -msgid "number" -msgstr "numéro" - #: apps/food/templates/food/create_qrcode_form.html:28 #: apps/food/templates/food/qrcode_detail.html:14 #: apps/note/templates/note/transaction_form.html:132 @@ -623,6 +652,10 @@ msgstr "numéro" msgid "Name" msgstr "Nom" +#: apps/food/templates/food/qrcode_detail.html:10 +msgid "number" +msgstr "numéro" + #: apps/food/templates/food/qrcode_detail.html:29 msgid "View details" msgstr "Voir plus" @@ -692,19 +725,19 @@ msgstr "Détails de:" msgid "Add a new basic food with QRCode" msgstr "Ajouter un nouvel ingrédient avec un QR-code" -#: apps/food/views.py:185 +#: apps/food/views.py:194 msgid "Add a new QRCode" msgstr "Ajouter un nouveau QR-code" -#: apps/food/views.py:235 +#: apps/food/views.py:245 msgid "QRCode" msgstr "QR-code" -#: apps/food/views.py:271 +#: apps/food/views.py:281 msgid "Add a new meal" msgstr "Ajouter un nouveau plat" -#: apps/food/views.py:337 +#: apps/food/views.py:347 msgid "Update a meal" msgstr "Modifier le plat" @@ -736,7 +769,7 @@ msgstr "nouvelles données" msgid "create" msgstr "créer" -#: apps/logs/models.py:65 apps/note/tables.py:230 apps/note/tables.py:277 +#: apps/logs/models.py:65 apps/note/tables.py:230 apps/note/tables.py:279 #: apps/permission/models.py:126 apps/treasury/tables.py:38 #: apps/wei/tables.py:74 msgid "delete" @@ -777,11 +810,11 @@ msgstr "cotisation pour adhérer (normalien·ne élève)" msgid "membership fee (unpaid students)" msgstr "cotisation pour adhérer (normalien·ne étudiant·e)" -#: apps/member/admin.py:65 apps/member/models.py:330 +#: apps/member/admin.py:65 apps/member/models.py:337 msgid "roles" msgstr "rôles" -#: apps/member/admin.py:66 apps/member/models.py:344 +#: apps/member/admin.py:66 apps/member/models.py:351 msgid "fee" msgstr "cotisation" @@ -789,24 +822,24 @@ msgstr "cotisation" msgid "member" msgstr "adhérent·e" -#: apps/member/forms.py:24 +#: apps/member/forms.py:25 msgid "Permission mask" msgstr "Masque de permissions" -#: apps/member/forms.py:46 +#: apps/member/forms.py:48 msgid "Report frequency" msgstr "Fréquence des rapports (en jours)" -#: apps/member/forms.py:48 +#: apps/member/forms.py:50 msgid "Last report date" msgstr "Date de dernier rapport" -#: apps/member/forms.py:52 +#: apps/member/forms.py:54 msgid "" "Anti-VSS (Violences Sexistes et Sexuelles) charter read and approved" msgstr "Charte Anti-VSS (Violences Sexistes et Sexuelles) lue et approuvée" -#: apps/member/forms.py:53 +#: apps/member/forms.py:55 msgid "" "Tick after having read and accepted the anti-VSS charter " @@ -816,65 +849,65 @@ msgstr "" "crans.org/club-bde/Charte-anti-VSS.pdf target=_blank> disponible en pdf ici" -#: apps/member/forms.py:60 +#: apps/member/forms.py:62 msgid "You can't register to the note if you come from the future." msgstr "Vous ne pouvez pas vous inscrire à la note si vous venez du futur." -#: apps/member/forms.py:86 +#: apps/member/forms.py:89 msgid "select an image" msgstr "choisissez une image" -#: apps/member/forms.py:87 +#: apps/member/forms.py:90 msgid "Maximal size: 2MB" msgstr "Taille maximale : 2 Mo" -#: apps/member/forms.py:112 +#: apps/member/forms.py:115 msgid "This image cannot be loaded." msgstr "Cette image ne peut pas être chargée." -#: apps/member/forms.py:151 apps/member/views.py:102 -#: apps/registration/forms.py:33 apps/registration/views.py:276 +#: apps/member/forms.py:154 apps/member/views.py:103 +#: apps/registration/forms.py:33 apps/registration/views.py:282 msgid "An alias with a similar name already exists." msgstr "Un alias avec un nom similaire existe déjà." -#: apps/member/forms.py:175 +#: apps/member/forms.py:178 msgid "Inscription paid by Société Générale" msgstr "Inscription payée par la Société générale" -#: apps/member/forms.py:177 +#: apps/member/forms.py:180 msgid "Check this case if the Société Générale paid the inscription." msgstr "Cochez cette case si la Société Générale a payé l'inscription." -#: apps/member/forms.py:182 apps/registration/forms.py:78 -#: apps/wei/forms/registration.py:91 +#: apps/member/forms.py:185 apps/registration/forms.py:78 +#: apps/wei/forms/registration.py:97 msgid "Credit type" msgstr "Type de rechargement" -#: apps/member/forms.py:183 apps/registration/forms.py:79 -#: apps/wei/forms/registration.py:92 +#: apps/member/forms.py:186 apps/registration/forms.py:79 +#: apps/wei/forms/registration.py:98 msgid "No credit" msgstr "Pas de rechargement" -#: apps/member/forms.py:185 +#: apps/member/forms.py:188 msgid "You can credit the note of the user." msgstr "Vous pouvez créditer la note de l'utilisateur⋅rice avant l'adhésion." -#: apps/member/forms.py:189 apps/registration/forms.py:84 -#: apps/wei/forms/registration.py:97 +#: apps/member/forms.py:192 apps/registration/forms.py:84 +#: apps/wei/forms/registration.py:103 msgid "Credit amount" msgstr "Montant à créditer" -#: apps/member/forms.py:206 apps/note/templates/note/transaction_form.html:144 +#: apps/member/forms.py:209 apps/note/templates/note/transaction_form.html:144 #: apps/registration/forms.py:101 apps/treasury/forms.py:135 -#: apps/wei/forms/registration.py:114 +#: apps/wei/forms/registration.py:120 msgid "Bank" msgstr "Banque" -#: apps/member/forms.py:233 +#: apps/member/forms.py:236 msgid "User" msgstr "Utilisateur⋅rice" -#: apps/member/forms.py:247 +#: apps/member/forms.py:250 msgid "Roles" msgstr "Rôles" @@ -1007,7 +1040,7 @@ msgstr "payé⋅e" msgid "Tells if the user receive a salary." msgstr "Indique si l'utilisateur⋅rice perçoit un salaire." -#: apps/member/models.py:99 apps/treasury/tables.py:143 +#: apps/member/models.py:99 apps/treasury/tables.py:149 msgid "No" msgstr "Non" @@ -1126,7 +1159,7 @@ msgstr "" msgid "add to registration form" msgstr "ajouter au formulaire d'inscription" -#: apps/member/models.py:268 apps/member/models.py:324 +#: apps/member/models.py:268 apps/member/models.py:331 #: apps/note/models/notes.py:176 msgid "club" msgstr "club" @@ -1135,37 +1168,37 @@ msgstr "club" msgid "clubs" msgstr "clubs" -#: apps/member/models.py:335 +#: apps/member/models.py:342 msgid "membership starts on" msgstr "l'adhésion commence le" -#: apps/member/models.py:339 +#: apps/member/models.py:346 msgid "membership ends on" msgstr "l'adhésion finit le" -#: apps/member/models.py:348 apps/note/models/transactions.py:385 +#: apps/member/models.py:355 apps/note/models/transactions.py:385 msgid "membership" msgstr "adhésion" -#: apps/member/models.py:349 +#: apps/member/models.py:356 msgid "memberships" msgstr "adhésions" -#: apps/member/models.py:353 +#: apps/member/models.py:360 #, python-brace-format msgid "Membership of {user} for the club {club}" msgstr "Adhésion de {user} pour le club {club}" -#: apps/member/models.py:372 +#: apps/member/models.py:379 #, python-brace-format msgid "The role {role} does not apply to the club {club}." msgstr "Le rôle {role} ne s'applique pas au club {club}." -#: apps/member/models.py:381 apps/member/views.py:715 +#: apps/member/models.py:388 apps/member/views.py:745 msgid "User is already a member of the club" msgstr "L'utilisateur·rice est déjà membre du club" -#: apps/member/models.py:393 apps/member/views.py:724 +#: apps/member/models.py:400 apps/member/views.py:754 msgid "User is not a member of the parent club" msgstr "L'utilisateur·rice n'est pas membre du club parent" @@ -1180,8 +1213,8 @@ msgid "" "%(pretty_fee)s will be charged to renew automatically the membership in this/" "these club·s." msgstr "" -"Cet·te utilisateur·rice n'est pas membre du/des club·s parent·s %(clubs)s. Un " -"montant supplémentaire de %(pretty_fee)s sera débité afin de renouveler " +"Cet·te utilisateur·rice n'est pas membre du/des club·s parent·s %(clubs)s. " +"Un montant supplémentaire de %(pretty_fee)s sera débité afin de renouveler " "automatiquement l'adhésion dans ce·s club·s." #: apps/member/templates/member/add_members.html:22 @@ -1208,8 +1241,9 @@ msgid "" "This club has parents %(clubs)s. Please make sure that the user is a member " "of this or these club·s, otherwise the creation of this membership will fail." msgstr "" -"Ce club a pour parents %(clubs)s. Merci de vous assurer que l'utilisateur⋅rice " -"est membre de ce·s club·s, sinon la création de cette adhésion va échouer." +"Ce club a pour parents %(clubs)s. Merci de vous assurer que " +"l'utilisateur⋅rice est membre de ce·s club·s, sinon la création de cette " +"adhésion va échouer." #: apps/member/templates/member/base.html:17 #: apps/registration/templates/registration/future_profile_detail.html:12 @@ -1217,7 +1251,7 @@ msgid "Account #" msgstr "Compte n°" #: apps/member/templates/member/base.html:48 -#: apps/member/templates/member/base.html:62 apps/member/views.py:59 +#: apps/member/templates/member/base.html:62 apps/member/views.py:60 #: apps/registration/templates/registration/future_profile_detail.html:48 #: apps/wei/templates/wei/weimembership_form.html:117 msgid "Update Profile" @@ -1278,20 +1312,11 @@ msgstr "" "seront à nouveau possible." #: apps/member/templates/member/club_alias.html:10 -#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:287 -#: apps/member/views.py:520 +#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:304 +#: apps/member/views.py:545 msgid "Note aliases" msgstr "Alias de la note" -#: apps/member/templates/member/club_alias.html:20 -#: apps/member/templates/member/profile_alias.html:19 -#: apps/member/templates/member/profile_trust.html:19 -#: apps/treasury/tables.py:99 -#: apps/treasury/templates/treasury/sogecredit_list.html:34 -#: apps/treasury/templates/treasury/sogecredit_list.html:73 -msgid "Add" -msgstr "Ajouter" - #: apps/member/templates/member/club_detail.html:13 #: apps/permission/templates/permission/all_rights.html:32 msgid "Club managers" @@ -1480,51 +1505,51 @@ msgstr "Sauvegarder les changements" msgid "Registrations" msgstr "Inscriptions" -#: apps/member/views.py:72 apps/registration/forms.py:23 +#: apps/member/views.py:73 apps/registration/forms.py:23 msgid "This address must be valid." msgstr "Cette adresse doit être valide." -#: apps/member/views.py:139 +#: apps/member/views.py:140 msgid "Profile detail" msgstr "Détails de l'utilisateur⋅rice" -#: apps/member/views.py:205 +#: apps/member/views.py:206 msgid "Search user" msgstr "Chercher un·e utilisateur·rice" -#: apps/member/views.py:253 +#: apps/member/views.py:258 msgid "Note friendships" msgstr "Amitiés note" -#: apps/member/views.py:308 +#: apps/member/views.py:328 msgid "Update note picture" msgstr "Modifier la photo de la note" -#: apps/member/views.py:357 +#: apps/member/views.py:377 msgid "Manage auth token" msgstr "Gérer les jetons d'authentification" -#: apps/member/views.py:384 +#: apps/member/views.py:404 msgid "Create new club" msgstr "Créer un nouveau club" -#: apps/member/views.py:403 +#: apps/member/views.py:423 msgid "Search club" msgstr "Chercher un club" -#: apps/member/views.py:436 +#: apps/member/views.py:461 msgid "Club detail" msgstr "Détails du club" -#: apps/member/views.py:543 +#: apps/member/views.py:573 msgid "Update club" msgstr "Modifier le club" -#: apps/member/views.py:577 +#: apps/member/views.py:607 msgid "Add new member to the club" msgstr "Ajouter un·e nouvelleau membre au club" -#: apps/member/views.py:706 apps/wei/views.py:973 +#: apps/member/views.py:736 apps/wei/views.py:991 msgid "" "This user don't have enough money to join this club, and can't have a " "negative balance." @@ -1532,19 +1557,19 @@ msgstr "" "Cet⋅te utilisateur⋅rice n'a pas assez d'argent pour rejoindre ce club et ne " "peut pas avoir un solde négatif." -#: apps/member/views.py:728 +#: apps/member/views.py:758 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:733 +#: apps/member/views.py:763 msgid "The membership must begin before {:%m-%d-%Y}." msgstr "L'adhésion doit commencer avant le {:%d/%m/%Y}." -#: apps/member/views.py:883 +#: apps/member/views.py:913 msgid "Manage roles of an user in the club" msgstr "Gérer les rôles d'un⋅e utilisateur⋅rice dans le club" -#: apps/member/views.py:908 +#: apps/member/views.py:938 msgid "Members of the club" msgstr "Membres du club" @@ -1575,35 +1600,35 @@ msgstr "" "La transaction ne peut pas être sauvegardée puisque la note source ou la " "note de destination n'est pas active." -#: apps/note/forms.py:39 +#: apps/note/forms.py:40 msgid "Source" msgstr "Source" -#: apps/note/forms.py:53 +#: apps/note/forms.py:54 msgid "Destination" msgstr "Destination" -#: apps/note/forms.py:74 apps/note/templates/note/transaction_form.html:123 +#: apps/note/forms.py:75 apps/note/templates/note/transaction_form.html:123 msgid "Reason" msgstr "Raison" -#: apps/note/forms.py:79 apps/treasury/tables.py:136 +#: apps/note/forms.py:80 apps/treasury/tables.py:141 msgid "Valid" msgstr "Valide" -#: apps/note/forms.py:85 +#: apps/note/forms.py:86 msgid "Total amount greater than" msgstr "Montant total supérieur à" -#: apps/note/forms.py:93 +#: apps/note/forms.py:94 msgid "Total amount less than" msgstr "Montant total inférieur à" -#: apps/note/forms.py:99 +#: apps/note/forms.py:100 msgid "Created after" msgstr "Créé après" -#: apps/note/forms.py:106 +#: apps/note/forms.py:107 msgid "Created before" msgstr "Créé avant" @@ -1656,7 +1681,6 @@ msgstr "" "La note est bloquée de force par le BDE et ne peut pas être débloquée par læ " "propriétaire de la note." - #: apps/note/models/notes.py:78 msgid "notes" msgstr "notes" @@ -1708,7 +1732,9 @@ msgid "trusted" msgstr "ami·e" #: apps/note/models/notes.py:243 -msgid "friendship" +#, fuzzy +#| msgid "friendship" +msgid "frienship" msgstr "amitié" #: apps/note/models/notes.py:248 @@ -1860,8 +1886,8 @@ msgstr "" "mode de paiement et un⋅e utilisateur⋅rice ou un club" #: apps/note/models/transactions.py:357 apps/note/models/transactions.py:360 -#: apps/note/models/transactions.py:363 apps/wei/views.py:978 -#: apps/wei/views.py:982 +#: apps/note/models/transactions.py:363 apps/wei/views.py:996 +#: apps/wei/views.py:1000 msgid "This field is required." msgstr "Ce champ est requis." @@ -1885,18 +1911,6 @@ msgstr "Cliquez pour valider" msgid "No reason specified" msgstr "Pas de motif spécifié" -#: apps/note/tables.py:166 apps/note/tables.py:173 apps/note/tables.py:234 -#: apps/note/tables.py:279 apps/treasury/tables.py:39 -#: apps/treasury/templates/treasury/invoice_confirm_delete.html:30 -#: apps/treasury/templates/treasury/sogecredit_detail.html:65 -#: apps/wei/tables.py:75 apps/wei/tables.py:118 -#: apps/wei/templates/wei/weiregistration_confirm_delete.html:31 -#: note_kfet/templates/oauth2_provider/application_confirm_delete.html:18 -#: note_kfet/templates/oauth2_provider/application_detail.html:39 -#: note_kfet/templates/oauth2_provider/authorized-token-delete.html:12 -msgid "Delete" -msgstr "Supprimer" - #: apps/note/tables.py:191 msgid "Trust back" msgstr "Ajouter en ami·e" @@ -1915,7 +1929,7 @@ msgstr "Ajouter" msgid "Edit" msgstr "Éditer" -#: apps/note/tables.py:266 apps/note/tables.py:293 +#: apps/note/tables.py:267 apps/note/tables.py:296 msgid "Hide/Show" msgstr "Afficher/Masquer" @@ -1975,6 +1989,10 @@ msgstr "Historique des transactions récentes" #: apps/note/templates/note/mails/weekly_report.txt:32 #: apps/registration/templates/registration/mails/email_validation_email.html:40 #: apps/registration/templates/registration/mails/email_validation_email.txt:16 +#: apps/scripts/templates/scripts/horaires.html:35 +#: apps/scripts/templates/scripts/horaires.txt:17 +#: apps/scripts/templates/scripts/intro_mail.html:49 +#: apps/scripts/templates/scripts/intro_mail.txt:25 msgid "Mail generated by the Note Kfet on the" msgstr "Mail généré par la Note Kfet le" @@ -1997,8 +2015,8 @@ msgid "Action" msgstr "Action" #: apps/note/templates/note/transaction_form.html:116 -#: apps/treasury/forms.py:137 apps/treasury/tables.py:67 -#: apps/treasury/tables.py:132 +#: apps/treasury/forms.py:137 apps/treasury/tables.py:68 +#: apps/treasury/tables.py:136 #: apps/treasury/templates/treasury/remittance_form.html:23 msgid "Amount" msgstr "Montant" @@ -2040,15 +2058,21 @@ msgid "New button" msgstr "Nouveau bouton" #: apps/note/templates/note/transactiontemplate_list.html:22 -msgid "buttons listing" +#, fuzzy +#| msgid "buttons listing" +msgid "buttons listing " msgstr "liste des boutons" #: apps/note/templates/note/transactiontemplate_list.html:73 -msgid "button successfully deleted" +#, fuzzy +#| msgid "button successfully deleted" +msgid "button successfully deleted " msgstr "le bouton a bien été supprimé" #: apps/note/templates/note/transactiontemplate_list.html:77 -msgid "Unable to delete button" +#, fuzzy +#| msgid "Unable to delete button" +msgid "Unable to delete button " msgstr "Impossible de supprimer le bouton" #: apps/note/templates/note/transactiontemplate_list.html:95 @@ -2060,34 +2084,35 @@ msgid "Button displayed" msgstr "Bouton affiché" #: apps/note/templates/note/transactiontemplate_list.html:100 +#: apps/wrapped/templates/wrapped/wrapped_list.html:63 msgid "An error occured" msgstr "Une erreur s'est produite" -#: apps/note/views.py:36 +#: apps/note/views.py:37 msgid "Transfer money" msgstr "Transférer de l'argent" -#: apps/note/views.py:74 +#: apps/note/views.py:75 msgid "Create new button" msgstr "Créer un nouveau bouton" -#: apps/note/views.py:83 +#: apps/note/views.py:84 msgid "Search button" msgstr "Chercher un bouton" -#: apps/note/views.py:111 +#: apps/note/views.py:116 msgid "Update button" msgstr "Modifier le bouton" -#: apps/note/views.py:151 note_kfet/templates/base.html:66 +#: apps/note/views.py:156 note_kfet/templates/base.html:66 msgid "Consumptions" msgstr "Consommations" -#: apps/note/views.py:165 +#: apps/note/views.py:170 msgid "You can't see any button." msgstr "Vous ne pouvez pas voir le moindre bouton." -#: apps/note/views.py:204 +#: apps/note/views.py:209 msgid "Search transactions" msgstr "Rechercher des transactions" @@ -2181,7 +2206,7 @@ msgstr "" "Vous n'avez pas la permission de modifier le champ {field} sur l'instance du " "modèle {app_label}.{model_name}." -#: apps/permission/signals.py:83 apps/permission/views.py:105 +#: apps/permission/signals.py:83 apps/permission/views.py:104 #, python-brace-format msgid "" "You don't have the permission to add an instance of model {app_label}." @@ -2206,7 +2231,8 @@ msgstr "Liste des utilisateur·rice·s ayant des droits surnormaux" #: apps/permission/templates/permission/all_rights.html:16 msgid "Superusers have all rights on everything, to manage the website." msgstr "" -"Les super-utilisateur·rice·s ont tous les droits sur tout, afin de gérer le site." +"Les super-utilisateur·rice·s ont tous les droits sur tout, afin de gérer le " +"site." #: apps/permission/templates/permission/all_rights.html:21 msgid "Superusers" @@ -2259,7 +2285,7 @@ msgstr "Cliquez ici" msgid "if you want to register a new one" msgstr "si vous voulez en enregistrer une nouvelle" -#: apps/permission/views.py:72 +#: apps/permission/views.py:71 #, python-brace-format msgid "" "You don't have the permission to update this instance of the model " @@ -2268,7 +2294,7 @@ msgstr "" "Vous n'avez pas la permission de modifier cette instance du modèle « {model} " "» avec ces paramètres. Merci de les corriger et de réessayer." -#: apps/permission/views.py:76 +#: apps/permission/views.py:75 #, python-brace-format msgid "" "You don't have the permission to create an instance of the model \"{model}\" " @@ -2277,11 +2303,11 @@ msgstr "" "Vous n'avez pas la permission d'ajouter une instance du modèle « {model} » " "avec ces paramètres. Merci de les corriger et de réessayer." -#: apps/permission/views.py:112 note_kfet/templates/base.html:114 +#: apps/permission/views.py:111 note_kfet/templates/base.html:120 msgid "Rights" msgstr "Droits" -#: apps/permission/views.py:117 +#: apps/permission/views.py:137 msgid "All rights" msgstr "Tous les droits" @@ -2365,7 +2391,8 @@ msgstr "Valider le compte" #: apps/registration/templates/registration/future_profile_detail.html:63 msgid "" "The user declared that he/she opened a bank account in the Société générale." -msgstr "L'utilisateur·rice a déclaré avoir ouvert un compte à la société générale." +msgstr "" +"L'utilisateur·rice a déclaré avoir ouvert un compte à la société générale." #: apps/registration/templates/registration/future_profile_detail.html:73 #: apps/wei/templates/wei/weimembership_form.html:127 @@ -2417,59 +2444,67 @@ msgstr "Merci" msgid "The Note Kfet team." msgstr "L'équipe de la Note Kfet." -#: apps/registration/views.py:42 +#: apps/registration/views.py:43 msgid "Register new user" msgstr "Enregistrer un⋅e nouvel⋅le utilisateur⋅rice" -#: apps/registration/views.py:100 +#: apps/registration/views.py:101 msgid "Email validation" msgstr "Validation de l'adresse e-mail" -#: apps/registration/views.py:102 +#: apps/registration/views.py:103 msgid "Validate email" msgstr "Valider l'adresse e-mail" -#: apps/registration/views.py:146 +#: apps/registration/views.py:147 msgid "Email validation unsuccessful" msgstr "La validation de l'adresse e-mail a échoué" -#: apps/registration/views.py:157 +#: apps/registration/views.py:158 msgid "Email validation email sent" msgstr "L'e-mail de vérification de l'adresse e-mail a bien été envoyé" -#: apps/registration/views.py:165 +#: apps/registration/views.py:166 msgid "Resend email validation link" msgstr "Renvoyer le lien de validation" -#: apps/registration/views.py:183 +#: apps/registration/views.py:184 msgid "Pre-registered users list" msgstr "Liste des utilisateur⋅rices en attente d'inscription" -#: apps/registration/views.py:207 +#: apps/registration/views.py:213 msgid "Unregistered users" msgstr "Utilisateur·rices en attente d'inscription" -#: apps/registration/views.py:220 +#: apps/registration/views.py:226 msgid "Registration detail" msgstr "Détails de l'inscription" -#: apps/registration/views.py:256 +#: apps/registration/views.py:262 #, python-format msgid "Join %(club)s Club" msgstr "Adhérer au club %(club)s" -#: apps/registration/views.py:299 -msgid "You must join the BDE." +#: apps/registration/views.py:305 +#, fuzzy +#| msgid "You must join the BDE." +msgid "You must join a club." msgstr "Vous devez adhérer au BDE." -#: apps/registration/views.py:330 +#: apps/registration/views.py:309 +#, fuzzy +#| msgid "You must join the BDE." +msgid "You must also join the parent club BDE." +msgstr "Vous devez adhérer au BDE." + +#: apps/registration/views.py:340 msgid "" "The entered amount is not enough for the memberships, should be at least {}" msgstr "" "Le montant crédité est trop faible pour adhérer, il doit être au minimum de " "{}" -#: apps/registration/views.py:425 +#: apps/registration/views.py:435 msgid "Invalidate pre-registration" msgstr "Invalider l'inscription" @@ -2491,7 +2526,7 @@ msgid "You can't change the type of the remittance." msgstr "Vous ne pouvez pas changer le type de la remise." #: apps/treasury/forms.py:125 apps/treasury/models.py:275 -#: apps/treasury/tables.py:97 apps/treasury/tables.py:105 +#: apps/treasury/tables.py:99 apps/treasury/tables.py:108 #: apps/treasury/templates/treasury/invoice_list.html:16 #: apps/treasury/templates/treasury/remittance_list.html:16 #: apps/treasury/templates/treasury/sogecredit_list.html:17 @@ -2506,7 +2541,8 @@ msgstr "Pas de remise associée" msgid "Invoice identifier" msgstr "Numéro de facture" -#: apps/treasury/models.py:42 +#: apps/treasury/models.py:42 apps/wrapped/models.py:28 +#: apps/wrapped/models.py:29 msgid "BDE" msgstr "BDE" @@ -2642,8 +2678,9 @@ msgid "" "This user doesn't have enough money to pay the memberships with its note. " "Please ask her/him to credit the note before invalidating this credit." msgstr "" -"Cet·te utilisateur·rice n'a pas assez d'argent pour payer les adhésions avec sa " -"note. Merci de lui demander de recharger sa note avant d'invalider ce crédit." +"Cet·te utilisateur·rice n'a pas assez d'argent pour payer les adhésions avec " +"sa note. Merci de lui demander de recharger sa note avant d'invalider ce " +"crédit." #: apps/treasury/tables.py:20 msgid "Invoice #{:d}" @@ -2656,25 +2693,26 @@ msgstr "Facture n°{:d}" msgid "Invoice" msgstr "Facture" -#: apps/treasury/tables.py:65 +#: apps/treasury/tables.py:66 msgid "Transaction count" msgstr "Nombre de transactions" -#: apps/treasury/tables.py:70 apps/treasury/tables.py:72 +#: apps/treasury/tables.py:71 apps/treasury/tables.py:73 +#: apps/wrapped/tables.py:42 msgid "View" msgstr "Voir" -#: apps/treasury/tables.py:143 +#: apps/treasury/tables.py:149 msgid "Yes" msgstr "Oui" #: apps/treasury/templates/treasury/invoice_confirm_delete.html:10 -#: apps/treasury/views.py:173 +#: apps/treasury/views.py:174 msgid "Delete invoice" msgstr "Supprimer la facture" #: apps/treasury/templates/treasury/invoice_confirm_delete.html:15 -#: apps/treasury/views.py:177 +#: apps/treasury/views.py:178 msgid "This invoice is locked and can't be deleted." msgstr "Cette facture est verrouillée et ne peut pas être supprimée." @@ -2794,8 +2832,8 @@ msgid "" "If this credit is validated, then the user won't be able to ask for a credit " "from the Société générale." msgstr "" -"Si ce crédit est validé, alors l'utilisateur·rice ne pourra plus demander d'être " -"crédité·e par la Société générale à l'avenir." +"Si ce crédit est validé, alors l'utilisateur·rice ne pourra plus demander " +"d'être crédité·e par la Société générale à l'avenir." #: apps/treasury/templates/treasury/sogecredit_detail.html:44 msgid "If you think there is an error, please contact the \"respos info\"." @@ -2811,14 +2849,14 @@ msgid "" "Warning: if you don't validate this credit, the note of the user doesn't " "have enough money to pay its memberships." msgstr "" -"Attention : si vous ne validez pas ce crédit, la note de l'utilisateur·rice n'a " -"pas assez d'argent pour payer les adhésions." +"Attention : si vous ne validez pas ce crédit, la note de l'utilisateur·rice " +"n'a pas assez d'argent pour payer les adhésions." #: apps/treasury/templates/treasury/sogecredit_detail.html:56 msgid "Please ask the user to credit its note before deleting this credit." msgstr "" -"Merci de demander à l'utilisateur·rice de recharger sa note avant de supprimer la " -"demande de crédit." +"Merci de demander à l'utilisateur·rice de recharger sa note avant de " +"supprimer la demande de crédit." #: apps/treasury/templates/treasury/sogecredit_detail.html:63 #: apps/wei/tables.py:60 apps/wei/tables.py:102 @@ -2836,8 +2874,8 @@ msgstr "Filtrer avec uniquement les crédits non valides" #: apps/treasury/templates/treasury/sogecredit_list.html:50 msgid "There is no matched user that have asked for a Société générale credit." msgstr "" -"Il n'y a pas d'utilisateur·rice trouvé·e ayant demandé un crédit de la Société " -"générale." +"Il n'y a pas d'utilisateur·rice trouvé·e ayant demandé un crédit de la " +"Société générale." #: apps/treasury/templates/treasury/sogecredit_list.html:63 msgid "Add credit from the Société générale" @@ -2847,44 +2885,44 @@ msgstr "Ajouter un crédit de la Société générale" msgid "Credit successfully registered" msgstr "Le crédit a bien été enregistré" -#: apps/treasury/views.py:40 +#: apps/treasury/views.py:41 msgid "Create new invoice" msgstr "Créer une nouvelle facture" -#: apps/treasury/views.py:97 +#: apps/treasury/views.py:98 msgid "Invoices list" msgstr "Liste des factures" -#: apps/treasury/views.py:105 apps/treasury/views.py:275 -#: apps/treasury/views.py:401 +#: apps/treasury/views.py:106 apps/treasury/views.py:281 +#: apps/treasury/views.py:394 msgid "You are not able to see the treasury interface." msgstr "Vous n'êtes pas autorisé·e à voir l'interface de trésorerie." -#: apps/treasury/views.py:115 +#: apps/treasury/views.py:116 msgid "Update an invoice" msgstr "Modifier la facture" -#: apps/treasury/views.py:240 +#: apps/treasury/views.py:241 msgid "Create a new remittance" msgstr "Créer une nouvelle remise" -#: apps/treasury/views.py:267 +#: apps/treasury/views.py:265 msgid "Remittances list" msgstr "Liste des remises" -#: apps/treasury/views.py:326 +#: apps/treasury/views.py:320 msgid "Update a remittance" msgstr "Modifier la remise" -#: apps/treasury/views.py:349 +#: apps/treasury/views.py:342 msgid "Attach a transaction to a remittance" msgstr "Joindre une transaction à une remise" -#: apps/treasury/views.py:393 +#: apps/treasury/views.py:386 msgid "List of credits from the Société générale" msgstr "Liste des crédits de la Société générale" -#: apps/treasury/views.py:438 +#: apps/treasury/views.py:436 msgid "Manage credits from the Société générale" msgstr "Gérer les crédits de la Société générale" @@ -2894,31 +2932,31 @@ msgstr "Gérer les crédits de la Société générale" msgid "WEI" msgstr "WEI" -#: apps/wei/forms/registration.py:35 +#: apps/wei/forms/registration.py:36 msgid "The selected user is not validated. Please validate its account first" msgstr "" -"L'utilisateur·rice sélectionné·e n'est pas validé·e. Merci de d'abord valider son " -"compte" +"L'utilisateur·rice sélectionné·e n'est pas validé·e. Merci de d'abord " +"valider son compte" -#: apps/wei/forms/registration.py:59 apps/wei/models.py:126 +#: apps/wei/forms/registration.py:60 apps/wei/models.py:126 #: apps/wei/models.py:324 msgid "bus" msgstr "bus" -#: apps/wei/forms/registration.py:60 +#: apps/wei/forms/registration.py:61 msgid "" "This choice is not definitive. The WEI organizers are free to attribute for " "you a bus and a team, in particular if you are a free eletron." msgstr "" -"Ce choix n'est pas définitif. Les organisateur·rice·s du WEI sont libres de vous " -"attribuer un bus et une équipe, en particulier si vous êtes un·e électron " -"libre." +"Ce choix n'est pas définitif. Les organisateur·rice·s du WEI sont libres de " +"vous attribuer un bus et une équipe, en particulier si vous êtes un·e " +"électron libre." -#: apps/wei/forms/registration.py:67 +#: apps/wei/forms/registration.py:68 msgid "Team" msgstr "Équipe" -#: apps/wei/forms/registration.py:69 +#: apps/wei/forms/registration.py:70 msgid "" "Leave this field empty if you won't be in a team (staff, bus chief, free " "electron)" @@ -2926,16 +2964,20 @@ msgstr "" "Laissez ce champ vide si vous ne serez pas dans une équipe (staff, chef de " "bus ou électron libre)" -#: apps/wei/forms/registration.py:75 apps/wei/forms/registration.py:85 +#: apps/wei/forms/registration.py:76 apps/wei/forms/registration.py:91 #: apps/wei/models.py:160 msgid "WEI Roles" msgstr "Rôles au WEI" -#: apps/wei/forms/registration.py:76 +#: apps/wei/forms/registration.py:77 msgid "Select the roles that you are interested in." msgstr "Sélectionnez les rôles qui vous intéressent." -#: apps/wei/forms/registration.py:122 +#: apps/wei/forms/registration.py:86 apps/wei/models.py:188 +msgid "Caution check given" +msgstr "Chèque de caution donné" + +#: apps/wei/forms/registration.py:128 msgid "This team doesn't belong to the given bus." msgstr "Cette équipe n'appartient pas à ce bus." @@ -2948,10 +2990,12 @@ msgid "year" msgstr "année" #: apps/wei/models.py:29 apps/wei/templates/wei/base.html:30 +#: apps/wrapped/models.py:20 msgid "date start" msgstr "début" #: apps/wei/models.py:33 apps/wei/templates/wei/base.html:33 +#: apps/wrapped/models.py:24 msgid "date end" msgstr "fin" @@ -3001,11 +3045,6 @@ msgstr "Rôle au WEI" msgid "Credit from Société générale" msgstr "Crédit de la Société générale" -#: apps/wei/models.py:188 -#: apps/wei/forms/registration.py:84 -msgid "Caution check given" -msgstr "Chèque de caution donné" - #: apps/wei/models.py:192 apps/wei/templates/wei/weimembership_form.html:64 msgid "birth date" msgstr "date de naissance" @@ -3039,8 +3078,7 @@ msgstr "coupe de vêtement" msgid "clothing size" msgstr "taille de vêtement" -#: apps/wei/models.py:232 apps/wei/templates/wei/attribute_bus_1A.html:28 -#: apps/wei/templates/wei/weimembership_form.html:67 +#: apps/wei/models.py:232 msgid "health issues" msgstr "problèmes de santé" @@ -3160,13 +3198,22 @@ msgid "Attribute first year members into buses" msgstr "Attribuer les 1A dans les bus" #: apps/wei/templates/wei/1A_list.html:15 -msgid "Start attribution!" +#, fuzzy +#| msgid "Start attribution!" +msgid "Start attribution !" msgstr "Démarrer l'attribution !" #: apps/wei/templates/wei/attribute_bus_1A.html:8 msgid "Bus attribution" msgstr "Répartition des bus" +#: apps/wei/templates/wei/attribute_bus_1A.html:28 +#: apps/wei/templates/wei/weimembership_form.html:67 +#, fuzzy +#| msgid "health issues" +msgid "health issues or specific diet" +msgstr "problèmes de santé" + #: apps/wei/templates/wei/attribute_bus_1A.html:31 msgid "suggested bus" msgstr "bus suggéré" @@ -3195,11 +3242,11 @@ msgstr "Prix du WEI (étudiant⋅es)" msgid "WEI list" msgstr "Liste des WEI" -#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:528 +#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:540 msgid "Register 1A" msgstr "Inscrire un⋅e 1A" -#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:614 +#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:626 msgid "Register 2A+" msgstr "Inscrire un⋅e 2A+" @@ -3228,8 +3275,8 @@ msgstr "Télécharger au format PDF" #: apps/wei/templates/wei/survey.html:11 #: apps/wei/templates/wei/survey_closed.html:11 -#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:1028 -#: apps/wei/views.py:1083 apps/wei/views.py:1130 +#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:1046 +#: apps/wei/views.py:1101 apps/wei/views.py:1148 msgid "Survey WEI" msgstr "Questionnaire WEI" @@ -3274,7 +3321,7 @@ msgstr "Inscriptions non validées" msgid "Attribute buses" msgstr "Répartition dans les bus" -#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:79 +#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:80 msgid "Create WEI" msgstr "Créer un WEI" @@ -3408,70 +3455,72 @@ msgid "There is no pre-registration found with this pattern." msgstr "Il n'y a pas de pré-inscription en attente avec cette entrée." #: apps/wei/templates/wei/weiregistration_list.html:27 -msgid "View validated membershipis..." +#, fuzzy +#| msgid "View validated membershipis..." +msgid "View validated memberships..." msgstr "Voir les adhésions validées..." -#: apps/wei/views.py:58 +#: apps/wei/views.py:59 msgid "Search WEI" msgstr "Chercher un WEI" -#: apps/wei/views.py:109 +#: apps/wei/views.py:110 msgid "WEI Detail" msgstr "Détails du WEI" -#: apps/wei/views.py:208 +#: apps/wei/views.py:210 msgid "View members of the WEI" msgstr "Voir les membres du WEI" -#: apps/wei/views.py:236 +#: apps/wei/views.py:243 msgid "Find WEI Membership" msgstr "Trouver une adhésion au WEI" -#: apps/wei/views.py:246 +#: apps/wei/views.py:253 msgid "View registrations to the WEI" msgstr "Voir les inscriptions au WEI" -#: apps/wei/views.py:270 +#: apps/wei/views.py:282 msgid "Find WEI Registration" msgstr "Trouver une inscription au WEI" -#: apps/wei/views.py:281 +#: apps/wei/views.py:293 msgid "Update the WEI" msgstr "Modifier le WEI" -#: apps/wei/views.py:302 +#: apps/wei/views.py:314 msgid "Create new bus" msgstr "Ajouter un nouveau bus" -#: apps/wei/views.py:340 +#: apps/wei/views.py:352 msgid "Update bus" msgstr "Modifier le bus" -#: apps/wei/views.py:372 +#: apps/wei/views.py:384 msgid "Manage bus" msgstr "Gérer le bus" -#: apps/wei/views.py:399 +#: apps/wei/views.py:411 msgid "Create new team" msgstr "Créer une nouvelle équipe" -#: apps/wei/views.py:439 +#: apps/wei/views.py:451 msgid "Update team" msgstr "Modifier l'équipe" -#: apps/wei/views.py:470 +#: apps/wei/views.py:482 msgid "Manage WEI team" msgstr "Gérer l'équipe WEI" -#: apps/wei/views.py:492 +#: apps/wei/views.py:504 msgid "Register first year student to the WEI" msgstr "Inscrire un⋅e 1A au WEI" -#: apps/wei/views.py:550 apps/wei/views.py:649 +#: apps/wei/views.py:562 apps/wei/views.py:661 msgid "This user is already registered to this WEI." msgstr "Cette personne est déjà inscrite au WEI." -#: apps/wei/views.py:555 +#: apps/wei/views.py:567 msgid "" "This user can't be in her/his first year since he/she has already " "participated to a WEI." @@ -3479,51 +3528,214 @@ msgstr "" "Cet⋅te utilisateur⋅rice ne peut pas être en première année puisqu'iel a déjà " "participé à un WEI." -#: apps/wei/views.py:578 +#: apps/wei/views.py:590 msgid "Register old student to the WEI" msgstr "Inscrire un⋅e 2A+ au WEI" -#: apps/wei/views.py:633 apps/wei/views.py:721 +#: apps/wei/views.py:645 apps/wei/views.py:733 msgid "You already opened an account in the Société générale." msgstr "Vous avez déjà ouvert un compte auprès de la société générale." -#: apps/wei/views.py:685 +#: apps/wei/views.py:697 msgid "Update WEI Registration" msgstr "Modifier l'inscription WEI" -#: apps/wei/views.py:795 +#: apps/wei/views.py:807 msgid "Delete WEI registration" msgstr "Supprimer l'inscription WEI" -#: apps/wei/views.py:806 +#: apps/wei/views.py:818 msgid "You don't have the right to delete this WEI registration." msgstr "Vous n'avez pas la permission de supprimer cette inscription au WEI." -#: apps/wei/views.py:824 +#: apps/wei/views.py:836 msgid "Validate WEI registration" msgstr "Valider l'inscription WEI" -#: apps/wei/views.py:1223 +#: apps/wei/views.py:1241 msgid "Attribute buses to first year members" msgstr "Répartir les 1A dans les bus" -#: apps/wei/views.py:1248 +#: apps/wei/views.py:1266 msgid "Attribute bus" msgstr "Attribuer un bus" -#: note_kfet/settings/base.py:173 +#: apps/wrapped/apps.py:10 +msgid "wrapped" +msgstr "wrapped" + +#: apps/wrapped/models.py:40 +msgid "generated" +msgstr "generé" + +#: apps/wrapped/models.py:45 +msgid "public" +msgstr "public" + +#: apps/wrapped/models.py:53 +msgid "bde" +msgstr "bde" + +#: apps/wrapped/models.py:65 +msgid "data json" +msgstr "donnée json" + +#: apps/wrapped/models.py:66 +msgid "data in the wrapped and generated by the script generate_wrapped" +msgstr "donnée dans le wrapped et générée par le script generate_wrapped" + +#: apps/wrapped/models.py:70 note_kfet/templates/base.html:114 +msgid "Wrapped" +msgstr "Wrapped" + +#: apps/wrapped/models.py:71 +msgid "Wrappeds" +msgstr "Wrappeds" + +#: apps/wrapped/tables.py:40 +msgid "view the wrapped" +msgstr "voir le wrapped" + +#: apps/wrapped/tables.py:55 +msgid "Click to make this wrapped private" +msgstr "Cliquer pour rendre ce wrapped privé" + +#: apps/wrapped/tables.py:56 +msgid "Click to make this wrapped public" +msgstr "Cliquer pour rendre ce wrapped public" + +#: apps/wrapped/tables.py:67 +msgid "Share" +msgstr "Partager" + +#: apps/wrapped/tables.py:73 +msgid "Click to copy the link in the press paper" +msgstr "Cliquer pour copier le lien" + +#: apps/wrapped/tables.py:81 +msgid "Copy link" +msgstr "Copier le lien" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:16 +#: note_kfet/templates/base.html:14 +msgid "The ENS Paris-Saclay BDE note." +msgstr "La note du BDE de l'ENS Paris-Saclay." + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:58 +msgid "The NoteKfet this year it's also" +msgstr "La NoteKfet cette année, c'est aussi :" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:60 +msgid " transactions" +msgstr " transactions" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:61 +msgid " parties" +msgstr " soirées" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:62 +msgid " Pot entries" +msgstr " entrées au Pot" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:72 +msgid " old dickhead behind the bar" +msgstr " vieilleux con·ne·s derrière le bar" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:9 +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:9 +msgid "NoteKfet Wrapped" +msgstr "NoteKfet Wrapped" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:11 +msgid "Your best consumer:" +msgstr "Ton plus gros consommateur :" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:13 +msgid "Your worst creditor:" +msgstr "Ton pire créancier :" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:16 +msgid "party·ies organised" +msgstr "soirée·s organisée·s" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:17 +msgid "distinct members" +msgstr "Membres distinct·e·s" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:13 +msgid "You participate to the wei: " +msgstr "Tu as participé au wei : " + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:13 +msgid "in the" +msgstr "dans le" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:18 +msgid "pots !" +msgstr "pots !" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:27 +msgid "Your first conso of the year: " +msgstr "Ta première conso de l'année : " + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:28 +msgid "Your prefered consumtion category: " +msgstr "Ta catégorie de bouton préférée : " + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:41 +msgid ": it's the number of time your reload your note" +msgstr ": c'est le nombre de fois où tu as rechargé·e ta note" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:44 +msgid "Your overall expenses: " +msgstr "Tes dépenses totales : " + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:47 +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:60 +msgid "with" +msgstr "avec" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:57 +msgid "Your expenses to BDE: " +msgstr "Tes dépenses au BDE : " + +#: apps/wrapped/templates/wrapped/wrapped_list.html:26 +msgid "" +"Do not forget to ask permission to people who are in your wrapped before to " +"make them public" +msgstr "" +"N'oublies pas de demander la permission des personnes apparaissant dans un " +"wrapped avant de le rendre public" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:33 +msgid "Link copied" +msgstr "Lien copié" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:58 +msgid "Wrapped is private" +msgstr "Le wrapped est privé" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:59 +msgid "Wrapped is public" +msgstr "Le wrapped est public" + +#: apps/wrapped/views.py:24 +msgid "List of wrapped" +msgstr "Liste des wrapped" + +#: note_kfet/settings/base.py:177 msgid "German" msgstr "Allemand" -#: note_kfet/settings/base.py:174 +#: note_kfet/settings/base.py:178 msgid "English" msgstr "Anglais" -#: note_kfet/settings/base.py:175 +#: note_kfet/settings/base.py:179 msgid "Spanish" msgstr "Espagnol" -#: note_kfet/settings/base.py:176 +#: note_kfet/settings/base.py:180 msgid "French" msgstr "Français" @@ -3575,19 +3787,15 @@ msgid "" "sent to webmasters with the detail of the error, and this will be fixed " "soon. You can now drink a beer." msgstr "" -"Désolé, une erreur est survenue lors de l'analyse de votre requête. Un e-mail " -"a été envoyé aux responsables de la plateforme avec les détails de cette " -"erreur, qui sera corrigée rapidement. Vous pouvez désormais aller boire une " -"bière, avec modération." +"Désolé, une erreur est survenue lors de l'analyse de votre requête. Un e-" +"mail a été envoyé aux responsables de la plateforme avec les détails de " +"cette erreur, qui sera corrigée rapidement. Vous pouvez désormais aller " +"boire une bière, avec modération." #: note_kfet/templates/autocomplete_model.html:15 msgid "Reset" msgstr "Réinitialiser" -#: note_kfet/templates/base.html:14 -msgid "The ENS Paris-Saclay BDE note." -msgstr "La note du BDE de l'ENS Paris-Saclay." - #: note_kfet/templates/base.html:72 msgid "Food" msgstr "Bouffe" @@ -3600,26 +3808,26 @@ msgstr "Utilisateur·rices" msgid "Clubs" msgstr "Clubs" -#: note_kfet/templates/base.html:119 +#: note_kfet/templates/base.html:125 msgid "Admin" msgstr "Admin" -#: note_kfet/templates/base.html:133 +#: note_kfet/templates/base.html:139 msgid "My account" msgstr "Mon compte" -#: note_kfet/templates/base.html:136 +#: note_kfet/templates/base.html:142 msgid "Log out" msgstr "Se déconnecter" -#: note_kfet/templates/base.html:144 +#: note_kfet/templates/base.html:150 #: note_kfet/templates/registration/signup.html:6 #: note_kfet/templates/registration/signup.html:11 #: note_kfet/templates/registration/signup.html:28 msgid "Sign up" msgstr "Inscription" -#: note_kfet/templates/base.html:151 +#: note_kfet/templates/base.html:157 #: note_kfet/templates/registration/login.html:6 #: note_kfet/templates/registration/login.html:15 #: note_kfet/templates/registration/login.html:38 @@ -3627,7 +3835,7 @@ msgstr "Inscription" msgid "Log in" msgstr "Se connecter" -#: note_kfet/templates/base.html:165 +#: note_kfet/templates/base.html:171 msgid "" "You are not a BDE member anymore. Please renew your membership if you want " "to use the note." @@ -3635,7 +3843,7 @@ msgstr "" "Vous n'êtes plus adhérent·e BDE. Merci de réadhérer si vous voulez profiter " "de la note." -#: note_kfet/templates/base.html:171 +#: note_kfet/templates/base.html:177 msgid "" "Your e-mail address is not validated. Please check your mail inbox and click " "on the validation link." @@ -3643,7 +3851,7 @@ msgstr "" "Votre adresse e-mail n'est pas validée. Merci de vérifier votre boîte mail " "et de cliquer sur le lien de validation." -#: note_kfet/templates/base.html:177 +#: note_kfet/templates/base.html:183 msgid "" "You declared that you opened a bank account in the Société générale. The " "bank did not validate the creation of the account to the BDE, so the " @@ -3657,19 +3865,19 @@ msgstr "" "vérification peut durer quelques jours. Merci de vous assurer de bien aller " "au bout de vos démarches." -#: note_kfet/templates/base.html:200 +#: note_kfet/templates/base.html:206 msgid "Contact us" msgstr "Nous contacter" -#: note_kfet/templates/base.html:202 +#: note_kfet/templates/base.html:208 msgid "Technical Support" msgstr "Support technique" -#: note_kfet/templates/base.html:204 +#: note_kfet/templates/base.html:210 msgid "Charte Info (FR)" msgstr "Charte Info (FR)" -#: note_kfet/templates/base.html:206 +#: note_kfet/templates/base.html:212 msgid "FAQ (FR)" msgstr "FAQ (FR)" diff --git a/locale/fr/LC_MESSAGES/djangojs.po b/locale/fr/LC_MESSAGES/djangojs.po index 90f85fc4..59989ae6 100644 --- a/locale/fr/LC_MESSAGES/djangojs.po +++ b/locale/fr/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-10-07 09:07+0200\n" +"POT-Creation-Date: 2025-02-25 13:27+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,11 +17,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: apps/member/static/member/js/alias.js:17 +#: apps/activity/static/activity/js/opener.js:31 msgid "Opener successfully added" msgstr "Ouvreureuse ajouté avec succès" -#: apps/member/static/member/js/alias.js:17 +#: apps/activity/static/activity/js/opener.js:47 msgid "Opener successfully deleted" msgstr "Ouvreureuse supprimé avec succès" From ac4574200d4dbeb80f819175894b133616cd7483 Mon Sep 17 00:00:00 2001 From: quark Date: Tue, 4 Mar 2025 18:45:22 +0100 Subject: [PATCH 44/45] Modify font --- .../wrapped/fonts/1/JEMROKtrial-Regular.ttf | Bin 137336 -> 137336 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/wrapped/static/wrapped/fonts/1/JEMROKtrial-Regular.ttf b/apps/wrapped/static/wrapped/fonts/1/JEMROKtrial-Regular.ttf index 201f7f5e7443386db4411d38876ddb3a178b3c9a..ef731e1a02f64884c0dc0ac0db0809950164e519 100644 GIT binary patch delta 876 zcmWksO=w(I6u#%&zjOcId-L9#nKzTP+L=)N$ohddUqLfOhKcxhrb)ki(#6nQ9 zpcG`Jb)g7C9GC7CDcD6Zpdz@@y&x2XE);a3hzl1AT_xUL?!AZeclpkDzXx~e!CfjD zFvjwD3D!GvX6xC{<6hwl80KWaFEk7=zW=GTDg% zvnvPDzY_f;JG%Vm^Y9}4 zFuMb{dw7G5;62vEQ}L{`8ZWXne4ee~dA5pOwzz*CKV5_E{p#2`p+|=Y_yWE*yLRI2 zbhA)-*R1r{J{fcts7jO4KwJi!zU7vhk6w6lWmtsN6bT4CXxO<0n>FFPC#h9Yw~Ixk zo6YiMxBqcn)pWEjUAF<8L)}Q`veBTvH7q_%+pmAn^8LPR`**hH%c2$MWWB=!xQ0*d zkH&8cy~+T4cwzR{<5OtPCa0FCj%#IdrDe2Ewo_{qp0pV+E1e6SOD~l{w^UYAq2|u6m1Qm~k zg(~ZMD-9P{hr_M|fnNqSc7KYpf!T9FZa{n^}_-&imkV zLAH3v;UeSk4_=zxT;HCKC*#TS$#4Z=BP`F=No-ZxB0vy<()%CfK?o5a>f@pU*xiXd<1{M?~{A0TjO^_ z;!D|W=058bQzEw}l@LSHRJX8h^)KA$&IWB|Fu>q9r^+eiQrKD+X(sXG+RLYjiiox>hZ`xn2gJ#($Dt6Qiwi8Z8GnyQP(t38frp!oUe5(O9vBN@5e)C`B2is1%y0K`5+?QE+9-sG&VR zrbxe@e187U_`Tto;pyRE0r-Yr==6g`C6u86KJl2o__pvo;c*vJTKNzXrXpr7GK~F% zTc$Z$Jw4ODI?Qrmb)=q9!9|r6s2%2@tcbpN0X}_8350U8w~bgz6kO7gR#>4oF4Rq9 ze8=O7WvR2e(t~=&1u-oG*Fx|Fc+{P0 Date: Wed, 5 Mar 2025 13:28:55 +0100 Subject: [PATCH 45/45] change icon --- note_kfet/templates/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/note_kfet/templates/base.html b/note_kfet/templates/base.html index 4f87228a..1c601c50 100644 --- a/note_kfet/templates/base.html +++ b/note_kfet/templates/base.html @@ -111,7 +111,7 @@ SPDX-License-Identifier: GPL-3.0-or-later {% if "wrapped.wrapped"|model_list_length >= 1 %} {% endif %} {% if request.user.is_authenticated %}