From 89cc03141bf49a9a97dba2c43dd925b84d97c969 Mon Sep 17 00:00:00 2001 From: quark Date: Thu, 12 Jun 2025 18:48:29 +0200 Subject: [PATCH 01/27] allow search with club name --- apps/food/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/food/views.py b/apps/food/views.py index d9556ef6..f8c7977d 100644 --- a/apps/food/views.py +++ b/apps/food/views.py @@ -63,7 +63,8 @@ class FoodListView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, Li valid_regex = is_regex(pattern) suffix = '__iregex' if valid_regex else '__istartswith' prefix = '^' if valid_regex else '' - qs = qs.filter(Q(**{f'name{suffix}': prefix + pattern})) + qs = qs.filter(Q(**{f'name{suffix}': prefix + pattern}) + | Q(**{f'owner__name{suffix}': prefix + pattern})) else: qs = qs.none() search_table = qs.filter(PermissionBackend.filter_queryset(self.request, Food, 'view')) From d71105976f58628c90d730ab991e8b2c96704edd Mon Sep 17 00:00:00 2001 From: quark Date: Sat, 14 Jun 2025 18:01:42 +0200 Subject: [PATCH 02/27] oidc --- apps/permission/scopes.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/permission/scopes.py b/apps/permission/scopes.py index 6ee5818f..29b04217 100644 --- a/apps/permission/scopes.py +++ b/apps/permission/scopes.py @@ -3,6 +3,7 @@ from oauth2_provider.oauth2_validators import OAuth2Validator from oauth2_provider.scopes import BaseScopes from member.models import Club +from note.models import Alias from note_kfet.middlewares import get_current_request from .backends import PermissionBackend @@ -35,7 +36,18 @@ class PermissionScopes(BaseScopes): class PermissionOAuth2Validator(OAuth2Validator): - oidc_claim_scope = None # fix breaking change of django-oauth-toolkit 2.0.0 + oidc_claim_scope = OAuth2Validator.oidc_claim_scope + oidc_claim_scope.update({"name": 'openid', + "normalized_name": 'openid', + "email": 'openid', + }) + + def get_additional_claims(self, request): + return { + "name": request.user.username, + "normalized_name": Alias.normalize(request.user.username), + "email": request.user.email, + } def validate_scopes(self, client_id, scopes, client, request, *args, **kwargs): """ From 97621e8704bd3e99987d813cc73f595c27d7b2d9 Mon Sep 17 00:00:00 2001 From: thomasl Date: Sat, 14 Jun 2025 20:07:29 +0200 Subject: [PATCH 03/27] Update doc about scripts --- docs/scripts.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/scripts.rst b/docs/scripts.rst index fc85468c..7ddda96d 100644 --- a/docs/scripts.rst +++ b/docs/scripts.rst @@ -136,7 +136,7 @@ de diffusion utiles. Faîtes attention, donc où la sortie est stockée. -Il prend 2 options : +Il prend 4 options : * ``--type``, qui prend en argument ``members`` (défaut), ``clubs``, ``events``, ``art``, ``sport``, qui permet respectivement de sortir la liste des adresses mails des adhérent⋅es @@ -149,7 +149,10 @@ Il prend 2 options : pour la ML Adhérents, pour exporter les mails des adhérents au BDE pendant n'importe laquelle des ``n+1`` dernières années. -Le script sort sur la sortie standard la liste des adresses mails à inscrire. +* ``--email``, qui prend en argument une chaine de caractère contenant une adresse email. + +Si aucun email n'est renseigné, le script sort sur la sortie standard la liste des adresses mails à inscrire. +Dans le cas contraire, la liste est envoyée à l'adresse passée en argument. Attention : il y a parfois certains cas particuliers à prendre en compte, il n'est malheureusement pas aussi simple que de simplement supposer que ces listes sont exhaustives. From 092cc37320a996aabf865412d5fe6d812c66c2c7 Mon Sep 17 00:00:00 2001 From: quark Date: Tue, 17 Jun 2025 00:26:13 +0200 Subject: [PATCH 04/27] OIDC 0 Quark 1 --- apps/permission/scopes.py | 29 ++++++++++++++++++++--------- apps/permission/signals.py | 1 + apps/permission/views.py | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/apps/permission/scopes.py b/apps/permission/scopes.py index 29b04217..7d2619c1 100644 --- a/apps/permission/scopes.py +++ b/apps/permission/scopes.py @@ -18,22 +18,27 @@ class PermissionScopes(BaseScopes): """ def get_all_scopes(self): - return {f"{p.id}_{club.id}": f"{p.description} (club {club.name})" - for p in Permission.objects.all() for club in Club.objects.all()} + scopes = {f"{p.id}_{club.id}": f"{p.description} (club {club.name})" + for p in Permission.objects.all() for club in Club.objects.all()} + scopes['openid'] = "OpenID Connect" + return scopes def get_available_scopes(self, application=None, request=None, *args, **kwargs): if not application: return [] - return [f"{p.id}_{p.membership.club.id}" - for t in Permission.PERMISSION_TYPES - for p in PermissionBackend.get_raw_permissions(get_current_request(), t[0])] + scopes = [f"{p.id}_{p.membership.club.id}" + for t in Permission.PERMISSION_TYPES + for p in PermissionBackend.get_raw_permissions(get_current_request(), t[0])] + scopes.append('openid') + return scopes def get_default_scopes(self, application=None, request=None, *args, **kwargs): if not application: return [] - return [f"{p.id}_{p.membership.club.id}" - for p in PermissionBackend.get_raw_permissions(get_current_request(), 'view')] - + scopes = [f"{p.id}_{p.membership.club.id}" + for p in PermissionBackend.get_raw_permissions(get_current_request(), 'view')] + scopes.append('openid') + return scopes class PermissionOAuth2Validator(OAuth2Validator): oidc_claim_scope = OAuth2Validator.oidc_claim_scope @@ -49,6 +54,10 @@ class PermissionOAuth2Validator(OAuth2Validator): "email": request.user.email, } + def get_discovery_claims(self, request): + claims = super().get_discovery_claims(self) + return claims + ["name", "normalized_name", "email"] + def validate_scopes(self, client_id, scopes, client, request, *args, **kwargs): """ User can request as many scope as he wants, including invalid scopes, @@ -65,7 +74,9 @@ class PermissionOAuth2Validator(OAuth2Validator): scope = f"{p.id}_{p.membership.club.id}" if scope in scopes: valid_scopes.add(scope) + + if 'openid' in scopes: + valid_scopes.add('openid') request.scopes = valid_scopes - return valid_scopes diff --git a/apps/permission/signals.py b/apps/permission/signals.py index b2394c6f..5ea04113 100644 --- a/apps/permission/signals.py +++ b/apps/permission/signals.py @@ -19,6 +19,7 @@ EXCLUDED = [ 'oauth2_provider.accesstoken', 'oauth2_provider.grant', 'oauth2_provider.refreshtoken', + 'oauth2_provider.idtoken', 'sessions.session', ] diff --git a/apps/permission/views.py b/apps/permission/views.py index e7de920e..39e1f98c 100644 --- a/apps/permission/views.py +++ b/apps/permission/views.py @@ -171,7 +171,7 @@ class ScopesView(LoginRequiredMixin, TemplateView): available_scopes = scopes.get_available_scopes(app) context["scopes"][app] = OrderedDict() items = [(k, v) for (k, v) in all_scopes.items() if k in available_scopes] - items.sort(key=lambda x: (int(x[0].split("_")[1]), int(x[0].split("_")[0]))) + # items.sort(key=lambda x: (int(x[0].split("_")[1]), int(x[0].split("_")[0]))) for k, v in items: context["scopes"][app][k] = v From df0d886db97ce55088f71e4bb192a47e12182f24 Mon Sep 17 00:00:00 2001 From: quark Date: Tue, 17 Jun 2025 11:46:33 +0200 Subject: [PATCH 05/27] linters --- apps/permission/scopes.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/permission/scopes.py b/apps/permission/scopes.py index 7d2619c1..0702aefa 100644 --- a/apps/permission/scopes.py +++ b/apps/permission/scopes.py @@ -1,5 +1,6 @@ # Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later + from oauth2_provider.oauth2_validators import OAuth2Validator from oauth2_provider.scopes import BaseScopes from member.models import Club @@ -19,7 +20,7 @@ class PermissionScopes(BaseScopes): def get_all_scopes(self): scopes = {f"{p.id}_{club.id}": f"{p.description} (club {club.name})" - for p in Permission.objects.all() for club in Club.objects.all()} + for p in Permission.objects.all() for club in Club.objects.all()} scopes['openid'] = "OpenID Connect" return scopes @@ -27,8 +28,8 @@ class PermissionScopes(BaseScopes): if not application: return [] scopes = [f"{p.id}_{p.membership.club.id}" - for t in Permission.PERMISSION_TYPES - for p in PermissionBackend.get_raw_permissions(get_current_request(), t[0])] + for t in Permission.PERMISSION_TYPES + for p in PermissionBackend.get_raw_permissions(get_current_request(), t[0])] scopes.append('openid') return scopes @@ -36,10 +37,11 @@ class PermissionScopes(BaseScopes): if not application: return [] scopes = [f"{p.id}_{p.membership.club.id}" - for p in PermissionBackend.get_raw_permissions(get_current_request(), 'view')] + for p in PermissionBackend.get_raw_permissions(get_current_request(), 'view')] scopes.append('openid') return scopes + class PermissionOAuth2Validator(OAuth2Validator): oidc_claim_scope = OAuth2Validator.oidc_claim_scope oidc_claim_scope.update({"name": 'openid', @@ -74,7 +76,7 @@ class PermissionOAuth2Validator(OAuth2Validator): scope = f"{p.id}_{p.membership.club.id}" if scope in scopes: valid_scopes.add(scope) - + if 'openid' in scopes: valid_scopes.add('openid') From cdc6f0a3f8cbc9baaa9c71899d3f332692069c0e Mon Sep 17 00:00:00 2001 From: quark Date: Fri, 27 Jun 2025 12:13:54 +0200 Subject: [PATCH 06/27] Fix jwks.json --- .env_example | 3 +++ README.md | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.env_example b/.env_example index 7e1dbd3b..5257e83c 100644 --- a/.env_example +++ b/.env_example @@ -21,3 +21,6 @@ EMAIL_PASSWORD=CHANGE_ME # Wiki configuration WIKI_USER=NoteKfet2020 WIKI_PASSWORD= + +# OIDC +OIDC_RSA_PRIVATE_KEY= diff --git a/README.md b/README.md index 4ba19356..c340d58c 100644 --- a/README.md +++ b/README.md @@ -61,8 +61,8 @@ Bien que cela permette de créer une instance sur toutes les distributions, 6. (Optionnel) **Création d'une clé privée OpenID Connect** Pour activer le support d'OpenID Connect, il faut générer une clé privée, par -exemple avec openssl (`openssl genrsa -out oidc.key 4096`), et renseigner son -emplacement dans `OIDC_RSA_PRIVATE_KEY` (par défaut `/var/secrets/oidc.key`). +exemple avec openssl (`openssl genrsa -out oidc.key 4096`), et copier la clé dans .env dans le champ +`OIDC_RSA_PRIVATE_KEY`. 7. Enjoy : @@ -237,8 +237,8 @@ Sinon vous pouvez suivre les étapes décrites ci-dessous. 7. **Création d'une clé privée OpenID Connect** Pour activer le support d'OpenID Connect, il faut générer une clé privée, par -exemple avec openssl (`openssl genrsa -out oidc.key 4096`), et renseigner son -emplacement dans `OIDC_RSA_PRIVATE_KEY` (par défaut `/var/secrets/oidc.key`). +exemple avec openssl (`openssl genrsa -out oidc.key 4096`), et renseigner le champ +`OIDC_RSA_PRIVATE_KEY` dans le .env (par défaut `/var/secrets/oidc.key`). 8. *Enjoy \o/* From c411197af3a3240ba23376b10b9863600b64a8db Mon Sep 17 00:00:00 2001 From: quark Date: Fri, 27 Jun 2025 22:13:43 +0200 Subject: [PATCH 07/27] multiline support for RSA key in env --- .env_example | 2 +- note_kfet/settings/base.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.env_example b/.env_example index 5257e83c..da0b4efa 100644 --- a/.env_example +++ b/.env_example @@ -23,4 +23,4 @@ WIKI_USER=NoteKfet2020 WIKI_PASSWORD= # OIDC -OIDC_RSA_PRIVATE_KEY= +OIDC_RSA_PRIVATE_KEY=CHANGE_ME diff --git a/note_kfet/settings/base.py b/note_kfet/settings/base.py index 0f3a757c..2f7965d8 100644 --- a/note_kfet/settings/base.py +++ b/note_kfet/settings/base.py @@ -270,7 +270,7 @@ OAUTH2_PROVIDER = { 'PKCE_REQUIRED': False, # PKCE (fix a breaking change of django-oauth-toolkit 2.0.0) 'OIDC_ENABLED': True, 'OIDC_RSA_PRIVATE_KEY': - os.getenv('OIDC_RSA_PRIVATE_KEY', '/var/secrets/oidc.key'), + os.getenv('OIDC_RSA_PRIVATE_KEY', 'CHANGE_ME_IN_ENV_SETTINGS').replace('\\n', '\n'), # for multilines 'SCOPES': { 'openid': "OpenID Connect scope" }, } From b2c6b0e85d4e7e955d9135b7e2b7eb337b5022d6 Mon Sep 17 00:00:00 2001 From: Ehouarn Date: Tue, 1 Jul 2025 15:27:31 +0200 Subject: [PATCH 08/27] =?UTF-8?q?S=C3=A9lection=20de=20bus/=C3=A9quipe=20p?= =?UTF-8?q?lus=20ergonomique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wei/forms/registration.py | 32 +++++++++---------- .../wei/templates/wei/weimembership_form.html | 23 +++++++++++++ apps/wei/views.py | 10 +++++- 3 files changed, 48 insertions(+), 17 deletions(-) diff --git a/apps/wei/forms/registration.py b/apps/wei/forms/registration.py index 2458a2eb..455d77ca 100644 --- a/apps/wei/forms/registration.py +++ b/apps/wei/forms/registration.py @@ -5,7 +5,7 @@ from bootstrap_datepicker_plus.widgets import DatePickerInput from django import forms from django.contrib.auth.models import User from django.db.models import Q -from django.forms import CheckboxSelectMultiple +from django.forms import CheckboxSelectMultiple, RadioSelect from django.utils.translation import gettext_lazy as _ from note.models import NoteSpecial, NoteUser from note_kfet.inputs import AmountInput, Autocomplete, ColorWidget @@ -140,6 +140,19 @@ class WEIMembershipForm(forms.ModelForm): required=False, ) + def __init__(self, *args, wei=None, **kwargs): + super().__init__(*args, **kwargs) + if 'bus' in self.fields: + if wei is not None: + self.fields['bus'].queryset = Bus.objects.filter(wei=wei) + else: + self.fields['bus'].queryset = Bus.objects.none() + if 'team' in self.fields: + if wei is not None: + self.fields['team'].queryset = BusTeam.objects.filter(bus__wei=wei) + else: + self.fields['team'].queryset = BusTeam.objects.none() + def clean(self): cleaned_data = super().clean() if 'team' in cleaned_data and cleaned_data["team"] is not None \ @@ -151,21 +164,8 @@ class WEIMembershipForm(forms.ModelForm): model = WEIMembership fields = ('roles', 'bus', 'team',) widgets = { - "bus": Autocomplete( - Bus, - attrs={ - 'api_url': '/api/wei/bus/', - 'placeholder': 'Bus ...', - } - ), - "team": Autocomplete( - BusTeam, - attrs={ - 'api_url': '/api/wei/team/', - 'placeholder': 'Équipe ...', - }, - resetable=True, - ), + "bus": RadioSelect(), + "team": RadioSelect(), } diff --git a/apps/wei/templates/wei/weimembership_form.html b/apps/wei/templates/wei/weimembership_form.html index f0f3d800..a9c85d5d 100644 --- a/apps/wei/templates/wei/weimembership_form.html +++ b/apps/wei/templates/wei/weimembership_form.html @@ -210,4 +210,27 @@ SPDX-License-Identifier: GPL-3.0-or-later } } + {% endblock %} diff --git a/apps/wei/views.py b/apps/wei/views.py index 97b49eaf..bfc7c616 100644 --- a/apps/wei/views.py +++ b/apps/wei/views.py @@ -788,7 +788,8 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update return form def get_membership_form(self, data=None, instance=None): - membership_form = WEIMembershipForm(data if data else None, instance=instance) + registration = self.get_object() + membership_form = WEIMembershipForm(data if data else None, instance=instance, wei=registration.wei) del membership_form.fields["credit_type"] del membership_form.fields["credit_amount"] del membership_form.fields["first_name"] @@ -969,6 +970,13 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): return WEIMembership1AForm return WEIMembershipForm + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + registration = WEIRegistration.objects.get(pk=self.kwargs["pk"]) + wei = registration.wei + kwargs['wei'] = wei + return kwargs + def get_form(self, form_class=None): form = super().get_form(form_class) registration = WEIRegistration.objects.get(pk=self.kwargs["pk"]) From 6edef619aa7b79ca3f1d1a62b3de631a67458adb Mon Sep 17 00:00:00 2001 From: quark Date: Thu, 3 Jul 2025 11:37:07 +0200 Subject: [PATCH 09/27] change requirements.txt --- apps/note/api/urls.py | 2 +- note_kfet/settings/base.py | 1 + requirements.txt | 30 +++++++++++++++--------------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/apps/note/api/urls.py b/apps/note/api/urls.py index 67d7371e..c50e68e4 100644 --- a/apps/note/api/urls.py +++ b/apps/note/api/urls.py @@ -13,7 +13,7 @@ def register_note_urls(router, path): router.register(path + '/note', NotePolymorphicViewSet) router.register(path + '/alias', AliasViewSet) router.register(path + '/trust', TrustViewSet) - router.register(path + '/consumer', ConsumerViewSet) + router.register(path + '/consumer', ConsumerViewSet, basename='alias2') router.register(path + '/transaction/category', TemplateCategoryViewSet) router.register(path + '/transaction/transaction', TransactionViewSet) diff --git a/note_kfet/settings/base.py b/note_kfet/settings/base.py index 2f7965d8..779ee23d 100644 --- a/note_kfet/settings/base.py +++ b/note_kfet/settings/base.py @@ -39,6 +39,7 @@ SECURE_HSTS_PRELOAD = True INSTALLED_APPS = [ # External apps 'bootstrap_datepicker_plus', + 'cas_server', 'colorfield', 'crispy_bootstrap4', 'crispy_forms', diff --git a/requirements.txt b/requirements.txt index f4a32c97..1d6f5063 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,20 +1,20 @@ -beautifulsoup4~=4.12.3 -crispy-bootstrap4~=2023.1 -Django~=4.2.9 +beautifulsoup4~=4.13.4 +crispy-bootstrap4~=2025.6 +Django~=5.2.4 django-bootstrap-datepicker-plus~=5.0.5 -#django-cas-server~=2.0.0 -django-colorfield~=0.11.0 -django-crispy-forms~=2.1.0 -django-extensions>=3.2.3 -django-filter~=23.5 +django-cas-server~=3.1.0 +django-colorfield~=0.14.0 +django-crispy-forms~=2.4.0 +django-extensions>=4.1.0 +django-filter~=25.1 #django-htcpcp-tea~=0.8.1 -django-mailer~=2.3.1 -django-oauth-toolkit~=2.3.0 -django-phonenumber-field~=7.3.0 +django-mailer~=2.3.2 +django-oauth-toolkit~=3.0.1 +django-phonenumber-field~=8.1.0 django-polymorphic~=3.1.0 -djangorestframework~=3.14.0 +djangorestframework~=3.16.0 django-rest-polymorphic~=0.1.10 -django-tables2~=2.7.0 +django-tables2~=2.7.5 python-memcached~=1.62 -phonenumbers~=8.13.28 -Pillow>=10.2.0 +phonenumbers~=9.0.8 +Pillow>=11.3.0 From f54dd3048207fef48999dafd2cb13c6a2a34cd52 Mon Sep 17 00:00:00 2001 From: quark Date: Thu, 3 Jul 2025 15:18:29 +0200 Subject: [PATCH 10/27] fix logout test --- apps/member/tests/test_login.py | 2 +- note_kfet/templates/base.html | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/member/tests/test_login.py b/apps/member/tests/test_login.py index b8873a14..ce5de1cf 100644 --- a/apps/member/tests/test_login.py +++ b/apps/member/tests/test_login.py @@ -44,7 +44,7 @@ class TemplateLoggedInTests(TestCase): self.assertRedirects(response, settings.LOGIN_REDIRECT_URL, 302, 302) def test_logout(self): - response = self.client.get(reverse("logout")) + response = self.client.post(reverse("logout")) self.assertEqual(response.status_code, 200) def test_admin_index(self): diff --git a/note_kfet/templates/base.html b/note_kfet/templates/base.html index 1c601c50..3dbfa901 100644 --- a/note_kfet/templates/base.html +++ b/note_kfet/templates/base.html @@ -138,9 +138,12 @@ SPDX-License-Identifier: GPL-3.0-or-later {% trans "My account" %} - - {% trans "Log out" %} - +
+ {% csrf_token %} + +
{% else %} From 85ea43a7cf9e62b1cc6add430bb266baa7d0f6db Mon Sep 17 00:00:00 2001 From: quark Date: Fri, 4 Jul 2025 16:26:40 +0200 Subject: [PATCH 11/27] change pipeline --- .gitlab-ci.yml | 8 ++++---- tox.ini | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2ba35d31..4cf8dab9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,7 +8,7 @@ variables: GIT_SUBMODULE_STRATEGY: recursive # Ubuntu 22.04 -py310-django42: +py310-django52: stage: test image: ubuntu:22.04 before_script: @@ -22,10 +22,10 @@ py310-django42: python3-djangorestframework python3-django-oauth-toolkit python3-psycopg2 python3-pil python3-babel python3-lockfile python3-pip python3-phonenumbers python3-memcache python3-bs4 python3-setuptools tox texlive-xetex - script: tox -e py310-django42 + script: tox -e py310-django52 # Debian Bookworm -py311-django42: +py311-django52: stage: test image: debian:bookworm before_script: @@ -37,7 +37,7 @@ py311-django42: python3-djangorestframework python3-django-oauth-toolkit python3-psycopg2 python3-pil python3-babel python3-lockfile python3-pip python3-phonenumbers python3-memcache python3-bs4 python3-setuptools tox texlive-xetex - script: tox -e py311-django42 + script: tox -e py311-django52 linters: stage: quality-assurance diff --git a/tox.ini b/tox.ini index 1bfeb593..8ad79854 100644 --- a/tox.ini +++ b/tox.ini @@ -1,13 +1,13 @@ [tox] envlist = # Ubuntu 22.04 Python - py310-django42 + py310-django52 # Debian Bookworm Python - py311-django42 + py311-django52 # Ubuntu 24.04 Python - py312-django42 + py312-django52 linters skipsdist = True From b7c0986a5f358863714f24d75ea264487147fae5 Mon Sep 17 00:00:00 2001 From: quark Date: Fri, 4 Jul 2025 17:14:12 +0200 Subject: [PATCH 12/27] cron and linters --- note.cron | 5 +++-- tox.ini | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/note.cron b/note.cron index fb45a4b3..6c2b94c6 100644 --- a/note.cron +++ b/note.cron @@ -27,5 +27,6 @@ MAILTO=notekfet2020@lists.crans.org # 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 10 * * 0 root cd /var/www/note_kfet && env/bin/python manage.py extract_ml_registrations -t art -e "bda.ensparissaclay@gmail.com" - \ No newline at end of file + 00 10 * * 0 root cd /var/www/note_kfet && env/bin/python manage.py extract_ml_registrations -t art -e "bda.ensparissaclay@gmail.com" +# Envoyer la liste de la bouffe au club et aux GCKs + 00 8 * * 1 root cd /var/www/note_kfet && env/bin/python manage.py send_mail_for_food --report --club diff --git a/tox.ini b/tox.ini index 8ad79854..1fa7cf7a 100644 --- a/tox.ini +++ b/tox.ini @@ -32,8 +32,7 @@ deps = pep8-naming pyflakes commands = - flake8 apps --extend-exclude apps/scripts,apps/wrapped/management/commands - flake8 apps/wrapped/management/commands --extend-ignore=C901 + flake8 apps --extend-exclude apps/scripts [flake8] ignore = W503, I100, I101, B019 From 4cc43fe4b62e936b1bb9b169b4286dc504694c08 Mon Sep 17 00:00:00 2001 From: quark Date: Fri, 4 Jul 2025 22:11:47 +0200 Subject: [PATCH 13/27] traduction, resolve #133 --- locale/fr/LC_MESSAGES/django.po | 113 +++++++++++++++++--------------- note_kfet/templates/base.html | 4 ++ 2 files changed, 65 insertions(+), 52 deletions(-) diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 9832c986..9f9fb04f 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: 2025-06-27 19:15+0200\n" +"POT-Creation-Date: 2025-07-04 21:47+0200\n" "PO-Revision-Date: 2022-04-11 22:05+0200\n" "Last-Translator: bleizi \n" "Language-Team: French \n" @@ -785,49 +785,49 @@ msgstr "semaines" msgid "and" msgstr "et" -#: apps/food/views.py:118 +#: apps/food/views.py:119 msgid "Add a new QRCode" msgstr "Ajouter un nouveau QR-code" -#: apps/food/views.py:167 +#: apps/food/views.py:168 msgid "Add an aliment" msgstr "Ajouter un nouvel aliment" -#: apps/food/views.py:235 +#: apps/food/views.py:236 msgid "Add a meal" msgstr "Ajouter un plat" -#: apps/food/views.py:275 +#: apps/food/views.py:276 msgid "Manage ingredients of:" msgstr "Gestion des ingrédienrs de :" -#: apps/food/views.py:289 apps/food/views.py:297 +#: apps/food/views.py:290 apps/food/views.py:298 #, python-brace-format msgid "Fully used in {meal}" msgstr "Aliment entièrement utilisé dans : {meal}" -#: apps/food/views.py:344 +#: apps/food/views.py:345 msgid "Add the ingredient:" msgstr "Ajouter l'ingrédient" -#: apps/food/views.py:370 +#: apps/food/views.py:371 #, python-brace-format msgid "Food fully used in : {meal.name}" msgstr "Aliment entièrement utilisé dans : {meal.name}" -#: apps/food/views.py:389 +#: apps/food/views.py:390 msgid "Update an aliment" msgstr "Modifier un aliment" -#: apps/food/views.py:437 +#: apps/food/views.py:438 msgid "Details of:" msgstr "Détails de :" -#: apps/food/views.py:447 apps/treasury/tables.py:149 +#: apps/food/views.py:448 apps/treasury/tables.py:149 msgid "Yes" msgstr "Oui" -#: apps/food/views.py:449 apps/member/models.py:99 apps/treasury/tables.py:149 +#: apps/food/views.py:450 apps/member/models.py:99 apps/treasury/tables.py:149 msgid "No" msgstr "Non" @@ -1962,8 +1962,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:1097 -#: apps/wei/views.py:1101 +#: apps/note/models/transactions.py:363 apps/wei/views.py:1105 +#: apps/wei/views.py:1109 msgid "This field is required." msgstr "Ce champ est requis." @@ -2065,6 +2065,8 @@ 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/food_report.html:48 +#: apps/scripts/templates/scripts/food_report.txt:14 msgid "Mail generated by the Note Kfet on the" msgstr "Mail généré par la Note Kfet le" @@ -2269,7 +2271,7 @@ msgstr "s'applique au club" msgid "role permissions" msgstr "permissions par rôles" -#: apps/permission/signals.py:73 +#: apps/permission/signals.py:74 #, python-brace-format msgid "" "You don't have the permission to change the field {field} on this instance " @@ -2278,7 +2280,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:104 +#: apps/permission/signals.py:84 apps/permission/views.py:104 #, python-brace-format msgid "" "You don't have the permission to add an instance of model {app_label}." @@ -2287,7 +2289,7 @@ msgstr "" "Vous n'avez pas la permission d'ajouter une instance du modèle {app_label}." "{model_name}." -#: apps/permission/signals.py:112 +#: apps/permission/signals.py:113 #, python-brace-format msgid "" "You don't have the permission to delete this instance of model {app_label}." @@ -3041,7 +3043,7 @@ msgstr "Rôles au WEI" msgid "Select the roles that you are interested in." msgstr "Sélectionnez les rôles qui vous intéressent." -#: apps/wei/forms/registration.py:147 +#: apps/wei/forms/registration.py:160 msgid "This team doesn't belong to the given bus." msgstr "Cette équipe n'appartient pas à ce bus." @@ -3120,7 +3122,7 @@ 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:202 apps/wei/views.py:984 +#: apps/wei/models.py:202 apps/wei/views.py:992 msgid "Caution check given" msgstr "Chèque de caution donné" @@ -3352,7 +3354,6 @@ msgid "View club" msgstr "Voir le club" #: apps/wei/templates/wei/bus_detail.html:26 -#| msgid "survey information" msgid "Edit information" msgstr "Modifier les informations" @@ -3373,8 +3374,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:1159 -#: apps/wei/views.py:1214 apps/wei/views.py:1261 +#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:1167 +#: apps/wei/views.py:1222 apps/wei/views.py:1269 msgid "Survey WEI" msgstr "Questionnaire WEI" @@ -3654,51 +3655,51 @@ msgstr "" msgid "Update WEI Registration" msgstr "Modifier l'inscription WEI" -#: apps/wei/views.py:810 +#: apps/wei/views.py:811 msgid "No membership found for this registration" msgstr "Pas d'adhésion trouvée pour cette inscription" -#: apps/wei/views.py:819 +#: apps/wei/views.py:820 msgid "You don't have the permission to update memberships" msgstr "" "Vous n'avez pas la permission d'ajouter une instance du modèle {app_label}." "{model_name}." -#: apps/wei/views.py:825 +#: apps/wei/views.py:826 #, python-format msgid "You don't have the permission to update the field %(field)s" msgstr "Vous n'avez pas la permission de modifier le champ %(field)s" -#: apps/wei/views.py:870 +#: apps/wei/views.py:871 msgid "Delete WEI registration" msgstr "Supprimer l'inscription WEI" -#: apps/wei/views.py:881 +#: apps/wei/views.py:882 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:899 +#: apps/wei/views.py:900 msgid "Validate WEI registration" msgstr "Valider l'inscription WEI" -#: apps/wei/views.py:985 +#: apps/wei/views.py:993 msgid "Please make sure the check is given before validating the registration" msgstr "" "Merci de vous assurer que le chèque a bien été donné avant de valider " "l'adhésion" -#: apps/wei/views.py:991 +#: apps/wei/views.py:999 msgid "Create deposit transaction" msgstr "Créer une transaction de caution" -#: apps/wei/views.py:992 +#: apps/wei/views.py:1000 #, python-format msgid "" "A transaction of %(amount).2f€ will be created from the user's Note account" msgstr "" "Un transaction de %(amount).2f€ va être créée depuis la note de l'utilisateur" -#: apps/wei/views.py:1087 +#: apps/wei/views.py:1095 #, python-format msgid "" "This user doesn't have enough money to join this club and pay the deposit. " @@ -3708,21 +3709,21 @@ msgstr "" "payer la cautionSolde actuel : %(balance)d€, crédit : %(credit)d€, requis : " "%(needed)d€" -#: apps/wei/views.py:1140 +#: apps/wei/views.py:1148 #, fuzzy, python-format #| msgid "total amount" msgid "Caution %(name)s" msgstr "montant total" -#: apps/wei/views.py:1354 +#: apps/wei/views.py:1362 msgid "Attribute buses to first year members" msgstr "Répartir les 1A dans les bus" -#: apps/wei/views.py:1380 +#: apps/wei/views.py:1388 msgid "Attribute bus" msgstr "Attribuer un bus" -#: apps/wei/views.py:1420 +#: apps/wei/views.py:1428 msgid "" "No first year student without a bus found. Either all of them have a bus, or " "none has filled the survey yet." @@ -3746,7 +3747,7 @@ msgstr "bde" #: apps/wrapped/models.py:65 msgid "data json" -msgstr "donnée json" +msgstr "données json" #: apps/wrapped/models.py:66 msgid "data in the wrapped and generated by the script generate_wrapped" @@ -3888,7 +3889,7 @@ 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 " +"N'oublie pas de demander la permission des personnes apparaissant dans un " "wrapped avant de le rendre public" #: apps/wrapped/templates/wrapped/wrapped_list.html:40 @@ -3907,19 +3908,19 @@ msgstr "Le wrapped est public" msgid "List of wrapped" msgstr "Liste des wrapped" -#: note_kfet/settings/base.py:177 +#: note_kfet/settings/base.py:178 msgid "German" msgstr "Allemand" -#: note_kfet/settings/base.py:178 +#: note_kfet/settings/base.py:179 msgid "English" msgstr "Anglais" -#: note_kfet/settings/base.py:179 +#: note_kfet/settings/base.py:180 msgid "Spanish" msgstr "Espagnol" -#: note_kfet/settings/base.py:180 +#: note_kfet/settings/base.py:181 msgid "French" msgstr "Français" @@ -3996,18 +3997,18 @@ msgstr "Admin" msgid "My account" msgstr "Mon compte" -#: note_kfet/templates/base.html:142 +#: note_kfet/templates/base.html:144 msgid "Log out" msgstr "Se déconnecter" -#: note_kfet/templates/base.html:150 +#: note_kfet/templates/base.html:153 #: 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:157 +#: note_kfet/templates/base.html:160 #: note_kfet/templates/registration/login.html:6 #: note_kfet/templates/registration/login.html:15 #: note_kfet/templates/registration/login.html:38 @@ -4015,7 +4016,7 @@ msgstr "Inscription" msgid "Log in" msgstr "Se connecter" -#: note_kfet/templates/base.html:171 +#: note_kfet/templates/base.html:174 msgid "" "You are not a BDE member anymore. Please renew your membership if you want " "to use the note." @@ -4023,7 +4024,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:177 +#: note_kfet/templates/base.html:180 msgid "" "Your e-mail address is not validated. Please check your mail inbox and click " "on the validation link." @@ -4031,7 +4032,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:183 +#: note_kfet/templates/base.html:186 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 " @@ -4045,22 +4046,30 @@ 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:206 +#: note_kfet/templates/base.html:209 msgid "Contact us" msgstr "Nous contacter" -#: note_kfet/templates/base.html:208 +#: note_kfet/templates/base.html:211 msgid "Technical Support" msgstr "Support technique" -#: note_kfet/templates/base.html:210 +#: note_kfet/templates/base.html:213 msgid "Charte Info (FR)" msgstr "Charte Info (FR)" -#: note_kfet/templates/base.html:212 +#: note_kfet/templates/base.html:215 msgid "FAQ (FR)" msgstr "FAQ (FR)" +#: note_kfet/templates/base.html:217 +msgid "Managed by BDE" +msgstr "Gérer par le BDE" + +#: note_kfet/templates/base.html:219 +msgid "Hosted by Cr@ns" +msgstr "Hébergé par le Cr@ans" + #: note_kfet/templates/base_search.html:15 msgid "Search by attribute such as name..." msgstr "Chercher par un attribut tel que le nom..." diff --git a/note_kfet/templates/base.html b/note_kfet/templates/base.html index 3dbfa901..70e55f90 100644 --- a/note_kfet/templates/base.html +++ b/note_kfet/templates/base.html @@ -213,6 +213,10 @@ SPDX-License-Identifier: GPL-3.0-or-later class="text-muted">{% trans "Charte Info (FR)" %} — {% trans "FAQ (FR)" %} — + {% trans "Managed by BDE" %} — + {% trans "Hosted by Cr@ns" %} &mdahs; {% csrf_token %} {% blocktrans %}

Log In Successful

You have successfully logged into the Central Authentication Service.
For security reasons, please Log Out and Exit your web browser when you are done accessing services that require authentication!{% endblocktrans %} +
+
+ +
+
+{% endblock %} diff --git a/note_kfet/templates/cas/login.html b/note_kfet/templates/cas/login.html new file mode 100644 index 00000000..84fd0cf8 --- /dev/null +++ b/note_kfet/templates/cas/login.html @@ -0,0 +1,42 @@ +{% extends "base.html" %} +{% comment %} +Copyright (C) by BDE ENS-Paris-Saclay +SPDX-License-Identifier: GPL-3.0-or-later +{% endcomment %} +{% load i18n %} + +{% block ante_messages %} + {% if auto_submit %}{% endif %} +{% endblock %} + +{% block content %} +
+
+
+ +
+ +{% endblock %} + +{% block javascript_inline %} +jQuery(function( $ ){ + $("#id_warn").click(function(e){ + if($("#id_warn").is(':checked')){ + createCookie("warn", "on", 10 * 365); + } else { + eraseCookie("warn"); + } + }); +}); +{% if auto_submit %}document.getElementById('login_form').submit(); // SUBMIT FORM{% endif %} +{% endblock %} diff --git a/note_kfet/templates/cas/logout.html b/note_kfet/templates/cas/logout.html new file mode 100644 index 00000000..814f7d33 --- /dev/null +++ b/note_kfet/templates/cas/logout.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} +{% comment %} +Copyright (C) by BDE ENS-Paris-Saclay +SPDX-License-Identifier: GPL-3.0-or-later +{% endcomment %} +{% load i18n static %} +{% block content %} + +{% endblock %} + diff --git a/note_kfet/templates/cas/warn.html b/note_kfet/templates/cas/warn.html new file mode 100644 index 00000000..89ee1815 --- /dev/null +++ b/note_kfet/templates/cas/warn.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} +{% comment %} +Copyright (C) by BDE ENS-Paris-Saclay +SPDX-License-Identifier: GPL-3.0-or-later +{% endcomment %} +{% load i18n static %} + +{% block content %} +
+
+ +
+
+{% endblock %} + From c36f8c25a288c7d1c1e7c8aaad699feee1e9615c Mon Sep 17 00:00:00 2001 From: quark Date: Sat, 5 Jul 2025 18:26:31 +0200 Subject: [PATCH 15/27] Add banner #80 (with django-constance --- apps/permission/signals.py | 1 + note_kfet/admin.py | 5 +++++ note_kfet/settings/base.py | 19 +++++++++++++++++++ note_kfet/templates/base.html | 6 +++++- requirements.txt | 1 + 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/apps/permission/signals.py b/apps/permission/signals.py index 5ea04113..af5ab4ce 100644 --- a/apps/permission/signals.py +++ b/apps/permission/signals.py @@ -13,6 +13,7 @@ EXCLUDED = [ 'cas_server.serviceticket', 'cas_server.user', 'cas_server.userattributes', + 'constance.constance', 'contenttypes.contenttype', 'logs.changelog', 'migrations.migration', diff --git a/note_kfet/admin.py b/note_kfet/admin.py index 6bda409f..7f4effe3 100644 --- a/note_kfet/admin.py +++ b/note_kfet/admin.py @@ -56,3 +56,8 @@ if "cas_server" in settings.INSTALLED_APPS: from cas_server.models import * admin_site.register(ServicePattern, ServicePatternAdmin) admin_site.register(FederatedIendityProvider, FederatedIendityProviderAdmin) + +if "constance" in settings.INSTALLED_APPS: + from constance.admin import * + from constance.models import * + admin_site.register([Config], ConstanceAdmin) diff --git a/note_kfet/settings/base.py b/note_kfet/settings/base.py index 8a0fc738..dc954453 100644 --- a/note_kfet/settings/base.py +++ b/note_kfet/settings/base.py @@ -41,6 +41,7 @@ INSTALLED_APPS = [ 'bootstrap_datepicker_plus', 'cas_server', 'colorfield', + 'constance', 'crispy_bootstrap4', 'crispy_forms', # 'django_htcpcp_tea', @@ -112,6 +113,7 @@ TEMPLATES = [ 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ + 'constance.context_processors.config', 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', @@ -315,3 +317,20 @@ CAS_LOGGED_TEMPLATE = 'cas/logged.html' # Default field for primary key DEFAULT_AUTO_FIELD = "django.db.models.AutoField" + +# Constance settings +CONSTANCE_ADDITIONAL_FIELDS = { + 'banner_type': ['django.forms.fields.ChoiceField', { + 'widget': 'django.forms.Select', + 'choices': (('info', 'Info'), ('success', 'Success'), ('warning', 'Warning'), ('danger', 'Danger')) + }], +} +CONSTANCE_CONFIG = { + 'BANNER_MESSAGE': ('', 'Some message', str), + 'BANNER_TYPE': ('Info', 'Banner type', 'banner_type'), +} +CONSTANCE_CONFIG_FIELDSETS = { + 'Banner': ('BANNER_MESSAGE', 'BANNER_TYPE'), +} +CONSTANCE_BACKEND = 'constance.backends.database.DatabaseBackend' +CONSTANCE_SUPERUSER_ONLY = True diff --git a/note_kfet/templates/base.html b/note_kfet/templates/base.html index 45dcdfe7..f7794222 100644 --- a/note_kfet/templates/base.html +++ b/note_kfet/templates/base.html @@ -191,7 +191,11 @@ SPDX-License-Identifier: GPL-3.0-or-later {% endblocktrans %} {% endif %} - {# TODO Add banners #} + {% if config.BANNER_MESSAGE %} +
+ {{ config.BANNER_MESSAGE }} +
+ {% endif %} {% block content %}

Default content...

diff --git a/requirements.txt b/requirements.txt index 1d6f5063..c40bf0bb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,7 @@ Django~=5.2.4 django-bootstrap-datepicker-plus~=5.0.5 django-cas-server~=3.1.0 django-colorfield~=0.14.0 +django-constance~=4.3.2 django-crispy-forms~=2.4.0 django-extensions>=4.1.0 django-filter~=25.1 From 883589e08c8eed7cd71b1849fca9221e6a115ad3 Mon Sep 17 00:00:00 2001 From: quark Date: Sun, 6 Jul 2025 16:17:13 +0200 Subject: [PATCH 16/27] django-constance and traduction --- locale/fr/LC_MESSAGES/django.po | 109 ++++++++++++++++++++++---------- note_kfet/settings/base.py | 5 +- note_kfet/templates/base.html | 14 +++- 3 files changed, 93 insertions(+), 35 deletions(-) diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 9f9fb04f..a2973d1c 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: 2025-07-04 21:47+0200\n" +"POT-Creation-Date: 2025-07-06 16:04+0200\n" "PO-Revision-Date: 2022-04-11 22:05+0200\n" "Last-Translator: bleizi \n" "Language-Team: French \n" @@ -357,7 +357,7 @@ msgstr "Détails de l'activité" #: apps/note/models/transactions.py:261 #: apps/note/templates/note/transaction_form.html:17 #: apps/note/templates/note/transaction_form.html:152 -#: note_kfet/templates/base.html:78 +#: note_kfet/templates/base.html:79 msgid "Transfer" msgstr "Virement" @@ -474,7 +474,7 @@ msgstr "Inviter" msgid "Create new activity" msgstr "Créer une nouvelle activité" -#: apps/activity/views.py:71 note_kfet/templates/base.html:96 +#: apps/activity/views.py:71 note_kfet/templates/base.html:97 msgid "Activities" msgstr "Activités" @@ -598,7 +598,7 @@ msgid "order" msgstr "consigne" #: apps/food/models.py:107 apps/food/views.py:34 -#: note_kfet/templates/base.html:72 +#: note_kfet/templates/base.html:73 msgid "Food" msgstr "Bouffe" @@ -2178,7 +2178,7 @@ msgstr "Chercher un bouton" msgid "Update button" msgstr "Modifier le bouton" -#: apps/note/views.py:156 note_kfet/templates/base.html:66 +#: apps/note/views.py:156 note_kfet/templates/base.html:67 msgid "Consumptions" msgstr "Consommations" @@ -2271,7 +2271,7 @@ msgstr "s'applique au club" msgid "role permissions" msgstr "permissions par rôles" -#: apps/permission/signals.py:74 +#: apps/permission/signals.py:75 #, python-brace-format msgid "" "You don't have the permission to change the field {field} on this instance " @@ -2280,7 +2280,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:84 apps/permission/views.py:104 +#: apps/permission/signals.py:85 apps/permission/views.py:104 #, python-brace-format msgid "" "You don't have the permission to add an instance of model {app_label}." @@ -2289,7 +2289,7 @@ msgstr "" "Vous n'avez pas la permission d'ajouter une instance du modèle {app_label}." "{model_name}." -#: apps/permission/signals.py:113 +#: apps/permission/signals.py:114 #, python-brace-format msgid "" "You don't have the permission to delete this instance of model {app_label}." @@ -2377,7 +2377,7 @@ 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:111 note_kfet/templates/base.html:120 +#: apps/permission/views.py:111 note_kfet/templates/base.html:121 msgid "Rights" msgstr "Droits" @@ -2582,7 +2582,7 @@ msgstr "" msgid "Invalidate pre-registration" msgstr "Invalider l'inscription" -#: apps/treasury/apps.py:12 note_kfet/templates/base.html:102 +#: apps/treasury/apps.py:12 note_kfet/templates/base.html:103 msgid "Treasury" msgstr "Trésorerie" @@ -2998,7 +2998,7 @@ msgstr "Gérer les crédits de la Société générale" #: apps/wei/apps.py:10 apps/wei/models.py:42 apps/wei/models.py:43 #: apps/wei/models.py:67 apps/wei/models.py:192 -#: note_kfet/templates/base.html:108 +#: note_kfet/templates/base.html:109 msgid "WEI" msgstr "WEI" @@ -3753,7 +3753,7 @@ msgstr "données json" 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 +#: apps/wrapped/models.py:70 note_kfet/templates/base.html:115 msgid "Wrapped" msgstr "Wrapped" @@ -3786,7 +3786,7 @@ msgid "Copy link" msgstr "Copier le lien" #: apps/wrapped/templates/wrapped/1/wrapped_base.html:16 -#: note_kfet/templates/base.html:14 +#: note_kfet/templates/base.html:15 msgid "The ENS Paris-Saclay BDE note." msgstr "La note du BDE de l'ENS Paris-Saclay." @@ -3908,19 +3908,19 @@ msgstr "Le wrapped est public" msgid "List of wrapped" msgstr "Liste des wrapped" -#: note_kfet/settings/base.py:178 +#: note_kfet/settings/base.py:180 msgid "German" msgstr "Allemand" -#: note_kfet/settings/base.py:179 +#: note_kfet/settings/base.py:181 msgid "English" msgstr "Anglais" -#: note_kfet/settings/base.py:180 +#: note_kfet/settings/base.py:182 msgid "Spanish" msgstr "Espagnol" -#: note_kfet/settings/base.py:181 +#: note_kfet/settings/base.py:183 msgid "French" msgstr "Français" @@ -3981,34 +3981,34 @@ msgstr "" msgid "Reset" msgstr "Réinitialiser" -#: note_kfet/templates/base.html:84 +#: note_kfet/templates/base.html:85 msgid "Users" msgstr "Utilisateur·rices" -#: note_kfet/templates/base.html:90 +#: note_kfet/templates/base.html:91 msgid "Clubs" msgstr "Clubs" -#: note_kfet/templates/base.html:125 +#: note_kfet/templates/base.html:126 msgid "Admin" msgstr "Admin" -#: note_kfet/templates/base.html:139 +#: note_kfet/templates/base.html:140 msgid "My account" msgstr "Mon compte" -#: note_kfet/templates/base.html:144 +#: note_kfet/templates/base.html:145 msgid "Log out" msgstr "Se déconnecter" -#: note_kfet/templates/base.html:153 +#: note_kfet/templates/base.html:154 #: 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:160 +#: note_kfet/templates/base.html:161 #: note_kfet/templates/registration/login.html:6 #: note_kfet/templates/registration/login.html:15 #: note_kfet/templates/registration/login.html:38 @@ -4016,7 +4016,7 @@ msgstr "Inscription" msgid "Log in" msgstr "Se connecter" -#: note_kfet/templates/base.html:174 +#: note_kfet/templates/base.html:175 msgid "" "You are not a BDE member anymore. Please renew your membership if you want " "to use the note." @@ -4024,7 +4024,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:180 +#: note_kfet/templates/base.html:181 msgid "" "Your e-mail address is not validated. Please check your mail inbox and click " "on the validation link." @@ -4032,7 +4032,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:186 +#: note_kfet/templates/base.html:187 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 " @@ -4046,30 +4046,38 @@ 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:209 +#: note_kfet/templates/base.html:214 msgid "Contact us" msgstr "Nous contacter" -#: note_kfet/templates/base.html:211 +#: note_kfet/templates/base.html:216 msgid "Technical Support" msgstr "Support technique" -#: note_kfet/templates/base.html:213 +#: note_kfet/templates/base.html:218 msgid "Charte Info (FR)" msgstr "Charte Info (FR)" -#: note_kfet/templates/base.html:215 +#: note_kfet/templates/base.html:220 msgid "FAQ (FR)" msgstr "FAQ (FR)" -#: note_kfet/templates/base.html:217 +#: note_kfet/templates/base.html:222 msgid "Managed by BDE" msgstr "Gérer par le BDE" -#: note_kfet/templates/base.html:219 +#: note_kfet/templates/base.html:224 msgid "Hosted by Cr@ns" msgstr "Hébergé par le Cr@ans" +#: note_kfet/templates/base.html:266 +msgid "The note is not available for now" +msgstr "La note est indisponible pour le moment" + +#: note_kfet/templates/base.html:268 +msgid "Thank you for your understanding -- The Respos Info of BDE" +msgstr "Merci de votre compréhension -- Les Respos Info du BDE" + #: note_kfet/templates/base_search.html:15 msgid "Search by attribute such as name..." msgstr "Chercher par un attribut tel que le nom..." @@ -4078,6 +4086,41 @@ msgstr "Chercher par un attribut tel que le nom..." msgid "There is no results." msgstr "Il n'y a pas de résultat." +#: note_kfet/templates/cas/logged.html:8 +msgid "" +"

Log In Successful

You have successfully logged into the Central " +"Authentication Service.
For security reasons, please Log Out and Exit " +"your web browser when you are done accessing services that require " +"authentication!" +msgstr "" +"

Connection réussie

Vous vous êtes bien connecté au Service Central d'Authentification." +"
Pour des raisons de sécurité, veuillez vous déconnecter et fermer votre navigateur internet " +"une fois que vous aurez fini d'accéder aux services qui requiert une authentification !" + +#: note_kfet/templates/cas/logged.html:14 +msgid "Log me out from all my sessions" +msgstr "Me déconnecter de toutes mes sessions" + +#: note_kfet/templates/cas/logged.html:20 +msgid "Forget the identity provider" +msgstr "Oublier le fournisseur d'identité" + +#: note_kfet/templates/cas/logged.html:24 +msgid "Logout" +msgstr "Déconnexion" + +#: note_kfet/templates/cas/login.html:11 +msgid "Please log in" +msgstr "Veuillez vous connecter" + +#: note_kfet/templates/cas/login.html:23 +msgid "Login" +msgstr "Connexion" + +#: note_kfet/templates/cas/warn.html:14 +msgid "Connect to the service" +msgstr "Connexion au service" + #: note_kfet/templates/oauth2_provider/application_confirm_delete.html:8 msgid "Are you sure to delete the application" msgstr "Êtes-vous sûr⋅e de vouloir supprimer l'application" diff --git a/note_kfet/settings/base.py b/note_kfet/settings/base.py index dc954453..1fa0a0ea 100644 --- a/note_kfet/settings/base.py +++ b/note_kfet/settings/base.py @@ -327,9 +327,12 @@ CONSTANCE_ADDITIONAL_FIELDS = { } CONSTANCE_CONFIG = { 'BANNER_MESSAGE': ('', 'Some message', str), - 'BANNER_TYPE': ('Info', 'Banner type', 'banner_type'), + 'BANNER_TYPE': ('info', 'Banner type', 'banner_type'), + 'MAINTENANCE': (False, 'check for mainteance mode', bool), + 'MAINTENANCE_MESSAGE': ('', 'Some maintenance message', str), } CONSTANCE_CONFIG_FIELDSETS = { + 'Maintenance': ('MAINTENANCE_MESSAGE', 'MAINTENANCE'), 'Banner': ('BANNER_MESSAGE', 'BANNER_TYPE'), } CONSTANCE_BACKEND = 'constance.backends.database.DatabaseBackend' diff --git a/note_kfet/templates/base.html b/note_kfet/templates/base.html index f7794222..b6762c9b 100644 --- a/note_kfet/templates/base.html +++ b/note_kfet/templates/base.html @@ -5,6 +5,7 @@ SPDX-License-Identifier: GPL-3.0-or-later {% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %} +{% if not config.MAINTENANCE %} @@ -191,7 +192,7 @@ SPDX-License-Identifier: GPL-3.0-or-later {% endblocktrans %} {% endif %} - {% if config.BANNER_MESSAGE %} + {% if config.BANNER_MESSAGE and user.is_authenticated %}
{{ config.BANNER_MESSAGE }}
@@ -257,4 +258,15 @@ SPDX-License-Identifier: GPL-3.0-or-later {% block extrajavascript %}{% endblock %} +{% endif %} +{% if config.MAINTENANCE %} + +
+
+ {% trans "The note is not available for now" %}

+ {{ config.MAINTENANCE_MESSAGE }}

+ {% trans "Thank you for your understanding -- The Respos Info of BDE" %} +
+ +{% endif %} From 432f50e49abe6c2d8726fa2f636a51dd1784c0ab Mon Sep 17 00:00:00 2001 From: quark Date: Wed, 9 Jul 2025 00:15:33 +0200 Subject: [PATCH 17/27] propose fix for #134 (partially tested) --- entrypoint.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/entrypoint.sh b/entrypoint.sh index 7f19eb59..e09832f9 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -11,6 +11,10 @@ else sed -i -e "s/REPLACEME/La Note Kfet \\\\ud83c\\\\udf7b/g" /var/www/note_kfet/note_kfet/fixtures/cas.json fi +# fix lag issues with django-oauth-toolkit (cf https://gitlab.crans.org/bde/nk20/issues/134 ) +sed -i -e "s/all_scopes =/# all_scopes =/g" /var/www/note_kfet/env/lib/python3.11/site-packages/oauth2_provider/views/base.py +sed -i -e 's/kwargs\["scopes_descriptions"\] =/# kwargs\["scopes_descriptions"\] =/g' /var/www/note_kfet/env/lib/python3.11/site-packages/oauth2_provider/views/base.py + # Set up Django project python3 manage.py collectstatic --noinput python3 manage.py compilemessages From cf9d208586832b156eb94db4cc981b456fffbddb Mon Sep 17 00:00:00 2001 From: quark Date: Wed, 9 Jul 2025 15:29:50 +0200 Subject: [PATCH 18/27] scopes --- apps/permission/scopes.py | 13 ++++++++++++- apps/permission/views.py | 22 ++++++++++++++++------ entrypoint.sh | 4 ---- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/apps/permission/scopes.py b/apps/permission/scopes.py index 0702aefa..b1fbad78 100644 --- a/apps/permission/scopes.py +++ b/apps/permission/scopes.py @@ -18,7 +18,18 @@ class PermissionScopes(BaseScopes): and can be useful to make queries through the API with limited privileges. """ - def get_all_scopes(self): + def get_all_scopes(self, **kwargs): + scopes = {} + if 'scopes' in kwargs: + for scope in kwargs['scopes']: + if scope == 'openid' : + scopes['openid'] = "OpenID Connect" + else: + p = Permission.objects.get(id=scope.split('_')[0]) + club = Club.objects.get(id=scope.split('_')[1]) + scopes[scope] = f"{p.description} (club {club.name})" + return scopes + scopes = {f"{p.id}_{club.id}": f"{p.description} (club {club.name})" for p in Permission.objects.all() for club in Club.objects.all()} scopes['openid'] = "OpenID Connect" diff --git a/apps/permission/views.py b/apps/permission/views.py index 39e1f98c..469cdf99 100644 --- a/apps/permission/views.py +++ b/apps/permission/views.py @@ -163,15 +163,25 @@ class ScopesView(LoginRequiredMixin, TemplateView): from oauth2_provider.models import Application from .scopes import PermissionScopes - - scopes = PermissionScopes() + + oidc = False context["scopes"] = {} - all_scopes = scopes.get_all_scopes() for app in Application.objects.filter(user=self.request.user).all(): - available_scopes = scopes.get_available_scopes(app) + available_scopes = PermissionScopes().get_available_scopes(app) context["scopes"][app] = OrderedDict() - items = [(k, v) for (k, v) in all_scopes.items() if k in available_scopes] - # items.sort(key=lambda x: (int(x[0].split("_")[1]), int(x[0].split("_")[0]))) + all_scopes = PermissionScopes().get_all_scopes(scopes=available_scopes) + scopes = {} + for scope in available_scopes: + scopes[scope] = all_scopes[scope] + # remove OIDC scope for sort + if 'openid' in scopes: + del scopes['openid'] + oidc = True + items = [(k, v) for (k, v) in scopes.items()] + items.sort(key=lambda x: (int(x[0].split("_")[1]), int(x[0].split("_")[0]))) + # add oidc if necessary + if oidc: + items.append(('openid', PermissionScopes().get_all_scopes(scopes=['openid'])['openid'])) for k, v in items: context["scopes"][app][k] = v diff --git a/entrypoint.sh b/entrypoint.sh index e09832f9..7f19eb59 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -11,10 +11,6 @@ else sed -i -e "s/REPLACEME/La Note Kfet \\\\ud83c\\\\udf7b/g" /var/www/note_kfet/note_kfet/fixtures/cas.json fi -# fix lag issues with django-oauth-toolkit (cf https://gitlab.crans.org/bde/nk20/issues/134 ) -sed -i -e "s/all_scopes =/# all_scopes =/g" /var/www/note_kfet/env/lib/python3.11/site-packages/oauth2_provider/views/base.py -sed -i -e 's/kwargs\["scopes_descriptions"\] =/# kwargs\["scopes_descriptions"\] =/g' /var/www/note_kfet/env/lib/python3.11/site-packages/oauth2_provider/views/base.py - # Set up Django project python3 manage.py collectstatic --noinput python3 manage.py compilemessages From 82a06c29ddea4d7ec0075914c3de21e4dd62684d Mon Sep 17 00:00:00 2001 From: quark Date: Wed, 9 Jul 2025 16:12:55 +0200 Subject: [PATCH 19/27] linters --- apps/permission/scopes.py | 2 +- apps/permission/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/permission/scopes.py b/apps/permission/scopes.py index b1fbad78..2842546f 100644 --- a/apps/permission/scopes.py +++ b/apps/permission/scopes.py @@ -22,7 +22,7 @@ class PermissionScopes(BaseScopes): scopes = {} if 'scopes' in kwargs: for scope in kwargs['scopes']: - if scope == 'openid' : + if scope == 'openid': scopes['openid'] = "OpenID Connect" else: p = Permission.objects.get(id=scope.split('_')[0]) diff --git a/apps/permission/views.py b/apps/permission/views.py index 469cdf99..30b13316 100644 --- a/apps/permission/views.py +++ b/apps/permission/views.py @@ -163,7 +163,7 @@ class ScopesView(LoginRequiredMixin, TemplateView): from oauth2_provider.models import Application from .scopes import PermissionScopes - + oidc = False context["scopes"] = {} for app in Application.objects.filter(user=self.request.user).all(): From 608804db307319ab415c8af184b215017c797bc5 Mon Sep 17 00:00:00 2001 From: Ehouarn Date: Thu, 10 Jul 2025 20:05:27 +0200 Subject: [PATCH 20/27] Bugs fixed --- apps/food/forms.py | 2 +- apps/food/templates/food/food_detail.html | 3 +++ apps/food/views.py | 2 ++ apps/permission/fixtures/initial.json | 4 ++-- locale/fr/LC_MESSAGES/django.po | 6 +++--- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/apps/food/forms.py b/apps/food/forms.py index dfa32008..13c5cba3 100644 --- a/apps/food/forms.py +++ b/apps/food/forms.py @@ -145,7 +145,7 @@ class AddIngredientForms(forms.ModelForm): polymorphic_ctype__model="transformedfood", is_ready=False, end_of_life='', - ).filter(PermissionBackend.filter_queryset(get_current_request(), TransformedFood, "change")).exclude(pk=pk) + ).filter(PermissionBackend.filter_queryset(get_current_request(), Food, "change")).exclude(pk=pk) class Meta: model = TransformedFood diff --git a/apps/food/templates/food/food_detail.html b/apps/food/templates/food/food_detail.html index 9343f6d1..2d805d6b 100644 --- a/apps/food/templates/food/food_detail.html +++ b/apps/food/templates/food/food_detail.html @@ -12,6 +12,9 @@ SPDX-License-Identifier: GPL-3.0-or-later
    + {% if QR_code %} +
  • {{QR_code}}
  • + {% endif %} {% for field, value in fields %}
  • {{ field }} : {{ value }}
  • {% endfor %} diff --git a/apps/food/views.py b/apps/food/views.py index f8c7977d..b6aa2caa 100644 --- a/apps/food/views.py +++ b/apps/food/views.py @@ -428,6 +428,8 @@ class FoodDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): context["fields"] = [( Food._meta.get_field(field).verbose_name.capitalize(), value) for field, value in fields.items()] + if self.object.QR_code.exists(): + context["QR_code"] = self.object.QR_code.first() context["meals"] = self.object.transformed_ingredient_inv.all() context["update"] = PermissionBackend.check_perm(self.request, "food.change_food") context["add_ingredient"] = (self.object.end_of_life == '' and PermissionBackend.check_perm(self.request, "food.change_transformedfood")) diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index f1f01dcc..a33a3fcf 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -3479,11 +3479,11 @@ "food", "food" ], - "query": "{\"end_of_life\": \"\"}", + "query": "[\"AND\", {\"end_of_life\": \"\"}, [\"OR\", {\"expiry_date__lte\": [\"today\"]}, {\"is_ready\": true}]]", "type": "view", "mask": 1, "permanent": false, - "description": "Voir la bouffe servie" + "description": "Voir la bouffe servie ou en open" } }, { diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 23ba06dd..3e5001c5 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -529,7 +529,7 @@ msgstr "Nom" #, fuzzy #| msgid "QR-code number" msgid "QR code number" -msgstr "numéro de QR-code" +msgstr "Numéro de QR-code" #: apps/food/models.py:23 msgid "Allergen" @@ -623,7 +623,7 @@ msgstr "QR-codes" #: apps/food/models.py:286 #: apps/food/templates/food/transformedfood_update.html:24 msgid "QR-code number" -msgstr "numéro de QR-code" +msgstr "Numéro de QR-code" #: apps/food/templates/food/food_detail.html:19 msgid "Contained in" @@ -4163,7 +4163,7 @@ msgstr "" #, python-brace-format #~ msgid "QR-code number {qr_code_number}" -#~ msgstr "numéro du QR-code {qr_code_number}" +#~ msgstr "Numéro du QR-code {qr_code_number}" #~ msgid "was eaten" #~ msgstr "a été mangé" From 5989721bc9de75d96ec19a0e1e2d18fd177558fc Mon Sep 17 00:00:00 2001 From: Ehouarn Date: Fri, 11 Jul 2025 16:35:49 +0200 Subject: [PATCH 21/27] Easier access to food details --- apps/food/templates/food/food_list.html | 65 +++++++++++++++++++- apps/food/urls.py | 1 + apps/food/views.py | 12 ++++ locale/fr/LC_MESSAGES/django.po | 81 ++++++++++++++----------- 4 files changed, 122 insertions(+), 37 deletions(-) diff --git a/apps/food/templates/food/food_list.html b/apps/food/templates/food/food_list.html index efc7a554..bd54ece9 100644 --- a/apps/food/templates/food/food_list.html +++ b/apps/food/templates/food/food_list.html @@ -7,7 +7,52 @@ SPDX-License-Identifier: GPL-3.0-or-later {% load i18n %} {% block content %} -{{ block.super }} +
    +

    + {{ title }} +

    +
    + +
    +
    + + +
    +
    +
    +
    + +
    + + {% block extra_inside_card %} + {% endblock %} + +
    + {% if table.data %} + {% render_table table %} + {% else %} +
    +
    + {% trans "There is no results." %} +
    +
    + {% endif %} +
    +

    @@ -68,4 +113,20 @@ SPDX-License-Identifier: GPL-3.0-or-later {% endfor %} {% endif %}

    -{% endblock %} + + + + +{% endblock %} \ No newline at end of file diff --git a/apps/food/urls.py b/apps/food/urls.py index 81acccdd..82a7f22e 100644 --- a/apps/food/urls.py +++ b/apps/food/urls.py @@ -18,4 +18,5 @@ urlpatterns = [ path('detail/basic/', views.BasicFoodDetailView.as_view(), name='basicfood_view'), path('detail/transformed/', views.TransformedFoodDetailView.as_view(), name='transformedfood_view'), path('add/ingredient/', views.AddIngredientView.as_view(), name='add_ingredient'), + path('redirect/', views.QRCodeRedirectView.as_view(), name='redirect_view'), ] diff --git a/apps/food/views.py b/apps/food/views.py index b6aa2caa..892df728 100644 --- a/apps/food/views.py +++ b/apps/food/views.py @@ -10,6 +10,7 @@ from django.db.models import Q from django.http import HttpResponseRedirect, Http404 from django.views.generic import DetailView, UpdateView, CreateView from django.views.generic.list import ListView +from django.views.generic.base import RedirectView from django.urls import reverse_lazy from django.utils import timezone from django.utils.translation import gettext_lazy as _ @@ -483,3 +484,14 @@ class TransformedFoodDetailView(FoodDetailView): if Food.objects.filter(pk=kwargs['pk']).count() == 1: kwargs['stop_redirect'] = (Food.objects.get(pk=kwargs['pk']).polymorphic_ctype.model == 'transformedfood') return super().get(*args, **kwargs) + + +class QRCodeRedirectView(RedirectView): + """ + Redirects to the QR code creation page from Food List + """ + def get_redirect_url(self, *args, **kwargs): + slug = self.request.GET.get('slug') + if slug: + return reverse_lazy('food:qrcode_create', kwargs={'slug': slug}) + return reverse_lazy('food:list') diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 3e5001c5..efbdf0da 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: 2025-04-30 11:44+0200\n" +"POT-Creation-Date: 2025-07-11 16:10+0200\n" "PO-Revision-Date: 2022-04-11 22:05+0200\n" "Last-Translator: bleizi \n" "Language-Team: French \n" @@ -563,7 +563,7 @@ msgstr "est prêt" msgid "order" msgstr "consigne" -#: apps/food/models.py:107 apps/food/views.py:34 +#: apps/food/models.py:107 apps/food/views.py:35 #: note_kfet/templates/base.html:72 msgid "Food" msgstr "Bouffe" @@ -625,59 +625,73 @@ msgstr "QR-codes" msgid "QR-code number" msgstr "Numéro de QR-code" -#: apps/food/templates/food/food_detail.html:19 +#: apps/food/templates/food/food_detail.html:22 msgid "Contained in" msgstr "Contenu dans" -#: apps/food/templates/food/food_detail.html:26 +#: apps/food/templates/food/food_detail.html:29 msgid "Contain" msgstr "Contient" -#: apps/food/templates/food/food_detail.html:35 +#: apps/food/templates/food/food_detail.html:38 msgid "Update" msgstr "Modifier" -#: apps/food/templates/food/food_detail.html:40 +#: apps/food/templates/food/food_detail.html:43 msgid "Add to a meal" msgstr "Ajouter à un plat" -#: apps/food/templates/food/food_detail.html:45 +#: apps/food/templates/food/food_detail.html:48 msgid "Manage ingredients" msgstr "Gérer les ingrédients" -#: apps/food/templates/food/food_detail.html:49 +#: apps/food/templates/food/food_detail.html:52 msgid "Return to the food list" msgstr "Retour à la liste de nourriture" -#: apps/food/templates/food/food_list.html:14 +#: apps/food/templates/food/food_list.html:32 +msgid "View food" +msgstr "Voir l'aliment" + +#: apps/food/templates/food/food_list.html:37 +#: note_kfet/templates/base_search.html:15 +msgid "Search by attribute such as name..." +msgstr "Chercher par un attribut tel que le nom..." + +#: apps/food/templates/food/food_list.html:49 +#: note_kfet/templates/base_search.html:23 +msgid "There is no results." +msgstr "Il n'y a pas de résultat." + +#: apps/food/templates/food/food_list.html:58 msgid "Meal served" msgstr "Plat servis" -#: apps/food/templates/food/food_list.html:19 +#: apps/food/templates/food/food_list.html:63 msgid "New meal" msgstr "Nouveau plat" -#: apps/food/templates/food/food_list.html:28 +#: apps/food/templates/food/food_list.html:72 msgid "There is no meal served." msgstr "Il n'y a pas de plat servi." -#: apps/food/templates/food/food_list.html:35 +#: apps/food/templates/food/food_list.html:79 msgid "Free food" msgstr "Open" -#: apps/food/templates/food/food_list.html:42 +#: apps/food/templates/food/food_list.html:86 msgid "There is no free food." msgstr "Il n'y a pas de bouffe en open" -#: apps/food/templates/food/food_list.html:50 +#: apps/food/templates/food/food_list.html:94 msgid "Food of your clubs" msgstr "Bouffe de tes clubs" -#: apps/food/templates/food/food_list.html:56 +#: apps/food/templates/food/food_list.html:100 msgid "Food of club" msgstr "Bouffe du club" -#: apps/food/templates/food/food_list.html:63 +#: apps/food/templates/food/food_list.html:107 msgid "Yours club has not food yet." msgstr "Ton club n'a pas de bouffe pour l'instant" @@ -751,49 +765,49 @@ msgstr "semaines" msgid "and" msgstr "et" -#: apps/food/views.py:118 +#: apps/food/views.py:120 msgid "Add a new QRCode" msgstr "Ajouter un nouveau QR-code" -#: apps/food/views.py:167 +#: apps/food/views.py:169 msgid "Add an aliment" msgstr "Ajouter un nouvel aliment" -#: apps/food/views.py:226 +#: apps/food/views.py:228 msgid "Add a meal" msgstr "Ajouter un plat" -#: apps/food/views.py:262 +#: apps/food/views.py:259 msgid "Manage ingredients of:" msgstr "Gestion des ingrédienrs de :" -#: apps/food/views.py:276 apps/food/views.py:284 +#: apps/food/views.py:273 apps/food/views.py:281 #, python-brace-format msgid "Fully used in {meal}" msgstr "Aliment entièrement utilisé dans : {meal}" -#: apps/food/views.py:323 +#: apps/food/views.py:320 msgid "Add the ingredient:" msgstr "Ajouter l'ingrédient" -#: apps/food/views.py:349 +#: apps/food/views.py:346 #, python-brace-format msgid "Food fully used in : {meal.name}" msgstr "Aliment entièrement utilisé dans : {meal.name}" -#: apps/food/views.py:368 +#: apps/food/views.py:365 msgid "Update an aliment" msgstr "Modifier un aliment" -#: apps/food/views.py:416 +#: apps/food/views.py:413 msgid "Details of:" msgstr "Détails de :" -#: apps/food/views.py:426 apps/treasury/tables.py:149 +#: apps/food/views.py:423 apps/treasury/tables.py:149 msgid "Yes" msgstr "Oui" -#: apps/food/views.py:428 apps/member/models.py:99 apps/treasury/tables.py:149 +#: apps/food/views.py:425 apps/member/models.py:99 apps/treasury/tables.py:149 msgid "No" msgstr "Non" @@ -3933,14 +3947,6 @@ msgstr "Charte Info (FR)" msgid "FAQ (FR)" msgstr "FAQ (FR)" -#: note_kfet/templates/base_search.html:15 -msgid "Search by attribute such as name..." -msgstr "Chercher par un attribut tel que le nom..." - -#: note_kfet/templates/base_search.html:23 -msgid "There is no results." -msgstr "Il n'y a pas de résultat." - #: note_kfet/templates/oauth2_provider/application_confirm_delete.html:8 msgid "Are you sure to delete the application" msgstr "Êtes-vous sûr⋅e de vouloir supprimer l'application" @@ -4161,6 +4167,11 @@ msgstr "" "d'adhésion. Vous devez également valider votre adresse email en suivant le " "lien que vous avez reçu." +#, fuzzy +#~| msgid "QR-code" +#~ msgid "Go to QR-code" +#~ msgstr "QR-code" + #, python-brace-format #~ msgid "QR-code number {qr_code_number}" #~ msgstr "Numéro du QR-code {qr_code_number}" From b97b79e2ea523a4f782cbdc305a586f93d2010cb Mon Sep 17 00:00:00 2001 From: quark Date: Sat, 12 Jul 2025 14:05:53 +0200 Subject: [PATCH 22/27] translation --- locale/fr/LC_MESSAGES/django.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 29f72ecb..76bc8fa7 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -4078,7 +4078,7 @@ msgstr "FAQ (FR)" #: note_kfet/templates/base.html:222 msgid "Managed by BDE" -msgstr "Gérer par le BDE" +msgstr "Géré par le BDE" #: note_kfet/templates/base.html:224 msgid "Hosted by Cr@ns" From 0a261e6ad5514eb458cce1db68d9f147dae6b8c5 Mon Sep 17 00:00:00 2001 From: Ehouarn Date: Sun, 13 Jul 2025 16:38:39 +0200 Subject: [PATCH 23/27] Bugs fixed again (lost in beta) --- apps/food/forms.py | 2 +- apps/food/templates/food/food_detail.html | 33 ++++++++++++----------- apps/food/views.py | 2 ++ 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/apps/food/forms.py b/apps/food/forms.py index dfa32008..13c5cba3 100644 --- a/apps/food/forms.py +++ b/apps/food/forms.py @@ -145,7 +145,7 @@ class AddIngredientForms(forms.ModelForm): polymorphic_ctype__model="transformedfood", is_ready=False, end_of_life='', - ).filter(PermissionBackend.filter_queryset(get_current_request(), TransformedFood, "change")).exclude(pk=pk) + ).filter(PermissionBackend.filter_queryset(get_current_request(), Food, "change")).exclude(pk=pk) class Meta: model = TransformedFood diff --git a/apps/food/templates/food/food_detail.html b/apps/food/templates/food/food_detail.html index 9343f6d1..e82cc907 100644 --- a/apps/food/templates/food/food_detail.html +++ b/apps/food/templates/food/food_detail.html @@ -12,18 +12,21 @@ SPDX-License-Identifier: GPL-3.0-or-later
      + {% if QR_code %} +
    • {{QR_code}}
    • + {% endif %} {% for field, value in fields %}
    • {{ field }} : {{ value }}
    • {% endfor %} {% if meals %} -
    • {% trans "Contained in" %} : +
    • {% trans "Contained in" %} : {% for meal in meals %} - {{ meal.name }}{% if not forloop.last %},{% endif %} + {{ meal.name }}{% if not forloop.last %},{% endif %} {% endfor %}
    • {% endif %} {% if foods %} -
    • {% trans "Contain" %} : +
    • {% trans "Contain" %} : {% for food in foods %} {{ food.name }}{% if not forloop.last %},{% endif %} {% endfor %} @@ -31,23 +34,23 @@ SPDX-License-Identifier: GPL-3.0-or-later {% endif %}
    {% if update %} - - {% trans "Update" %} - + + {% trans "Update" %} + {% endif %} {% if add_ingredient %} - - {% trans "Add to a meal" %} - + + {% trans "Add to a meal" %} + {% endif %} {% if manage_ingredients %} - {% trans "Manage ingredients" %} - + {% trans "Manage ingredients" %} + {% endif %} - - {% trans "Return to the food list" %} - + + {% trans "Return to the food list" %} +
-{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/apps/food/views.py b/apps/food/views.py index 393e4072..bebf1939 100644 --- a/apps/food/views.py +++ b/apps/food/views.py @@ -455,6 +455,8 @@ class FoodDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): context["fields"] = [( Food._meta.get_field(field).verbose_name.capitalize(), value) for field, value in fields.items()] + if self.object.QR_code.exists(): + context["QR_code"] = self.object.QR_code.first() context["meals"] = self.object.transformed_ingredient_inv.all() context["update"] = PermissionBackend.check_perm(self.request, "food.change_food") context["add_ingredient"] = (self.object.end_of_life == '' and PermissionBackend.check_perm(self.request, "food.change_transformedfood")) From 4380414c6b3b839906a7833c148afe807f432541 Mon Sep 17 00:00:00 2001 From: Ehouarn Date: Sun, 13 Jul 2025 18:29:43 +0200 Subject: [PATCH 24/27] Minor fixes --- apps/permission/fixtures/initial.json | 17 ----------------- apps/wei/forms/registration.py | 2 +- apps/wei/views.py | 7 ++++++- 3 files changed, 7 insertions(+), 19 deletions(-) diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index 28d47194..1e738361 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -4810,18 +4810,6 @@ ] } }, - { - "model": "permission.role", - "pk": 16, - "fields": { - "for_club": null, - "name": "\u00c9lectron libre (avec perm)", - "permissions": [ - 22, - 84 - ] - } - }, { "model": "permission.role", "pk": 17, @@ -5093,11 +5081,6 @@ "pk": 15, "fields": {} }, - { - "model": "wei.weirole", - "pk": 16, - "fields": {} - }, { "model": "wei.weirole", "pk": 17, diff --git a/apps/wei/forms/registration.py b/apps/wei/forms/registration.py index 455d77ca..969c8eba 100644 --- a/apps/wei/forms/registration.py +++ b/apps/wei/forms/registration.py @@ -99,7 +99,7 @@ class WEIChooseBusForm(forms.Form): queryset=WEIRole.objects.filter(~Q(name="1A") & ~Q(name="GC WEI")), label=_("WEI Roles"), help_text=_("Select the roles that you are interested in."), - initial=WEIRole.objects.filter(name="Adhérent⋅e WEI").all(), + initial=WEIRole.objects.filter(Q(name="Adhérent⋅e WEI") | Q(name="\u00c9lectron libre")).all(), widget=CheckboxSelectMultiple(), ) diff --git a/apps/wei/views.py b/apps/wei/views.py index bfc7c616..dc9782d7 100644 --- a/apps/wei/views.py +++ b/apps/wei/views.py @@ -567,6 +567,8 @@ class WEIRegister1AView(ProtectQuerysetMixin, ProtectedCreateView): if "caution_type" in form.fields: del form.fields["caution_type"] + if "soge_credit" in form.fields: + form.fields["soge_credit"].help_text = _('Check if you will open a Société Générale account') return form @transaction.atomic @@ -658,6 +660,9 @@ class WEIRegister2AView(ProtectQuerysetMixin, ProtectedCreateView): def get_form(self, form_class=None): form = super().get_form(form_class) form.fields["user"].initial = self.request.user + if "soge_credit" in form.fields: + form.fields["soge_credit"].help_text = _('Check if you will open a Société Générale account') + if "myself" in self.request.path and self.request.user.profile.soge: form.fields["soge_credit"].disabled = True form.fields["soge_credit"].help_text = _("You already opened an account in the Société générale.") @@ -773,7 +778,7 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update form = super().get_form(form_class) form.fields["user"].disabled = True # The auto-json-format may cause issues with the default field remove - if not PermissionBackend.check_perm(self.request, 'wei.change_weiregistration_information_json', self.object): + if "information_json" in form.fields: del form.fields["information_json"] # Masquer le champ caution_check pour tout le monde dans le formulaire de modification if "caution_check" in form.fields: From 3af35dc0fc4617be26eb006560174204097c3291 Mon Sep 17 00:00:00 2001 From: Ehouarn Date: Tue, 15 Jul 2025 17:43:21 +0200 Subject: [PATCH 25/27] Soge Credit changed --- apps/member/models.py | 6 --- apps/treasury/models.py | 4 +- .../0014_weiclub_fee_soge_credit.py | 18 +++++++ apps/wei/models.py | 8 ++- .../wei/templates/wei/weimembership_form.html | 52 +++++++++---------- apps/wei/tests/test_wei_registration.py | 6 +-- apps/wei/views.py | 19 +++---- 7 files changed, 59 insertions(+), 54 deletions(-) create mode 100644 apps/wei/migrations/0014_weiclub_fee_soge_credit.py diff --git a/apps/member/models.py b/apps/member/models.py index 54637847..ea859ea5 100644 --- a/apps/member/models.py +++ b/apps/member/models.py @@ -438,8 +438,6 @@ class Membership(models.Model): ) if hasattr(self, '_force_renew_parent') and self._force_renew_parent: new_membership._force_renew_parent = True - if hasattr(self, '_soge') and self._soge: - new_membership._soge = True if hasattr(self, '_force_save') and self._force_save: new_membership._force_save = True new_membership.save() @@ -458,8 +456,6 @@ class Membership(models.Model): # Renew the previous membership of the parent club parent_membership = parent_membership.first() parent_membership._force_renew_parent = True - if hasattr(self, '_soge'): - parent_membership._soge = True if hasattr(self, '_force_save'): parent_membership._force_save = True parent_membership.renew() @@ -471,8 +467,6 @@ class Membership(models.Model): date_start=self.date_start, ) parent_membership._force_renew_parent = True - if hasattr(self, '_soge'): - parent_membership._soge = True if hasattr(self, '_force_save'): parent_membership._force_save = True parent_membership.save() diff --git a/apps/treasury/models.py b/apps/treasury/models.py index 7695ac02..214203a9 100644 --- a/apps/treasury/models.py +++ b/apps/treasury/models.py @@ -353,7 +353,7 @@ class SogeCredit(models.Model): def amount(self): if self.valid: return self.credit_transaction.total - amount = sum(transaction.total for transaction in self.transactions.all()) + amount = sum(max(transaction.total - 2000, 0) for transaction in self.transactions.all()) if 'wei' in settings.INSTALLED_APPS: from wei.models import WEIMembership if not WEIMembership.objects\ @@ -441,7 +441,7 @@ class SogeCredit(models.Model): With Great Power Comes Great Responsibility... """ - total_fee = sum(transaction.total for transaction in self.transactions.all() if not transaction.valid) + total_fee = sum(max(transaction.total - 2000, 0) for transaction in self.transactions.all() if not transaction.valid) if self.user.note.balance < total_fee: raise ValidationError(_("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.")) diff --git a/apps/wei/migrations/0014_weiclub_fee_soge_credit.py b/apps/wei/migrations/0014_weiclub_fee_soge_credit.py new file mode 100644 index 00000000..c353ec0f --- /dev/null +++ b/apps/wei/migrations/0014_weiclub_fee_soge_credit.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.23 on 2025-07-15 14:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wei', '0013_weiclub_caution_amount_weiregistration_caution_type'), + ] + + operations = [ + migrations.AddField( + model_name='weiclub', + name='fee_soge_credit', + field=models.PositiveIntegerField(default=2000, verbose_name='fee soge credit'), + ), + ] diff --git a/apps/wei/models.py b/apps/wei/models.py index 684feaf8..cf31997f 100644 --- a/apps/wei/models.py +++ b/apps/wei/models.py @@ -38,6 +38,11 @@ class WEIClub(Club): default=0, ) + fee_soge_credit = models.PositiveIntegerField( + verbose_name=_("fee soge credit"), + default=2000, + ) + class Meta: verbose_name = _("WEI") verbose_name_plural = _("WEI") @@ -319,7 +324,8 @@ class WEIRegistration(models.Model): date_start__gte=bde.membership_start, ).exists() - fee = self.wei.membership_fee_paid if self.user.profile.paid \ + fee = self.wei.fee_soge_credit if self.soge_credit \ + else self.wei.membership_fee_paid if self.user.profile.paid \ else self.wei.membership_fee_unpaid if not kfet_member: fee += kfet.membership_fee_paid if self.user.profile.paid \ diff --git a/apps/wei/templates/wei/weimembership_form.html b/apps/wei/templates/wei/weimembership_form.html index a9c85d5d..483e1297 100644 --- a/apps/wei/templates/wei/weimembership_form.html +++ b/apps/wei/templates/wei/weimembership_form.html @@ -137,39 +137,35 @@ SPDX-License-Identifier: GPL-3.0-or-later {% if registration.soge_credit %}
{% blocktrans trimmed %} - The WEI will be paid by Société générale. The membership will be created even if the bank didn't pay the BDE yet. + The WEI will partially be paid by Société générale. The membership will be created even if the bank didn't pay the BDE yet. The membership transaction will be created but will be invalid. You will have to validate it once the bank validated the creation of the account, or to change the payment method. {% endblocktrans %}
- {% else %} -
-
{% trans "Required payments:" %}
-
    -
  • {% blocktrans trimmed with amount=fee|pretty_money %} - Membership fees: {{ amount }} - {% endblocktrans %}
  • - {% if registration.caution_type == 'note' %} -
  • {% blocktrans trimmed with amount=club.caution_amount|pretty_money %} - Deposit (by Note transaction): {{ amount }} - {% endblocktrans %}
  • -
  • {% blocktrans trimmed with total=total_needed|pretty_money %} - Total needed: {{ total }} - {% endblocktrans %}
  • - {% else %} -
  • {% blocktrans trimmed with amount=club.caution_amount|pretty_money %} - Deposit (by check): {{ amount }} - {% endblocktrans %}
  • -
  • {% blocktrans trimmed with total=fee|pretty_money %} - Total needed: {{ total }} - {% endblocktrans %}
  • - {% endif %} -
-

{% blocktrans trimmed with balance=registration.user.note.balance|pretty_money %} - Current balance: {{ balance }} - {% endblocktrans %}

-
{% endif %} +
+
{% trans "Required payments:" %}
+
    +
  • {% blocktrans trimmed with amount=fee|pretty_money %} + Membership fees: {{ amount }} + {% endblocktrans %}
  • + {% if registration.caution_type == 'note' %} +
  • {% blocktrans trimmed with amount=club.caution_amount|pretty_money %} + Deposit (by Note transaction): {{ amount }} + {% endblocktrans %}
  • + {% else %} +
  • {% blocktrans trimmed with amount=club.caution_amount|pretty_money %} + Deposit (by check): {{ amount }} + {% endblocktrans %}
  • + {% endif %} +
  • {% blocktrans trimmed with total=total_needed|pretty_money %} + Total needed: {{ total }} + {% endblocktrans %}
  • +
+

{% blocktrans trimmed with balance=registration.user.note.balance|pretty_money %} + Current balance: {{ balance }} + {% endblocktrans %}

+
{% if not registration.caution_check and not registration.first_year and registration.caution_type == 'check' %}
diff --git a/apps/wei/tests/test_wei_registration.py b/apps/wei/tests/test_wei_registration.py index d286581c..62e73235 100644 --- a/apps/wei/tests/test_wei_registration.py +++ b/apps/wei/tests/test_wei_registration.py @@ -121,6 +121,7 @@ class TestWEIRegistration(TestCase): email="gc.wei@example.com", membership_fee_paid=12500, membership_fee_unpaid=5500, + fee_soge_credit=2000, membership_start=str(self.year + 1) + "-08-01", membership_end=str(self.year + 1) + "-09-30", year=self.year + 1, @@ -157,6 +158,7 @@ class TestWEIRegistration(TestCase): email="wei-updated@example.com", membership_fee_paid=0, membership_fee_unpaid=0, + fee_soge_credit=0, membership_start="2000-08-01", membership_end="2000-09-30", date_start="2000-09-01", @@ -678,11 +680,7 @@ class TestWEIRegistration(TestCase): self.assertTrue(soge_credit.exists()) soge_credit = soge_credit.get() self.assertTrue(membership.transaction in soge_credit.transactions.all()) - self.assertTrue(kfet_membership.transaction in soge_credit.transactions.all()) - self.assertTrue(bde_membership.transaction in soge_credit.transactions.all()) self.assertFalse(membership.transaction.valid) - self.assertFalse(kfet_membership.transaction.valid) - self.assertFalse(bde_membership.transaction.valid) # Check that if the WEI is started, we can't update a wei self.wei.date_start = date(2000, 1, 1) diff --git a/apps/wei/views.py b/apps/wei/views.py index dc9782d7..dbfd1774 100644 --- a/apps/wei/views.py +++ b/apps/wei/views.py @@ -27,7 +27,7 @@ from django.views.generic.edit import BaseFormView, DeleteView from django_tables2 import SingleTableView, MultiTableMixin from api.viewsets import is_regex from member.models import Membership, Club -from note.models import Transaction, NoteClub, Alias, SpecialTransaction, NoteSpecial +from note.models import Transaction, NoteClub, Alias, SpecialTransaction from note.tables import HistoryTable from note_kfet.settings import BASE_DIR from permission.backends import PermissionBackend @@ -662,7 +662,7 @@ class WEIRegister2AView(ProtectQuerysetMixin, ProtectedCreateView): form.fields["user"].initial = self.request.user if "soge_credit" in form.fields: form.fields["soge_credit"].help_text = _('Check if you will open a Société Générale account') - + if "myself" in self.request.path and self.request.user.profile.soge: form.fields["soge_credit"].disabled = True form.fields["soge_credit"].help_text = _("You already opened an account in the Société générale.") @@ -1007,15 +1007,6 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): } ) - if registration.soge_credit: - form.fields["credit_type"].disabled = True - form.fields["credit_type"].initial = NoteSpecial.objects.get(special_type="Virement bancaire") - form.fields["credit_amount"].disabled = True - form.fields["last_name"].disabled = True - form.fields["first_name"].disabled = True - form.fields["bank"].disabled = True - form.fields["bank"].initial = "Société générale" - if 'bus' in form.fields: # For 2A+ and hardcoded 1A form.fields["bus"].widget.attrs["api_url"] = "/api/wei/bus/?wei=" + str(registration.wei.pk) @@ -1060,6 +1051,8 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): membership._force_renew_parent = True fee = club.membership_fee_paid if user.profile.paid else club.membership_fee_unpaid + if registration.soge_credit: + fee = 2000 kfet = club.parent_club bde = kfet.parent_club @@ -1086,7 +1079,7 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): first_name = form.cleaned_data["first_name"] bank = form.cleaned_data["bank"] - if credit_type is None or registration.soge_credit: + if credit_type is None: credit_amount = 0 # Calculer le montant total nécessaire (frais + caution si transaction) @@ -1095,7 +1088,7 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): total_needed += club.caution_amount # Vérifier que l'utilisateur a assez d'argent pour tout payer - if not registration.soge_credit and user.note.balance + credit_amount < total_needed: + if user.note.balance + credit_amount < total_needed: form.add_error('credit_type', _("This user doesn't have enough money to join this club and pay the deposit. " "Current balance: %(balance)d€, credit: %(credit)d€, needed: %(needed)d€") % { From 852651d126686b5feef1d59a165755e89b64ca63 Mon Sep 17 00:00:00 2001 From: Ehouarn Date: Tue, 15 Jul 2025 18:10:28 +0200 Subject: [PATCH 26/27] Rename 'caution' fields into 'deposit' --- apps/wei/api/views.py | 2 +- apps/wei/forms/registration.py | 12 +-- ..._remove_weiclub_caution_amount_and_more.py | 40 ++++++++++ apps/wei/models.py | 12 +-- apps/wei/tables.py | 4 +- apps/wei/templates/wei/base.html | 6 +- .../wei/templates/wei/weimembership_form.html | 12 +-- apps/wei/tests/test_wei_registration.py | 24 +++--- apps/wei/views.py | 76 +++++++++---------- 9 files changed, 114 insertions(+), 74 deletions(-) create mode 100644 apps/wei/migrations/0015_remove_weiclub_caution_amount_and_more.py diff --git a/apps/wei/api/views.py b/apps/wei/api/views.py index f6eecbfc..9f25e4d3 100644 --- a/apps/wei/api/views.py +++ b/apps/wei/api/views.py @@ -77,7 +77,7 @@ class WEIRegistrationViewSet(ReadProtectedModelViewSet): filter_backends = [DjangoFilterBackend, RegexSafeSearchFilter] filterset_fields = ['user', 'user__username', 'user__first_name', 'user__last_name', 'user__email', 'user__note__alias__name', 'user__note__alias__normalized_name', 'wei', 'wei__name', - 'wei__email', 'wei__year', 'soge_credit', 'caution_check', 'birth_date', 'gender', + 'wei__email', 'wei__year', 'soge_credit', 'deposit_check', 'birth_date', 'gender', 'clothing_cut', 'clothing_size', 'first_year', 'emergency_contact_name', 'emergency_contact_phone', ] search_fields = ['$user__username', '$user__first_name', '$user__last_name', '$user__email', diff --git a/apps/wei/forms/registration.py b/apps/wei/forms/registration.py index 969c8eba..7dd40558 100644 --- a/apps/wei/forms/registration.py +++ b/apps/wei/forms/registration.py @@ -24,7 +24,7 @@ class WEIForm(forms.ModelForm): "membership_end": DatePickerInput(), "date_start": DatePickerInput(), "date_end": DatePickerInput(), - "caution_amount": AmountInput(), + "deposit_amount": AmountInput(), } @@ -43,7 +43,7 @@ class WEIRegistrationForm(forms.ModelForm): fields = [ 'user', 'soge_credit', 'birth_date', 'gender', 'clothing_size', 'health_issues', 'emergency_contact_name', 'emergency_contact_phone', - 'first_year', 'information_json', 'caution_check' + 'first_year', 'information_json', 'deposit_check' ] widgets = { "user": Autocomplete( @@ -58,7 +58,7 @@ class WEIRegistrationForm(forms.ModelForm): 'minDate': '1900-01-01', 'maxDate': '2100-01-01' }), - "caution_check": forms.BooleanField( + "deposit_check": forms.BooleanField( required=False, ), } @@ -66,10 +66,10 @@ class WEIRegistrationForm(forms.ModelForm): class WEIRegistration2AForm(WEIRegistrationForm): class Meta(WEIRegistrationForm.Meta): - fields = WEIRegistrationForm.Meta.fields + ['caution_type'] + fields = WEIRegistrationForm.Meta.fields + ['deposit_type'] widgets = WEIRegistrationForm.Meta.widgets.copy() widgets.update({ - "caution_type": forms.RadioSelect(), + "deposit_type": forms.RadioSelect(), }) @@ -173,7 +173,7 @@ class WEIMembership1AForm(WEIMembershipForm): """ Used to confirm registrations of first year members without choosing a bus now. """ - caution_check = None + deposit_check = None roles = None def clean(self): diff --git a/apps/wei/migrations/0015_remove_weiclub_caution_amount_and_more.py b/apps/wei/migrations/0015_remove_weiclub_caution_amount_and_more.py new file mode 100644 index 00000000..950b4965 --- /dev/null +++ b/apps/wei/migrations/0015_remove_weiclub_caution_amount_and_more.py @@ -0,0 +1,40 @@ +# Generated by Django 4.2.23 on 2025-07-15 16:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wei', '0014_weiclub_fee_soge_credit'), + ] + + operations = [ + migrations.RemoveField( + model_name='weiclub', + name='caution_amount', + ), + migrations.RemoveField( + model_name='weiregistration', + name='caution_check', + ), + migrations.RemoveField( + model_name='weiregistration', + name='caution_type', + ), + migrations.AddField( + model_name='weiclub', + name='deposit_amount', + field=models.PositiveIntegerField(default=0, verbose_name='deposit amount'), + ), + migrations.AddField( + model_name='weiregistration', + name='deposit_check', + field=models.BooleanField(default=False, verbose_name='Deposit check given'), + ), + migrations.AddField( + model_name='weiregistration', + name='deposit_type', + field=models.CharField(choices=[('check', 'Check'), ('note', 'Note transaction')], default='check', max_length=16, verbose_name='deposit type'), + ), + ] diff --git a/apps/wei/models.py b/apps/wei/models.py index cf31997f..2c2a0635 100644 --- a/apps/wei/models.py +++ b/apps/wei/models.py @@ -33,8 +33,8 @@ class WEIClub(Club): verbose_name=_("date end"), ) - caution_amount = models.PositiveIntegerField( - verbose_name=_("caution amount"), + deposit_amount = models.PositiveIntegerField( + verbose_name=_("deposit amount"), default=0, ) @@ -202,19 +202,19 @@ class WEIRegistration(models.Model): verbose_name=_("Credit from Société générale"), ) - caution_check = models.BooleanField( + deposit_check = models.BooleanField( default=False, - verbose_name=_("Caution check given") + verbose_name=_("Deposit check given") ) - caution_type = models.CharField( + deposit_type = models.CharField( max_length=16, choices=( ('check', _("Check")), ('note', _("Note transaction")), ), default='check', - verbose_name=_("caution type"), + verbose_name=_("deposit type"), ) birth_date = models.DateField( diff --git a/apps/wei/tables.py b/apps/wei/tables.py index c8837e44..9daadcb6 100644 --- a/apps/wei/tables.py +++ b/apps/wei/tables.py @@ -123,7 +123,7 @@ class WEIRegistrationTable(tables.Table): } model = WEIRegistration template_name = 'django_tables2/bootstrap4.html' - fields = ('user', 'user__first_name', 'user__last_name', 'first_year', 'caution_check', + fields = ('user', 'user__first_name', 'user__last_name', 'first_year', 'deposit_check', 'edit', 'validate', 'delete',) row_attrs = { 'class': 'table-row', @@ -163,7 +163,7 @@ class WEIMembershipTable(tables.Table): model = WEIMembership template_name = 'django_tables2/bootstrap4.html' fields = ('user', 'user__last_name', 'user__first_name', 'registration__gender', 'user__profile__department', - 'year', 'bus', 'team', 'registration__caution_check', ) + 'year', 'bus', 'team', 'registration__deposit_check', ) row_attrs = { 'class': 'table-row', 'id': lambda record: "row-" + str(record.pk), diff --git a/apps/wei/templates/wei/base.html b/apps/wei/templates/wei/base.html index 975b71c8..efb619ac 100644 --- a/apps/wei/templates/wei/base.html +++ b/apps/wei/templates/wei/base.html @@ -49,9 +49,9 @@ SPDX-License-Identifier: GPL-3.0-or-later {% endif %} {% endif %} - {% if club.caution_amount > 0 %} -
{% trans 'Caution amount'|capfirst %}
-
{{ club.caution_amount|pretty_money }}
+ {% if club.deposit_amount > 0 %} +
{% trans 'Deposit amount'|capfirst %}
+
{{ club.deposit_amount|pretty_money }}
{% endif %} {% if "note.view_note"|has_perm:club.note %} diff --git a/apps/wei/templates/wei/weimembership_form.html b/apps/wei/templates/wei/weimembership_form.html index 483e1297..6d5c0b37 100644 --- a/apps/wei/templates/wei/weimembership_form.html +++ b/apps/wei/templates/wei/weimembership_form.html @@ -95,8 +95,8 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% trans "The algorithm didn't run." %}
{% endif %} {% else %} -
{% trans 'caution check given'|capfirst %}
-
{{ registration.caution_check|yesno }}
+
{% trans 'Deposit check given'|capfirst %}
+
{{ registration.deposit_check|yesno }}
{% with information=registration.information %}
{% trans 'preferred bus'|capfirst %}
@@ -149,12 +149,12 @@ SPDX-License-Identifier: GPL-3.0-or-later
  • {% blocktrans trimmed with amount=fee|pretty_money %} Membership fees: {{ amount }} {% endblocktrans %}
  • - {% if registration.caution_type == 'note' %} -
  • {% blocktrans trimmed with amount=club.caution_amount|pretty_money %} + {% if registration.deposit_type == 'note' %} +
  • {% blocktrans trimmed with amount=club.deposit_amount|pretty_money %} Deposit (by Note transaction): {{ amount }} {% endblocktrans %}
  • {% else %} -
  • {% blocktrans trimmed with amount=club.caution_amount|pretty_money %} +
  • {% blocktrans trimmed with amount=club.deposit_amount|pretty_money %} Deposit (by check): {{ amount }} {% endblocktrans %}
  • {% endif %} @@ -167,7 +167,7 @@ SPDX-License-Identifier: GPL-3.0-or-later {% endblocktrans %}

    - {% if not registration.caution_check and not registration.first_year and registration.caution_type == 'check' %} + {% if not registration.deposit_check and not registration.first_year and registration.caution_type == 'check' %}
    {% trans "The user didn't give her/his caution check." %}
    diff --git a/apps/wei/tests/test_wei_registration.py b/apps/wei/tests/test_wei_registration.py index 62e73235..185ee374 100644 --- a/apps/wei/tests/test_wei_registration.py +++ b/apps/wei/tests/test_wei_registration.py @@ -101,7 +101,7 @@ class TestWEIRegistration(TestCase): user_id=self.user.id, wei_id=self.wei.id, soge_credit=True, - caution_check=True, + deposit_check=True, birth_date=date(2000, 1, 1), gender="nonbinary", clothing_cut="male", @@ -127,7 +127,7 @@ class TestWEIRegistration(TestCase): year=self.year + 1, date_start=str(self.year + 1) + "-09-01", date_end=str(self.year + 1) + "-09-03", - caution_amount=12000, + deposit_amount=12000, )) qs = WEIClub.objects.filter(name="Create WEI Test", year=self.year + 1) self.assertTrue(qs.exists()) @@ -163,7 +163,7 @@ class TestWEIRegistration(TestCase): membership_end="2000-09-30", date_start="2000-09-01", date_end="2000-09-03", - caution_amount=12000, + deposit_amount=12000, )) qs = WEIClub.objects.filter(name="Update WEI Test", id=self.wei.id) self.assertRedirects(response, reverse("wei:wei_detail", kwargs=dict(pk=self.wei.pk)), 302, 200) @@ -322,7 +322,7 @@ class TestWEIRegistration(TestCase): bus=[], team=[], roles=[], - caution_type='check' + deposit_type='check' )) self.assertEqual(response.status_code, 200) self.assertFalse(response.context["membership_form"].is_valid()) @@ -340,7 +340,7 @@ class TestWEIRegistration(TestCase): bus=[self.bus.id], team=[self.team.id], roles=[role.id for role in WEIRole.objects.filter(~Q(name="1A") & ~Q(name="GC WEI")).all()], - caution_type='check' + deposit_type='check' )) qs = WEIRegistration.objects.filter(user_id=user.id) self.assertTrue(qs.exists()) @@ -360,7 +360,7 @@ class TestWEIRegistration(TestCase): bus=[self.bus.id], team=[self.team.id], roles=[role.id for role in WEIRole.objects.filter(~Q(name="1A")).all()], - caution_type='check' + deposit_type='check' )) self.assertEqual(response.status_code, 200) self.assertTrue("This user is already registered to this WEI." in str(response.context["form"].errors)) @@ -513,7 +513,7 @@ class TestWEIRegistration(TestCase): team=[self.team.id], roles=[role.id for role in WEIRole.objects.filter(name="Adhérent⋅e WEI").all()], information_json=self.registration.information_json, - caution_type='check' + deposit_type='check' ) ) qs = WEIRegistration.objects.filter(user_id=self.user.id, soge_credit=False, clothing_size="M") @@ -568,7 +568,7 @@ class TestWEIRegistration(TestCase): team=[self.team.id], roles=[role.id for role in WEIRole.objects.filter(name="Adhérent⋅e WEI").all()], information_json=self.registration.information_json, - caution_type='check' + deposit_type='check' ) ) qs = WEIRegistration.objects.filter(user_id=self.user.id, clothing_size="L") @@ -592,7 +592,7 @@ class TestWEIRegistration(TestCase): team=[], roles=[], information_json=self.registration.information_json, - caution_type='check' + deposit_type='check' ) ) self.assertFalse(response.context["membership_form"].is_valid()) @@ -642,7 +642,7 @@ class TestWEIRegistration(TestCase): last_name="admin", first_name="admin", bank="Société générale", - caution_check=True, + deposit_check=True, )) self.assertEqual(response.status_code, 200) self.assertFalse(response.context["form"].is_valid()) @@ -657,7 +657,7 @@ class TestWEIRegistration(TestCase): last_name="admin", first_name="admin", bank="Société générale", - caution_check=True, + deposit_check=True, )) self.assertRedirects(response, reverse("wei:wei_registrations", kwargs=dict(pk=self.registration.wei.pk)), 302, 200) @@ -813,7 +813,7 @@ class TestWeiAPI(TestAPI): user_id=self.user.id, wei_id=self.wei.id, soge_credit=True, - caution_check=True, + deposit_check=True, birth_date=date(2000, 1, 1), gender="nonbinary", clothing_cut="male", diff --git a/apps/wei/views.py b/apps/wei/views.py index dbfd1774..4ac679f9 100644 --- a/apps/wei/views.py +++ b/apps/wei/views.py @@ -560,12 +560,12 @@ class WEIRegister1AView(ProtectQuerysetMixin, ProtectedCreateView): # Cacher les champs pendant l'inscription initiale if "first_year" in form.fields: del form.fields["first_year"] - if "caution_check" in form.fields: - del form.fields["caution_check"] + if "deposit_check" in form.fields: + del form.fields["deposit_check"] if "information_json" in form.fields: del form.fields["information_json"] - if "caution_type" in form.fields: - del form.fields["caution_type"] + if "deposit_type" in form.fields: + del form.fields["deposit_type"] if "soge_credit" in form.fields: form.fields["soge_credit"].help_text = _('Check if you will open a Société Générale account') @@ -670,16 +670,16 @@ class WEIRegister2AView(ProtectQuerysetMixin, ProtectedCreateView): # Cacher les champs pendant l'inscription initiale if "first_year" in form.fields: del form.fields["first_year"] - if "caution_check" in form.fields: - del form.fields["caution_check"] + if "deposit_check" in form.fields: + del form.fields["deposit_check"] if "information_json" in form.fields: del form.fields["information_json"] - # S'assurer que le champ caution_type est obligatoire - if "caution_type" in form.fields: - form.fields["caution_type"].required = True - form.fields["caution_type"].help_text = _("Choose how you want to pay the deposit") - form.fields["caution_type"].widget = forms.RadioSelect(choices=form.fields["caution_type"].choices) + # S'assurer que le champ deposit_type est obligatoire + if "deposit_type" in form.fields: + form.fields["deposit_type"].required = True + form.fields["deposit_type"].help_text = _("Choose how you want to pay the deposit") + form.fields["deposit_type"].widget = forms.RadioSelect(choices=form.fields["deposit_type"].choices) return form @@ -708,7 +708,7 @@ class WEIRegister2AView(ProtectQuerysetMixin, ProtectedCreateView): form.instance.information = information # Sauvegarder le type de caution - form.instance.caution_type = form.cleaned_data["caution_type"] + form.instance.deposit_type = form.cleaned_data["deposit_type"] form.instance.save() if 'treasury' in settings.INSTALLED_APPS: @@ -780,15 +780,15 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update # The auto-json-format may cause issues with the default field remove if "information_json" in form.fields: del form.fields["information_json"] - # Masquer le champ caution_check pour tout le monde dans le formulaire de modification - if "caution_check" in form.fields: - del form.fields["caution_check"] + # Masquer le champ deposit_check pour tout le monde dans le formulaire de modification + if "deposit_check" in form.fields: + del form.fields["deposit_check"] - # S'assurer que le champ caution_type est obligatoire pour les 2A+ - if not self.object.first_year and "caution_type" in form.fields: - form.fields["caution_type"].required = True - form.fields["caution_type"].help_text = _("Choose how you want to pay the deposit") - form.fields["caution_type"].widget = forms.RadioSelect(choices=form.fields["caution_type"].choices) + # S'assurer que le champ deposit_type est obligatoire pour les 2A+ + if not self.object.first_year and "deposit_type" in form.fields: + form.fields["deposit_type"].required = True + form.fields["deposit_type"].help_text = _("Choose how you want to pay the deposit") + form.fields["deposit_type"].widget = forms.RadioSelect(choices=form.fields["deposit_type"].choices) return form @@ -850,8 +850,8 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update form.instance.information = information # Sauvegarder le type de caution pour les 2A+ - if "caution_type" in form.cleaned_data: - form.instance.caution_type = form.cleaned_data["caution_type"] + if "deposit_type" in form.cleaned_data: + form.instance.deposit_type = form.cleaned_data["deposit_type"] form.instance.save() return super().form_valid(form) @@ -957,8 +957,8 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): # Calculer le montant total nécessaire (frais + caution si transaction) total_needed = fee - if registration.caution_type == 'note': - total_needed += registration.wei.caution_amount + if registration.deposit_type == 'note': + total_needed += registration.wei.deposit_amount context["total_needed"] = total_needed form = context["form"] @@ -988,22 +988,22 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): form.fields["last_name"].initial = registration.user.last_name form.fields["first_name"].initial = registration.user.first_name - # Ajouter le champ caution_check uniquement pour les non-première année et le rendre obligatoire + # Ajouter le champ deposit_check uniquement pour les non-première année et le rendre obligatoire if not registration.first_year: - if registration.caution_type == 'check': - form.fields["caution_check"] = forms.BooleanField( + if registration.deposit_type == 'check': + form.fields["deposit_check"] = forms.BooleanField( required=True, - initial=registration.caution_check, - label=_("Caution check given"), + initial=registration.deposit_check, + label=_("Deposit check given"), help_text=_("Please make sure the check is given before validating the registration") ) else: - form.fields["caution_check"] = forms.BooleanField( + form.fields["deposit_check"] = forms.BooleanField( required=True, initial=False, label=_("Create deposit transaction"), help_text=_("A transaction of %(amount).2f€ will be created from the user's Note account") % { - 'amount': registration.wei.caution_amount / 100 + 'amount': registration.wei.deposit_amount / 100 } ) @@ -1039,8 +1039,8 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): club = registration.wei user = registration.user - if "caution_check" in form.data: - registration.caution_check = form.data["caution_check"] == "on" + if "deposit_check" in form.data: + registration.deposit_check = form.data["deposit_check"] == "on" registration.save() membership = form.instance membership.user = user @@ -1084,8 +1084,8 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): # Calculer le montant total nécessaire (frais + caution si transaction) total_needed = fee - if registration.caution_type == 'note': - total_needed += club.caution_amount + if registration.deposit_type == 'note': + total_needed += club.deposit_amount # Vérifier que l'utilisateur a assez d'argent pour tout payer if user.note.balance + credit_amount < total_needed: @@ -1136,14 +1136,14 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): membership.roles.add(WEIRole.objects.get(name="Adhérent⋅e WEI")) # Créer la transaction de caution si nécessaire - if registration.caution_type == 'note': + if registration.deposit_type == 'note': from note.models import Transaction Transaction.objects.create( source=user.note, destination=club.note, quantity=1, - amount=club.caution_amount, - reason=_("Caution %(name)s") % {'name': club.name}, + amount=club.deposit_amount, + reason=_("Deposit %(name)s") % {'name': club.name}, valid=True, ) From a273dc3eef24497a86cd422cca02d508e619367a Mon Sep 17 00:00:00 2001 From: Ehouarn Date: Tue, 15 Jul 2025 18:23:40 +0200 Subject: [PATCH 27/27] Translations --- apps/wei/forms/registration.py | 1 + apps/wei/models.py | 2 +- locale/de/LC_MESSAGES/django.po | 2201 ++++++++----------------------- locale/es/LC_MESSAGES/django.po | 281 ++-- locale/fr/LC_MESSAGES/django.po | 268 ++-- 5 files changed, 867 insertions(+), 1886 deletions(-) diff --git a/apps/wei/forms/registration.py b/apps/wei/forms/registration.py index 7dd40558..35838c2b 100644 --- a/apps/wei/forms/registration.py +++ b/apps/wei/forms/registration.py @@ -25,6 +25,7 @@ class WEIForm(forms.ModelForm): "date_start": DatePickerInput(), "date_end": DatePickerInput(), "deposit_amount": AmountInput(), + "fee_soge_credit": AmountInput(), } diff --git a/apps/wei/models.py b/apps/wei/models.py index 2c2a0635..59f018d7 100644 --- a/apps/wei/models.py +++ b/apps/wei/models.py @@ -39,7 +39,7 @@ class WEIClub(Club): ) fee_soge_credit = models.PositiveIntegerField( - verbose_name=_("fee soge credit"), + verbose_name=_("membership fee (soge credit)"), default=2000, ) diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index f4698e23..7ca27bd5 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-06-02 00:58+0200\n" +"POT-Creation-Date: 2025-07-15 18:18+0200\n" "PO-Revision-Date: 2020-11-16 20:02+0000\n" "Last-Translator: bleizi \n" "Language-Team: German \n" @@ -66,7 +66,7 @@ msgstr "Sie dürfen höchstens 3 Leute zu dieser Veranstaltung einladen." #: apps/note/models/transactions.py:46 apps/note/models/transactions.py:299 #: apps/permission/models.py:329 #: apps/registration/templates/registration/future_profile_detail.html:16 -#: apps/wei/models.py:72 apps/wei/models.py:145 apps/wei/tables.py:282 +#: apps/wei/models.py:77 apps/wei/models.py:150 apps/wei/tables.py:282 #: apps/wei/templates/wei/base.html:26 #: apps/wei/templates/wei/weimembership_form.html:14 apps/wrapped/models.py:16 msgid "name" @@ -101,7 +101,7 @@ msgstr "Vearnstaltungarte" #: apps/activity/models.py:68 #: apps/activity/templates/activity/includes/activity_info.html:19 #: apps/note/models/transactions.py:82 apps/permission/models.py:109 -#: apps/permission/models.py:188 apps/wei/models.py:92 apps/wei/models.py:156 +#: apps/permission/models.py:188 apps/wei/models.py:97 apps/wei/models.py:161 msgid "description" msgstr "Beschreibung" @@ -122,7 +122,7 @@ msgstr "Type" #: 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:294 -#: apps/wei/models.py:185 apps/wei/templates/wei/attribute_bus_1A.html:13 +#: apps/wei/models.py:190 apps/wei/templates/wei/attribute_bus_1A.html:13 #: apps/wei/templates/wei/survey.html:15 msgid "user" msgstr "User" @@ -295,14 +295,14 @@ msgstr "Type" #: 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:116 +#: apps/wei/forms/registration.py:129 msgid "Last name" msgstr "Nachname" #: 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:121 +#: apps/wei/forms/registration.py:134 msgid "First name" msgstr "Vorname" @@ -321,10 +321,6 @@ msgstr "Kontostand" #: 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 -#: env/lib/python3.11/site-packages/django/forms/formsets.py:499 -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_confirm_delete.html:13 -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_detail.html:38 -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/authorized-token-delete.html:7 #: 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 @@ -831,8 +827,6 @@ msgid "weeks" msgstr "" #: apps/food/utils.py:53 -#: env/lib/python3.11/site-packages/django/db/models/base.py:1423 -#: env/lib/python3.11/site-packages/django/forms/models.py:893 #, fuzzy #| msgid "add" msgid "and" @@ -887,12 +881,10 @@ msgid "Details of:" msgstr "WEI Infos" #: apps/food/views.py:447 apps/treasury/tables.py:149 -#: env/lib/python3.11/site-packages/django/forms/widgets.py:795 msgid "Yes" msgstr "Ja" #: apps/food/views.py:449 apps/member/models.py:99 apps/treasury/tables.py:149 -#: env/lib/python3.11/site-packages/django/forms/widgets.py:796 msgid "No" msgstr "Nein" @@ -1030,12 +1022,12 @@ msgid "Check this case if the Société Générale paid the inscription." msgstr "Die Société Générale die Mitgliedschaft bezahlt." #: apps/member/forms.py:185 apps/registration/forms.py:78 -#: apps/wei/forms/registration.py:103 +#: apps/wei/forms/registration.py:116 msgid "Credit type" msgstr "Kredittype" #: apps/member/forms.py:186 apps/registration/forms.py:79 -#: apps/wei/forms/registration.py:104 +#: apps/wei/forms/registration.py:117 msgid "No credit" msgstr "Kein Kredit" @@ -1044,13 +1036,13 @@ msgid "You can credit the note of the user." msgstr "Sie dûrfen diese Note kreditieren." #: apps/member/forms.py:192 apps/registration/forms.py:84 -#: apps/wei/forms/registration.py:109 +#: apps/wei/forms/registration.py:122 msgid "Credit amount" msgstr "Kreditanzahl" #: 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:126 +#: apps/wei/forms/registration.py:139 msgid "Bank" msgstr "Bank" @@ -1311,7 +1303,7 @@ msgid "add to registration form" msgstr "Registrierung validieren" #: apps/member/models.py:268 apps/member/models.py:331 -#: apps/note/models/notes.py:176 apps/wei/models.py:86 +#: apps/note/models/notes.py:176 apps/wei/models.py:91 msgid "club" msgstr "Club" @@ -2038,9 +2030,8 @@ msgstr "" "Zahlungsmethode zugeordnet ist, und einem User oder einem Club möglich" #: apps/note/models/transactions.py:357 apps/note/models/transactions.py:360 -#: apps/note/models/transactions.py:363 apps/wei/views.py:1097 -#: apps/wei/views.py:1101 -#: env/lib/python3.11/site-packages/django/forms/fields.py:91 +#: apps/note/models/transactions.py:363 apps/wei/views.py:1103 +#: apps/wei/views.py:1107 msgid "This field is required." msgstr "Dies ist ein Pflichtfeld." @@ -2080,7 +2071,6 @@ msgstr "Neue Bus" #: apps/wei/templates/wei/bus_detail.html:24 #: apps/wei/templates/wei/busteam_detail.html:20 #: apps/wei/templates/wei/busteam_detail.html:42 -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_detail.html:37 #: note_kfet/templates/oauth2_provider/application_detail.html:38 msgid "Edit" msgstr "Bearbeiten" @@ -2421,19 +2411,16 @@ msgid "Available scopes" msgstr "" #: apps/permission/templates/permission/scopes.html:42 -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_list.html:17 #: note_kfet/templates/oauth2_provider/application_list.html:24 msgid "No applications defined" msgstr "" #: apps/permission/templates/permission/scopes.html:43 -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_list.html:17 #: note_kfet/templates/oauth2_provider/application_list.html:25 msgid "Click here" msgstr "" #: apps/permission/templates/permission/scopes.html:43 -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_list.html:17 #: note_kfet/templates/oauth2_provider/application_list.html:25 msgid "if you want to register a new one" msgstr "" @@ -2552,7 +2539,7 @@ msgstr "Sie haben bereits ein Konto in der Société générale eröffnet." #: apps/registration/templates/registration/future_profile_detail.html:73 #: apps/wei/templates/wei/weimembership_form.html:127 -#: apps/wei/templates/wei/weimembership_form.html:196 +#: apps/wei/templates/wei/weimembership_form.html:192 msgid "Validate registration" msgstr "Registrierung validieren" @@ -3089,8 +3076,8 @@ msgstr "Kreditliste von Société générale" msgid "Manage credits from the Société générale" msgstr "Krediten von der Société générale handeln" -#: apps/wei/apps.py:10 apps/wei/models.py:42 apps/wei/models.py:43 -#: apps/wei/models.py:67 apps/wei/models.py:192 +#: apps/wei/apps.py:10 apps/wei/models.py:47 apps/wei/models.py:48 +#: apps/wei/models.py:72 apps/wei/models.py:197 #: note_kfet/templates/base.html:108 msgid "WEI" msgstr "WEI" @@ -3099,12 +3086,12 @@ msgstr "WEI" msgid "The selected user is not validated. Please validate its account first" msgstr "" -#: apps/wei/forms/registration.py:71 apps/wei/models.py:140 -#: apps/wei/models.py:348 +#: apps/wei/forms/registration.py:84 apps/wei/models.py:145 +#: apps/wei/models.py:354 msgid "bus" msgstr "Bus" -#: apps/wei/forms/registration.py:72 +#: apps/wei/forms/registration.py:85 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." @@ -3113,11 +3100,11 @@ msgstr "" "einen Bus und ein Team zuzuweisen, insbesondere wenn Sie ein freies Elektron " "sind." -#: apps/wei/forms/registration.py:79 +#: apps/wei/forms/registration.py:92 msgid "Team" msgstr "Team" -#: apps/wei/forms/registration.py:81 +#: apps/wei/forms/registration.py:94 msgid "" "Leave this field empty if you won't be in a team (staff, bus chief, free " "electron)" @@ -3125,23 +3112,28 @@ msgstr "" "Lassen Sie dieses Feld leer, wenn Sie nicht in einem Team sind (Mitarbeiter, " "Buschef, freies Elektron)" -#: apps/wei/forms/registration.py:87 apps/wei/forms/registration.py:97 -#: apps/wei/models.py:174 +#: apps/wei/forms/registration.py:100 apps/wei/forms/registration.py:110 +#: apps/wei/models.py:179 msgid "WEI Roles" msgstr "WEI Rollen" -#: apps/wei/forms/registration.py:88 +#: apps/wei/forms/registration.py:101 msgid "Select the roles that you are interested in." msgstr "Wählen Sie die Rollen aus, an denen Sie interessiert sind." -#: apps/wei/forms/registration.py:134 +#: apps/wei/forms/registration.py:160 msgid "This team doesn't belong to the given bus." msgstr "Dieses Team gehört nicht zum angegebenen Bus." #: apps/wei/forms/surveys/wei2021.py:35 apps/wei/forms/surveys/wei2022.py:38 +#: apps/wei/forms/surveys/wei2025.py:36 msgid "Choose a word:" msgstr "Wählen Sie ein Wort:" +#: apps/wei/forms/surveys/wei2025.py:123 +msgid "Rate between 0 and 5." +msgstr "" + #: apps/wei/models.py:25 apps/wei/templates/wei/base.html:36 msgid "year" msgstr "Jahr" @@ -3158,138 +3150,147 @@ msgstr "Abschlussdatum" #: apps/wei/models.py:37 #, fuzzy -#| msgid "total amount" -msgid "caution amount" -msgstr "Totalanzahlt" +#| msgid "Credit amount" +msgid "deposit amount" +msgstr "Kreditanzahl" -#: apps/wei/models.py:76 apps/wei/tables.py:305 +#: apps/wei/models.py:42 +#, fuzzy +#| msgid "No credit" +msgid "membership fee (soge credit)" +msgstr "Kein Kredit" + +#: apps/wei/models.py:81 apps/wei/tables.py:305 #, fuzzy #| msgid "The user joined the bus" msgid "seat count in the bus" msgstr "Der Benutzer ist dem Bus beigetreten" -#: apps/wei/models.py:97 +#: apps/wei/models.py:102 msgid "survey information" msgstr "Umfrage Infos" -#: apps/wei/models.py:98 +#: apps/wei/models.py:103 msgid "Information about the survey for new members, encoded in JSON" msgstr "Informationen zur Umfrage für neue Mitglieder, codiert in JSON" -#: apps/wei/models.py:102 +#: apps/wei/models.py:107 msgid "Bus" msgstr "Bus" -#: apps/wei/models.py:103 apps/wei/templates/wei/weiclub_detail.html:51 +#: apps/wei/models.py:108 apps/wei/templates/wei/weiclub_detail.html:51 msgid "Buses" msgstr "Buses" -#: apps/wei/models.py:149 +#: apps/wei/models.py:154 msgid "color" msgstr "Farbe" -#: apps/wei/models.py:150 +#: apps/wei/models.py:155 msgid "The color of the T-Shirt, stored with its number equivalent" msgstr "Die Farbe des T-Shirts, gespeichert mit der entsprechenden Nummer" -#: apps/wei/models.py:161 +#: apps/wei/models.py:166 msgid "Bus team" msgstr "Bus Team" -#: apps/wei/models.py:162 +#: apps/wei/models.py:167 msgid "Bus teams" msgstr "Bus Teams" -#: apps/wei/models.py:173 +#: apps/wei/models.py:178 msgid "WEI Role" msgstr "WEI Rolle" -#: apps/wei/models.py:197 +#: apps/wei/models.py:202 msgid "Credit from Société générale" msgstr "Kredit von der Société générale" -#: apps/wei/models.py:202 apps/wei/views.py:984 -msgid "Caution check given" +#: apps/wei/models.py:207 apps/wei/templates/wei/weimembership_form.html:98 +#: apps/wei/views.py:997 +#, fuzzy +#| msgid "Caution check given" +msgid "Deposit check given" msgstr "Caution check given" -#: apps/wei/models.py:208 +#: apps/wei/models.py:213 msgid "Check" msgstr "" -#: apps/wei/models.py:209 +#: apps/wei/models.py:214 #, fuzzy #| msgid "transactions" msgid "Note transaction" msgstr "Transaktionen" -#: apps/wei/models.py:212 +#: apps/wei/models.py:217 #, fuzzy -#| msgid "created at" -msgid "caution type" -msgstr "erschafft am" +#| msgid "Credit type" +msgid "deposit type" +msgstr "Kredittype" -#: apps/wei/models.py:216 apps/wei/templates/wei/weimembership_form.html:64 +#: apps/wei/models.py:221 apps/wei/templates/wei/weimembership_form.html:64 msgid "birth date" msgstr "Geburtsdatum" -#: apps/wei/models.py:222 apps/wei/models.py:232 +#: apps/wei/models.py:227 apps/wei/models.py:237 msgid "Male" msgstr "Männlich" -#: apps/wei/models.py:223 apps/wei/models.py:233 +#: apps/wei/models.py:228 apps/wei/models.py:238 msgid "Female" msgstr "Weiblich" -#: apps/wei/models.py:224 +#: apps/wei/models.py:229 msgid "Non binary" msgstr "Nicht binär" -#: apps/wei/models.py:226 apps/wei/templates/wei/attribute_bus_1A.html:22 +#: apps/wei/models.py:231 apps/wei/templates/wei/attribute_bus_1A.html:22 #: apps/wei/templates/wei/weimembership_form.html:55 msgid "gender" msgstr "Geschlecht" -#: apps/wei/models.py:234 +#: apps/wei/models.py:239 msgid "Unisex" msgstr "Unisex" -#: apps/wei/models.py:237 apps/wei/templates/wei/weimembership_form.html:58 +#: apps/wei/models.py:242 apps/wei/templates/wei/weimembership_form.html:58 msgid "clothing cut" msgstr "Kleidung Schnitt" -#: apps/wei/models.py:250 apps/wei/templates/wei/weimembership_form.html:61 +#: apps/wei/models.py:255 apps/wei/templates/wei/weimembership_form.html:61 msgid "clothing size" msgstr "Kleidergröße" -#: apps/wei/models.py:256 +#: apps/wei/models.py:261 msgid "health issues" msgstr "Gesundheitsprobleme" -#: apps/wei/models.py:261 apps/wei/templates/wei/weimembership_form.html:70 +#: apps/wei/models.py:266 apps/wei/templates/wei/weimembership_form.html:70 msgid "emergency contact name" msgstr "Notfall-Kontakt" -#: apps/wei/models.py:262 +#: apps/wei/models.py:267 msgid "The emergency contact must not be a WEI participant" msgstr "Der Notfallkontakt darf kein WEI-Teilnehmer sein" -#: apps/wei/models.py:267 apps/wei/templates/wei/weimembership_form.html:73 +#: apps/wei/models.py:272 apps/wei/templates/wei/weimembership_form.html:73 msgid "emergency contact phone" msgstr "Notfallkontakttelefon" -#: apps/wei/models.py:272 apps/wei/templates/wei/weimembership_form.html:52 +#: apps/wei/models.py:277 apps/wei/templates/wei/weimembership_form.html:52 msgid "first year" msgstr "Erste Jahr" -#: apps/wei/models.py:273 +#: apps/wei/models.py:278 msgid "Tells if the user is new in the school." msgstr "Gibt an, ob der USer neu in der Schule ist." -#: apps/wei/models.py:278 +#: apps/wei/models.py:283 msgid "registration information" msgstr "Registrierung Detailen" -#: apps/wei/models.py:279 +#: apps/wei/models.py:284 msgid "" "Information about the registration (buses for old members, survey for the " "new members), encoded in JSON" @@ -3297,27 +3298,27 @@ msgstr "" "Informationen zur Registrierung (Busse für alte Mitglieder, Umfrage für neue " "Mitglieder), verschlüsselt in JSON" -#: apps/wei/models.py:285 +#: apps/wei/models.py:290 msgid "WEI User" msgstr "WEI User" -#: apps/wei/models.py:286 +#: apps/wei/models.py:291 msgid "WEI Users" msgstr "WEI Users" -#: apps/wei/models.py:358 +#: apps/wei/models.py:364 msgid "team" msgstr "Team" -#: apps/wei/models.py:368 +#: apps/wei/models.py:374 msgid "WEI registration" msgstr "WEI Registrierung" -#: apps/wei/models.py:372 +#: apps/wei/models.py:378 msgid "WEI membership" msgstr "WEI Mitgliedschaft" -#: apps/wei/models.py:373 +#: apps/wei/models.py:379 msgid "WEI memberships" msgstr "WEI Mitgliedschaften" @@ -3349,7 +3350,7 @@ msgstr "Jahr" msgid "preferred bus" msgstr "bevorzugter Bus" -#: apps/wei/tables.py:210 apps/wei/templates/wei/bus_detail.html:36 +#: apps/wei/tables.py:210 apps/wei/templates/wei/bus_detail.html:38 #: apps/wei/templates/wei/busteam_detail.html:52 msgid "Teams" msgstr "Teams" @@ -3429,9 +3430,9 @@ msgstr "WEI Preis (unbezahlte Studenten)" #: apps/wei/templates/wei/base.html:53 #, fuzzy -#| msgid "total amount" -msgid "Caution amount" -msgstr "Totalanzahlt" +#| msgid "Credit amount" +msgid "Deposit amount" +msgstr "Kreditanzahl" #: apps/wei/templates/wei/base.html:74 msgid "WEI list" @@ -3441,7 +3442,7 @@ msgstr "WEI Liste" msgid "Register 1A" msgstr "1A Registrieren" -#: apps/wei/templates/wei/base.html:83 apps/wei/views.py:644 +#: apps/wei/templates/wei/base.html:83 apps/wei/views.py:646 msgid "Register 2A+" msgstr "2A+ Registrieren" @@ -3460,15 +3461,21 @@ msgid "View club" msgstr "Club" #: apps/wei/templates/wei/bus_detail.html:26 +#, fuzzy +#| msgid "survey information" +msgid "Edit information" +msgstr "Umfrage Infos" + +#: apps/wei/templates/wei/bus_detail.html:28 #: apps/wei/templates/wei/busteam_detail.html:24 msgid "Add team" msgstr "Neue Team" -#: apps/wei/templates/wei/bus_detail.html:49 +#: apps/wei/templates/wei/bus_detail.html:51 msgid "Members" msgstr "Mitglied" -#: apps/wei/templates/wei/bus_detail.html:58 +#: apps/wei/templates/wei/bus_detail.html:60 #: apps/wei/templates/wei/busteam_detail.html:62 #: apps/wei/templates/wei/weimembership_list.html:31 msgid "View as PDF" @@ -3476,8 +3483,8 @@ msgstr "Als PDF schauen" #: 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:1159 -#: apps/wei/views.py:1214 apps/wei/views.py:1261 +#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:1165 +#: apps/wei/views.py:1220 apps/wei/views.py:1267 msgid "Survey WEI" msgstr "WEI Umfrage" @@ -3553,10 +3560,6 @@ msgstr "Rohe Umfrageinformationen" msgid "The algorithm didn't run." msgstr "Der Algorithmus wurde nicht ausgeführt." -#: apps/wei/templates/wei/weimembership_form.html:98 -msgid "caution check given" -msgstr "Vorsichtsprüfung gegeben" - #: apps/wei/templates/wei/weimembership_form.html:105 msgid "preferred team" msgstr "bevorzugtes Team" @@ -3593,11 +3596,18 @@ msgid "with the following roles:" msgstr "mit den folgenden Rollen:" #: apps/wei/templates/wei/weimembership_form.html:139 +#, fuzzy +#| msgid "" +#| "The WEI will be paid by Société générale. The membership will be created " +#| "even if the bank didn't pay the BDE yet. The membership transaction will " +#| "be created but will be invalid. You will have to validate it once the " +#| "bank validated the creation of the account, or to change the payment " +#| "method." msgid "" -"The WEI will be paid by Société générale. The membership will be created " -"even if the bank didn't pay the BDE yet. The membership transaction will be " -"created but will be invalid. You will have to validate it once the bank " -"validated the creation of the account, or to change the payment method." +"The WEI will partially be paid by Société générale. The membership will be " +"created even if the bank didn't pay the BDE yet. The membership transaction " +"will be created but will be invalid. You will have to validate it once the " +"bank validated the creation of the account, or to change the payment method." msgstr "" "Das WEI wird von der Société générale bezahlt. Die Mitgliedschaft wird auch " "dann erstellt, wenn die Bank die BDE noch nicht bezahlt hat. Die " @@ -3620,27 +3630,26 @@ msgstr "Mitgliedschaftpreis (bezahlte Studenten)" msgid "Deposit (by Note transaction): %(amount)s" msgstr "" -#: apps/wei/templates/wei/weimembership_form.html:156 -#: apps/wei/templates/wei/weimembership_form.html:163 -#, python-format -msgid "Total needed: %(total)s" -msgstr "" - -#: apps/wei/templates/wei/weimembership_form.html:160 +#: apps/wei/templates/wei/weimembership_form.html:157 #, python-format msgid "Deposit (by check): %(amount)s" msgstr "" -#: apps/wei/templates/wei/weimembership_form.html:168 +#: apps/wei/templates/wei/weimembership_form.html:161 +#, python-format +msgid "Total needed: %(total)s" +msgstr "" + +#: apps/wei/templates/wei/weimembership_form.html:165 #, python-format msgid "Current balance: %(balance)s" msgstr "" -#: apps/wei/templates/wei/weimembership_form.html:176 +#: apps/wei/templates/wei/weimembership_form.html:172 msgid "The user didn't give her/his caution check." msgstr "Der User hat nicht sein Vorsichtsprüfung gegeben." -#: apps/wei/templates/wei/weimembership_form.html:184 +#: apps/wei/templates/wei/weimembership_form.html:180 msgid "" "This user is not a member of the Kfet club for the coming year. The " "membership will be processed automatically, the WEI registration includes " @@ -3732,11 +3741,17 @@ msgstr "WEI Team bearbeiten" msgid "Register first year student to the WEI" msgstr "Registrieren Sie den Erstsemester beim WEI" -#: apps/wei/views.py:580 apps/wei/views.py:689 +#: apps/wei/views.py:571 apps/wei/views.py:664 +#, fuzzy +#| msgid "Check this case if the Société Générale paid the inscription." +msgid "Check if you will open a Société Générale account" +msgstr "Die Société Générale die Mitgliedschaft bezahlt." + +#: apps/wei/views.py:582 apps/wei/views.py:694 msgid "This user is already registered to this WEI." msgstr "Dieser Benutzer ist bereits bei dieser WEI registriert." -#: apps/wei/views.py:585 +#: apps/wei/views.py:587 msgid "" "This user can't be in her/his first year since he/she has already " "participated to a WEI." @@ -3744,29 +3759,29 @@ msgstr "" "Dieser Benutzer kann nicht in seinem ersten Jahr sein, da er bereits an " "einer WEI teilgenommen hat." -#: apps/wei/views.py:608 +#: apps/wei/views.py:610 msgid "Register old student to the WEI" msgstr "Registrieren Sie einen alten Studenten beim WEI" -#: apps/wei/views.py:663 apps/wei/views.py:768 +#: apps/wei/views.py:668 apps/wei/views.py:773 msgid "You already opened an account in the Société générale." msgstr "Sie haben bereits ein Konto in der Société générale eröffnet." -#: apps/wei/views.py:676 apps/wei/views.py:785 +#: apps/wei/views.py:681 apps/wei/views.py:790 msgid "Choose how you want to pay the deposit" msgstr "" -#: apps/wei/views.py:728 +#: apps/wei/views.py:733 msgid "Update WEI Registration" msgstr "WEI Registrierung aktualisieren" -#: apps/wei/views.py:810 +#: apps/wei/views.py:816 #, fuzzy #| msgid "The BDE membership is included in the WEI registration." msgid "No membership found for this registration" msgstr "Die BDE-Mitgliedschaft ist in der WEI-Registrierung enthalten." -#: apps/wei/views.py:819 +#: apps/wei/views.py:825 #, fuzzy #| msgid "" #| "You don't have the permission to add an instance of model {app_label}." @@ -3776,7 +3791,7 @@ msgstr "" "Sie haben nicht die Berechtigung, eine Instanz von model {app_label}. " "{model_name} hinzufügen." -#: apps/wei/views.py:825 +#: apps/wei/views.py:831 #, fuzzy, python-format #| msgid "" #| "You don't have the permission to delete this instance of model " @@ -3786,19 +3801,19 @@ msgstr "" "Sie haben nicht die Berechtigung, eine Instanz von model {app_label}. " "{model_name} zulöschen." -#: apps/wei/views.py:870 +#: apps/wei/views.py:876 msgid "Delete WEI registration" msgstr "WEI Registrierung löschen" -#: apps/wei/views.py:881 +#: apps/wei/views.py:887 msgid "You don't have the right to delete this WEI registration." msgstr "Sie haben nicht das Recht, diese WEI-Registrierung zu löschen." -#: apps/wei/views.py:899 +#: apps/wei/views.py:905 msgid "Validate WEI registration" msgstr "Überprüfen Sie die WEI-Registrierung" -#: apps/wei/views.py:985 +#: apps/wei/views.py:998 #, fuzzy #| msgid "Please ask the user to credit its note before deleting this credit." msgid "Please make sure the check is given before validating the registration" @@ -3806,19 +3821,19 @@ msgstr "" "Bitte bitten Sie den Benutzer, seine Note gutzuschreiben, bevor Sie diese " "Kredit löschen." -#: apps/wei/views.py:991 +#: apps/wei/views.py:1004 #, fuzzy #| msgid "credit transaction" msgid "Create deposit transaction" msgstr "Kredit Transaktion" -#: apps/wei/views.py:992 +#: apps/wei/views.py:1005 #, python-format msgid "" "A transaction of %(amount).2f€ will be created from the user's Note account" msgstr "" -#: apps/wei/views.py:1087 +#: apps/wei/views.py:1093 #, fuzzy, python-format #| msgid "" #| "This user don't have enough money to join this club, and can't have a " @@ -3830,21 +3845,21 @@ msgstr "" "Diese User hat nicht genug Geld um Mitglied zu werden, und darf nich im Rot " "sein." -#: apps/wei/views.py:1140 +#: apps/wei/views.py:1146 #, fuzzy, python-format #| msgid "created at" -msgid "Caution %(name)s" +msgid "Deposit %(name)s" msgstr "erschafft am" -#: apps/wei/views.py:1354 +#: apps/wei/views.py:1360 msgid "Attribute buses to first year members" msgstr "" -#: apps/wei/views.py:1379 +#: apps/wei/views.py:1386 msgid "Attribute bus" msgstr "" -#: apps/wei/views.py:1419 +#: apps/wei/views.py:1426 msgid "" "No first year student without a bus found. Either all of them have a bus, or " "none has filled the survey yet." @@ -4039,1511 +4054,6 @@ msgstr "" msgid "List of wrapped" msgstr "" -#: env/lib/python3.11/site-packages/django/contrib/messages/apps.py:15 -msgid "Messages" -msgstr "" - -#: env/lib/python3.11/site-packages/django/contrib/sitemaps/apps.py:8 -msgid "Site Maps" -msgstr "" - -#: env/lib/python3.11/site-packages/django/contrib/staticfiles/apps.py:9 -msgid "Static Files" -msgstr "" - -#: env/lib/python3.11/site-packages/django/contrib/syndication/apps.py:7 -#, fuzzy -#| msgid "Invitation" -msgid "Syndication" -msgstr "Einladung" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -#: env/lib/python3.11/site-packages/django/core/paginator.py:30 -msgid "…" -msgstr "" - -#: env/lib/python3.11/site-packages/django/core/paginator.py:50 -msgid "That page number is not an integer" -msgstr "" - -#: env/lib/python3.11/site-packages/django/core/paginator.py:52 -msgid "That page number is less than 1" -msgstr "" - -#: env/lib/python3.11/site-packages/django/core/paginator.py:54 -#, fuzzy -#| msgid "There is no results." -msgid "That page contains no results" -msgstr "Es gibt keine Ergebnisse." - -#: env/lib/python3.11/site-packages/django/core/validators.py:22 -#, fuzzy -#| msgid "Email validation" -msgid "Enter a valid value." -msgstr "Email validierung" - -#: env/lib/python3.11/site-packages/django/core/validators.py:104 -#: env/lib/python3.11/site-packages/django/forms/fields.py:752 -#, fuzzy -#| msgid "Email validation" -msgid "Enter a valid URL." -msgstr "Email validierung" - -#: env/lib/python3.11/site-packages/django/core/validators.py:165 -#, fuzzy -#| msgid "Email validation" -msgid "Enter a valid integer." -msgstr "Email validierung" - -#: env/lib/python3.11/site-packages/django/core/validators.py:176 -#, fuzzy -#| msgid "Email validation" -msgid "Enter a valid email address." -msgstr "Email validierung" - -#. Translators: "letters" means latin letters: a-z and A-Z. -#: env/lib/python3.11/site-packages/django/core/validators.py:259 -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:267 -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:281 -#: env/lib/python3.11/site-packages/django/core/validators.py:289 -#: env/lib/python3.11/site-packages/django/core/validators.py:318 -#, fuzzy -#| msgid "This activity is not validated yet." -msgid "Enter a valid IPv4 address." -msgstr "Diese Veranstaltung ist noch nicht bestätigt." - -#: env/lib/python3.11/site-packages/django/core/validators.py:298 -#: env/lib/python3.11/site-packages/django/core/validators.py:319 -#, fuzzy -#| msgid "This activity is not validated yet." -msgid "Enter a valid IPv6 address." -msgstr "Diese Veranstaltung ist noch nicht bestätigt." - -#: env/lib/python3.11/site-packages/django/core/validators.py:310 -#: env/lib/python3.11/site-packages/django/core/validators.py:317 -#, fuzzy -#| msgid "This activity is not validated yet." -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Diese Veranstaltung ist noch nicht bestätigt." - -#: env/lib/python3.11/site-packages/django/core/validators.py:353 -msgid "Enter only digits separated by commas." -msgstr "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:359 -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:394 -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:403 -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:412 -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:422 -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:440 -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:463 -#: env/lib/python3.11/site-packages/django/forms/fields.py:347 -#: env/lib/python3.11/site-packages/django/forms/fields.py:386 -#, fuzzy -#| msgid "phone number" -msgid "Enter a number." -msgstr "Telefonnummer" - -#: env/lib/python3.11/site-packages/django/core/validators.py:465 -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:470 -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:475 -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:546 -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -#: env/lib/python3.11/site-packages/django/core/validators.py:607 -msgid "Null characters are not allowed." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/base.py:1425 -#, fuzzy, python-format -#| msgid "A template with this name already exist" -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Eine Vorlage mit diesem Namen ist bereits vorhanden" - -#: env/lib/python3.11/site-packages/django/db/models/constraints.py:17 -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:128 -#, fuzzy, python-format -#| msgid "This activity is not validated yet." -msgid "Value %(value)r is not a valid choice." -msgstr "Diese Veranstaltung ist noch nicht bestätigt." - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:129 -#, fuzzy -#| msgid "This image cannot be loaded." -msgid "This field cannot be null." -msgstr "Dieses Bild kann nicht geladen werden." - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:130 -#, fuzzy -#| msgid "This image cannot be loaded." -msgid "This field cannot be blank." -msgstr "Dieses Bild kann nicht geladen werden." - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:131 -#, fuzzy, python-format -#| msgid "A template with this name already exist" -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Eine Vorlage mit diesem Namen ist bereits vorhanden" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:135 -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:173 -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1094 -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1095 -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1097 -msgid "Boolean (Either True or False)" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1147 -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1149 -msgid "String (unlimited)" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1253 -msgid "Comma-separated integers" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1354 -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1358 -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1493 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1362 -msgid "Date (without time)" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1489 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1497 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1502 -msgid "Date (with time)" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1626 -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1628 -#, fuzzy -#| msgid "phone number" -msgid "Decimal number" -msgstr "Telefonnummer" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1789 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1793 -#, fuzzy -#| msgid "action" -msgid "Duration" -msgstr "Aktion" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1845 -#, fuzzy -#| msgid "address" -msgid "Email address" -msgstr "Adresse" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1870 -msgid "File path" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1948 -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1950 -#, fuzzy -#| msgid "phone number" -msgid "Floating point number" -msgstr "Telefonnummer" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1990 -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1992 -msgid "Integer" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2088 -msgid "Big (8 byte) integer" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2105 -msgid "Small integer" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2113 -#, fuzzy -#| msgid "IP Address" -msgid "IPv4 address" -msgstr "IP Adresse" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2144 -#, fuzzy -#| msgid "IP Address" -msgid "IP address" -msgstr "IP Adresse" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2237 -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2238 -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2240 -msgid "Boolean (Either True, False or None)" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2291 -msgid "Positive big integer" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2306 -msgid "Positive integer" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2321 -msgid "Positive small integer" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2337 -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2373 -msgid "Text" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2448 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2452 -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2456 -msgid "Time" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2564 -msgid "URL" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2588 -msgid "Raw binary data" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2653 -#, fuzzy, python-format -#| msgid "This activity is not validated yet." -msgid "“%(value)s” is not a valid UUID." -msgstr "Diese Veranstaltung ist noch nicht bestätigt." - -#: env/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2655 -#, fuzzy -#| msgid "Invoice identifier" -msgid "Universally unique identifier" -msgstr "Rechnungskennung" - -#: env/lib/python3.11/site-packages/django/db/models/fields/files.py:232 -msgid "File" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/files.py:393 -msgid "Image" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/json.py:26 -#, fuzzy -#| msgid "Object" -msgid "A JSON object" -msgstr "Objekt" - -#: env/lib/python3.11/site-packages/django/db/models/fields/json.py:28 -#, fuzzy -#| msgid "This address must be valid." -msgid "Value must be valid JSON." -msgstr "Diese Adresse muss gültig sein." - -#: env/lib/python3.11/site-packages/django/db/models/fields/related.py:919 -#, fuzzy, python-format -#| msgid "A template with this name already exist" -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Eine Vorlage mit diesem Namen ist bereits vorhanden" - -#: env/lib/python3.11/site-packages/django/db/models/fields/related.py:921 -msgid "Foreign Key (type determined by related field)" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/related.py:1212 -msgid "One-to-one relationship" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/related.py:1269 -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/related.py:1271 -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -#: env/lib/python3.11/site-packages/django/db/models/fields/related.py:1319 -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the label -#: env/lib/python3.11/site-packages/django/forms/boundfield.py:184 -msgid ":?.!" -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:298 -#, fuzzy -#| msgid "phone number" -msgid "Enter a whole number." -msgstr "Telefonnummer" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:467 -#: env/lib/python3.11/site-packages/django/forms/fields.py:1241 -#, fuzzy -#| msgid "Email validation" -msgid "Enter a valid date." -msgstr "Email validierung" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:490 -#: env/lib/python3.11/site-packages/django/forms/fields.py:1242 -#, fuzzy -#| msgid "Email validation" -msgid "Enter a valid time." -msgstr "Email validierung" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:517 -#, fuzzy -#| msgid "Email validation" -msgid "Enter a valid date/time." -msgstr "Email validierung" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:551 -#, fuzzy -#| msgid "Email validation" -msgid "Enter a valid duration." -msgstr "Email validierung" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:552 -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:621 -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:622 -msgid "No file was submitted." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:623 -msgid "The submitted file is empty." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:625 -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:630 -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:694 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:857 -#: env/lib/python3.11/site-packages/django/forms/fields.py:949 -#: env/lib/python3.11/site-packages/django/forms/models.py:1566 -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:951 -#: env/lib/python3.11/site-packages/django/forms/fields.py:1070 -#: env/lib/python3.11/site-packages/django/forms/models.py:1564 -#, fuzzy -#| msgid "Email validation" -msgid "Enter a list of values." -msgstr "Email validierung" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:1071 -#, fuzzy -#| msgid "phone number" -msgid "Enter a complete value." -msgstr "Telefonnummer" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:1313 -#, fuzzy -#| msgid "Email validation" -msgid "Enter a valid UUID." -msgstr "Email validierung" - -#: env/lib/python3.11/site-packages/django/forms/fields.py:1343 -#, fuzzy -#| msgid "Email validation" -msgid "Enter a valid JSON." -msgstr "Email validierung" - -#. Translators: This is the default suffix added to form field labels -#: env/lib/python3.11/site-packages/django/forms/forms.py:98 -msgid ":" -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/forms.py:244 -#: env/lib/python3.11/site-packages/django/forms/forms.py:328 -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/formsets.py:63 -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/formsets.py:67 -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/forms/formsets.py:72 -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/forms/formsets.py:484 -#: env/lib/python3.11/site-packages/django/forms/formsets.py:491 -msgid "Order" -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/models.py:886 -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/models.py:891 -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/models.py:898 -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/models.py:907 -msgid "Please correct the duplicate values below." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/models.py:1338 -msgid "The inline value did not match the parent instance." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/models.py:1429 -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/models.py:1568 -#, fuzzy, python-format -#| msgid "This activity is not validated yet." -msgid "“%(pk)s” is not a valid value." -msgstr "Diese Veranstaltung ist noch nicht bestätigt." - -#: env/lib/python3.11/site-packages/django/forms/utils.py:226 -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/widgets.py:463 -msgid "Clear" -msgstr "" - -#: env/lib/python3.11/site-packages/django/forms/widgets.py:464 -#, fuzzy -#| msgid "Current activity" -msgid "Currently" -msgstr "Aktuelle Veranstaltung" - -#: env/lib/python3.11/site-packages/django/forms/widgets.py:465 -#, fuzzy -#| msgid "change" -msgid "Change" -msgstr "bearbeiten" - -#: env/lib/python3.11/site-packages/django/forms/widgets.py:794 -msgid "Unknown" -msgstr "" - -#. Translators: Please do not add spaces around commas. -#: env/lib/python3.11/site-packages/django/template/defaultfilters.py:874 -msgid "yes,no,maybe" -msgstr "" - -#: env/lib/python3.11/site-packages/django/template/defaultfilters.py:904 -#: env/lib/python3.11/site-packages/django/template/defaultfilters.py:921 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/template/defaultfilters.py:923 -#, python-format -msgid "%s KB" -msgstr "" - -#: env/lib/python3.11/site-packages/django/template/defaultfilters.py:925 -#, python-format -msgid "%s MB" -msgstr "" - -#: env/lib/python3.11/site-packages/django/template/defaultfilters.py:927 -#, python-format -msgid "%s GB" -msgstr "" - -#: env/lib/python3.11/site-packages/django/template/defaultfilters.py:929 -#, python-format -msgid "%s TB" -msgstr "" - -#: env/lib/python3.11/site-packages/django/template/defaultfilters.py:931 -#, python-format -msgid "%s PB" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dateformat.py:73 -msgid "p.m." -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dateformat.py:74 -msgid "a.m." -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dateformat.py:79 -msgid "PM" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dateformat.py:80 -msgid "AM" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dateformat.py:152 -msgid "midnight" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dateformat.py:154 -msgid "noon" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:7 -msgid "Monday" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:8 -msgid "Tuesday" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:9 -msgid "Wednesday" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:10 -msgid "Thursday" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:11 -msgid "Friday" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:12 -msgid "Saturday" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:13 -msgid "Sunday" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:16 -msgid "Mon" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:17 -msgid "Tue" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:18 -msgid "Wed" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:19 -msgid "Thu" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:20 -msgid "Fri" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:21 -msgid "Sat" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:22 -msgid "Sun" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:25 -msgid "January" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:26 -msgid "February" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:27 -#, fuzzy -#| msgid "Search WEI" -msgid "March" -msgstr "WEI finden" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:28 -msgid "April" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:29 -msgid "May" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:30 -msgid "June" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:31 -msgid "July" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:32 -msgid "August" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:33 -#, fuzzy -#| msgid "member" -msgid "September" -msgstr "Mitglied" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:34 -msgid "October" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:35 -#, fuzzy -#| msgid "member" -msgid "November" -msgstr "Mitglied" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:36 -#, fuzzy -#| msgid "member" -msgid "December" -msgstr "Mitglied" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:39 -#, fuzzy -#| msgid "add" -msgid "jan" -msgstr "hinzufügen" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:40 -#, fuzzy -#| msgid "fee" -msgid "feb" -msgstr "Preis" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:41 -msgid "mar" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:42 -msgid "apr" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:43 -msgid "may" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:44 -#, fuzzy -#| msgid "add" -msgid "jun" -msgstr "hinzufügen" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:45 -msgid "jul" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:46 -msgid "aug" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:47 -msgid "sep" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:48 -#, fuzzy -#| msgid "product" -msgid "oct" -msgstr "Produkt" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:49 -msgid "nov" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:50 -msgid "dec" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:53 -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:54 -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:55 -#, fuzzy -#| msgid "Search WEI" -msgctxt "abbrev. month" -msgid "March" -msgstr "WEI finden" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:56 -msgctxt "abbrev. month" -msgid "April" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:57 -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:58 -msgctxt "abbrev. month" -msgid "June" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:59 -msgctxt "abbrev. month" -msgid "July" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:60 -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:61 -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:62 -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:63 -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:64 -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:67 -msgctxt "alt. month" -msgid "January" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:68 -msgctxt "alt. month" -msgid "February" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:69 -#, fuzzy -#| msgid "Search WEI" -msgctxt "alt. month" -msgid "March" -msgstr "WEI finden" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:70 -msgctxt "alt. month" -msgid "April" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:71 -msgctxt "alt. month" -msgid "May" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:72 -msgctxt "alt. month" -msgid "June" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:73 -msgctxt "alt. month" -msgid "July" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:74 -msgctxt "alt. month" -msgid "August" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:75 -#, fuzzy -#| msgid "member" -msgctxt "alt. month" -msgid "September" -msgstr "Mitglied" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:76 -msgctxt "alt. month" -msgid "October" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:77 -#, fuzzy -#| msgid "member" -msgctxt "alt. month" -msgid "November" -msgstr "Mitglied" - -#: env/lib/python3.11/site-packages/django/utils/dates.py:78 -#, fuzzy -#| msgid "member" -msgctxt "alt. month" -msgid "December" -msgstr "Mitglied" - -#: env/lib/python3.11/site-packages/django/utils/ipv6.py:20 -#, fuzzy -#| msgid "This activity is not validated yet." -msgid "This is not a valid IPv6 address." -msgstr "Diese Veranstaltung ist noch nicht bestätigt." - -#: env/lib/python3.11/site-packages/django/utils/text.py:138 -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/text.py:323 -msgid "or" -msgstr "" - -#. Translators: This string is used as a separator between list elements -#: env/lib/python3.11/site-packages/django/utils/text.py:342 -#: env/lib/python3.11/site-packages/django/utils/timesince.py:135 -msgid ", " -msgstr "" - -#: env/lib/python3.11/site-packages/django/utils/timesince.py:8 -#, fuzzy, python-format -#| msgid "year" -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "Jahr" -msgstr[1] "Jahr" - -#: env/lib/python3.11/site-packages/django/utils/timesince.py:9 -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/utils/timesince.py:10 -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/utils/timesince.py:11 -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/utils/timesince.py:12 -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/utils/timesince.py:13 -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -#: env/lib/python3.11/site-packages/django/views/csrf.py:111 -msgid "Forbidden" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/csrf.py:112 -msgid "CSRF verification failed. Request aborted." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/csrf.py:116 -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/csrf.py:122 -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/csrf.py:127 -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/csrf.py:136 -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/csrf.py:142 -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/csrf.py:148 -msgid "More information is available with DEBUG=True." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/generic/dates.py:44 -#, fuzzy -#| msgid "No reason specified" -msgid "No year specified" -msgstr "Kein Grund gegeben" - -#: env/lib/python3.11/site-packages/django/views/generic/dates.py:64 -#: env/lib/python3.11/site-packages/django/views/generic/dates.py:115 -#: env/lib/python3.11/site-packages/django/views/generic/dates.py:214 -msgid "Date out of range" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/generic/dates.py:94 -#, fuzzy -#| msgid "No reason specified" -msgid "No month specified" -msgstr "Kein Grund gegeben" - -#: env/lib/python3.11/site-packages/django/views/generic/dates.py:147 -#, fuzzy -#| msgid "No reason specified" -msgid "No day specified" -msgstr "Kein Grund gegeben" - -#: env/lib/python3.11/site-packages/django/views/generic/dates.py:194 -#, fuzzy -#| msgid "No reason specified" -msgid "No week specified" -msgstr "Kein Grund gegeben" - -#: env/lib/python3.11/site-packages/django/views/generic/dates.py:349 -#: env/lib/python3.11/site-packages/django/views/generic/dates.py:380 -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/generic/dates.py:652 -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/generic/dates.py:692 -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/generic/detail.py:56 -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/generic/list.py:70 -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/generic/list.py:77 -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/generic/list.py:169 -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/static.py:38 -msgid "Directory indexes are not allowed here." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/static.py:40 -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/static.py:79 -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:7 -#: env/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:220 -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:206 -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:221 -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:229 -msgid "Django Documentation" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:230 -msgid "Topics, references, & how-to’s" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:238 -msgid "Tutorial: A Polling App" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:239 -msgid "Get started with Django" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:247 -msgid "Django Community" -msgstr "" - -#: env/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:248 -msgid "Connect, get help, or contribute" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:69 -msgid "Confidential" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:70 -msgid "Public" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:79 -msgid "Authorization code" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:80 -msgid "Implicit" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:81 -#, fuzzy -#| msgid "Reset my password" -msgid "Resource owner password-based" -msgstr "Mein Passwort zurücksetzen" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:82 -msgid "Client credentials" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:83 -msgid "OpenID connect hybrid" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:90 -msgid "No OIDC support" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:91 -msgid "RSA with SHA-2 256" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:92 -msgid "HMAC with SHA-2 256" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:107 -msgid "Allowed URIs list, space separated" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:111 -msgid "Allowed Post Logout URIs list, space separated" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:120 -msgid "Hashed on Save. Copy it now if this is a new secret." -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:190 -#, python-brace-format -msgid "Unauthorized redirect scheme: {scheme}" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:194 -#, python-brace-format -msgid "redirect_uris cannot be empty with grant_type {grant_type}" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:200 -msgid "You must set OIDC_RSA_PRIVATE_KEY to use RSA algorithm" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/models.py:209 -msgid "You cannot use HS256 with public grants or clients" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/oauth2_validators.py:211 -#, fuzzy -#| msgid "This address must be valid." -msgid "The access token is invalid." -msgstr "Diese Adresse muss gültig sein." - -#: env/lib/python3.11/site-packages/oauth2_provider/oauth2_validators.py:218 -#, fuzzy -#| msgid "This address must be valid." -msgid "The access token has expired." -msgstr "Diese Adresse muss gültig sein." - -#: env/lib/python3.11/site-packages/oauth2_provider/oauth2_validators.py:225 -#, fuzzy -#| msgid "This address must be valid." -msgid "The access token is valid but does not have enough scope." -msgstr "Diese Adresse muss gültig sein." - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_confirm_delete.html:6 -#: note_kfet/templates/oauth2_provider/application_confirm_delete.html:8 -#, fuzzy -#| msgid "" -#| "Are you sure you want to delete this invoice? This action can't be undone." -msgid "Are you sure to delete the application" -msgstr "" -"Möchten Sie diese Rechnung wirklich löschen? Diese Aktion kann nicht " -"rückgängig gemacht werden." - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_confirm_delete.html:12 -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/authorize.html:29 -#: note_kfet/templates/oauth2_provider/application_confirm_delete.html:17 -#: note_kfet/templates/oauth2_provider/authorize.html:28 -#, fuzzy -#| msgid "Balance" -msgid "Cancel" -msgstr "Kontostand" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_detail.html:10 -#: note_kfet/templates/oauth2_provider/application_detail.html:11 -msgid "Client id" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_detail.html:15 -#: note_kfet/templates/oauth2_provider/application_detail.html:14 -msgid "Client secret" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_detail.html:20 -#: note_kfet/templates/oauth2_provider/application_detail.html:17 -#, fuzzy -#| msgid "Credit type" -msgid "Client type" -msgstr "Kredittype" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_detail.html:25 -#: note_kfet/templates/oauth2_provider/application_detail.html:20 -msgid "Authorization Grant Type" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_detail.html:30 -#: note_kfet/templates/oauth2_provider/application_detail.html:23 -msgid "Redirect Uris" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_detail.html:36 -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_form.html:35 -#: note_kfet/templates/oauth2_provider/application_detail.html:37 -#: note_kfet/templates/oauth2_provider/application_form.html:23 -msgid "Go Back" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_form.html:9 -#: note_kfet/templates/oauth2_provider/application_form.html:12 -#, fuzzy -#| msgid "Email validation" -msgid "Edit application" -msgstr "Email validierung" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_form.html:37 -msgid "Save" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_list.html:6 -#: note_kfet/templates/oauth2_provider/application_list.html:7 -msgid "Your applications" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_list.html:14 -#: note_kfet/templates/oauth2_provider/application_list.html:30 -#, fuzzy -#| msgid "location" -msgid "New Application" -msgstr "Ort" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/application_registration_form.html:5 -#: note_kfet/templates/oauth2_provider/application_registration_form.html:5 -#, fuzzy -#| msgid "Registrations" -msgid "Register a new application" -msgstr "Anmeldung" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/authorize.html:8 -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/authorize.html:30 -#: note_kfet/templates/oauth2_provider/authorize.html:9 -#: note_kfet/templates/oauth2_provider/authorize.html:29 -msgid "Authorize" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/authorize.html:17 -msgid "Application requires the following permissions" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/authorized-token-delete.html:6 -#: note_kfet/templates/oauth2_provider/authorized-token-delete.html:9 -#, fuzzy -#| msgid "" -#| "Are you sure you want to delete this invoice? This action can't be undone." -msgid "Are you sure you want to delete this token?" -msgstr "" -"Möchten Sie diese Rechnung wirklich löschen? Diese Aktion kann nicht " -"rückgängig gemacht werden." - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/authorized-tokens.html:6 -#: note_kfet/templates/oauth2_provider/authorized-tokens.html:7 -#, fuzzy -#| msgid "Token" -msgid "Tokens" -msgstr "Token" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/authorized-tokens.html:11 -msgid "revoke" -msgstr "" - -#: env/lib/python3.11/site-packages/oauth2_provider/templates/oauth2_provider/authorized-tokens.html:19 -#: note_kfet/templates/oauth2_provider/authorized-tokens.html:22 -#, fuzzy -#| msgid "There is no closed remittance yet." -msgid "There are no authorized tokens yet." -msgstr "Es gibt noch keine geschlossene Überweisung." - #: note_kfet/settings/base.py:177 msgid "German" msgstr "Deutsch" @@ -5698,6 +4208,44 @@ msgstr "Suche nach Attributen wie Name..." msgid "There is no results." msgstr "Es gibt keine Ergebnisse." +#: note_kfet/templates/oauth2_provider/application_confirm_delete.html:8 +#, fuzzy +#| msgid "" +#| "Are you sure you want to delete this invoice? This action can't be undone." +msgid "Are you sure to delete the application" +msgstr "" +"Möchten Sie diese Rechnung wirklich löschen? Diese Aktion kann nicht " +"rückgängig gemacht werden." + +#: note_kfet/templates/oauth2_provider/application_confirm_delete.html:17 +#: note_kfet/templates/oauth2_provider/authorize.html:28 +#, fuzzy +#| msgid "Balance" +msgid "Cancel" +msgstr "Kontostand" + +#: note_kfet/templates/oauth2_provider/application_detail.html:11 +msgid "Client id" +msgstr "" + +#: note_kfet/templates/oauth2_provider/application_detail.html:14 +msgid "Client secret" +msgstr "" + +#: note_kfet/templates/oauth2_provider/application_detail.html:17 +#, fuzzy +#| msgid "Credit type" +msgid "Client type" +msgstr "Kredittype" + +#: note_kfet/templates/oauth2_provider/application_detail.html:20 +msgid "Authorization Grant Type" +msgstr "" + +#: note_kfet/templates/oauth2_provider/application_detail.html:23 +msgid "Redirect Uris" +msgstr "" + #: note_kfet/templates/oauth2_provider/application_detail.html:29 #, python-format msgid "" @@ -5706,16 +4254,48 @@ msgid "" "that you want to grant for your application." msgstr "" +#: note_kfet/templates/oauth2_provider/application_detail.html:37 +#: note_kfet/templates/oauth2_provider/application_form.html:23 +msgid "Go Back" +msgstr "" + +#: note_kfet/templates/oauth2_provider/application_form.html:12 +#, fuzzy +#| msgid "Email validation" +msgid "Edit application" +msgstr "Email validierung" + +#: note_kfet/templates/oauth2_provider/application_list.html:7 +msgid "Your applications" +msgstr "" + #: note_kfet/templates/oauth2_provider/application_list.html:11 msgid "" "You can find on this page the list of the applications that you already " "registered." msgstr "" +#: note_kfet/templates/oauth2_provider/application_list.html:30 +#, fuzzy +#| msgid "location" +msgid "New Application" +msgstr "Ort" + #: note_kfet/templates/oauth2_provider/application_list.html:31 msgid "Authorized Tokens" msgstr "" +#: note_kfet/templates/oauth2_provider/application_registration_form.html:5 +#, fuzzy +#| msgid "Registrations" +msgid "Register a new application" +msgstr "Anmeldung" + +#: note_kfet/templates/oauth2_provider/authorize.html:9 +#: note_kfet/templates/oauth2_provider/authorize.html:29 +msgid "Authorize" +msgstr "" + #: note_kfet/templates/oauth2_provider/authorize.html:14 msgid "Application requires following permissions:" msgstr "" @@ -5733,6 +4313,27 @@ msgstr "" msgid "Please return to your application and enter this code:" msgstr "" +#: note_kfet/templates/oauth2_provider/authorized-token-delete.html:9 +#, fuzzy +#| msgid "" +#| "Are you sure you want to delete this invoice? This action can't be undone." +msgid "Are you sure you want to delete this token?" +msgstr "" +"Möchten Sie diese Rechnung wirklich löschen? Diese Aktion kann nicht " +"rückgängig gemacht werden." + +#: note_kfet/templates/oauth2_provider/authorized-tokens.html:7 +#, fuzzy +#| msgid "Token" +msgid "Tokens" +msgstr "Token" + +#: note_kfet/templates/oauth2_provider/authorized-tokens.html:22 +#, fuzzy +#| msgid "There is no closed remittance yet." +msgid "There are no authorized tokens yet." +msgstr "Es gibt noch keine geschlossene Überweisung." + #: note_kfet/templates/registration/logged_out.html:13 msgid "Thanks for spending some quality time with the Web site today." msgstr "" @@ -5846,6 +4447,336 @@ msgstr "" "müssen Ihre E-Mail-Adresse auch überprüfen, indem Sie dem Link folgen, den " "Sie erhalten haben." +#, fuzzy +#~| msgid "total amount" +#~ msgid "caution amount" +#~ msgstr "Totalanzahlt" + +#, fuzzy +#~| msgid "created at" +#~ msgid "caution type" +#~ msgstr "erschafft am" + +#, fuzzy +#~| msgid "total amount" +#~ msgid "Caution amount" +#~ msgstr "Totalanzahlt" + +#~ msgid "caution check given" +#~ msgstr "Vorsichtsprüfung gegeben" + +#, fuzzy +#~| msgid "Invitation" +#~ msgid "Syndication" +#~ msgstr "Einladung" + +#, fuzzy +#~| msgid "There is no results." +#~ msgid "That page contains no results" +#~ msgstr "Es gibt keine Ergebnisse." + +#, fuzzy +#~| msgid "Email validation" +#~ msgid "Enter a valid value." +#~ msgstr "Email validierung" + +#, fuzzy +#~| msgid "Email validation" +#~ msgid "Enter a valid URL." +#~ msgstr "Email validierung" + +#, fuzzy +#~| msgid "Email validation" +#~ msgid "Enter a valid integer." +#~ msgstr "Email validierung" + +#, fuzzy +#~| msgid "Email validation" +#~ msgid "Enter a valid email address." +#~ msgstr "Email validierung" + +#, fuzzy +#~| msgid "This activity is not validated yet." +#~ msgid "Enter a valid IPv4 address." +#~ msgstr "Diese Veranstaltung ist noch nicht bestätigt." + +#, fuzzy +#~| msgid "This activity is not validated yet." +#~ msgid "Enter a valid IPv6 address." +#~ msgstr "Diese Veranstaltung ist noch nicht bestätigt." + +#, fuzzy +#~| msgid "This activity is not validated yet." +#~ msgid "Enter a valid IPv4 or IPv6 address." +#~ msgstr "Diese Veranstaltung ist noch nicht bestätigt." + +#, fuzzy +#~| msgid "phone number" +#~ msgid "Enter a number." +#~ msgstr "Telefonnummer" + +#, fuzzy, python-format +#~| msgid "A template with this name already exist" +#~ msgid "%(model_name)s with this %(field_labels)s already exists." +#~ msgstr "Eine Vorlage mit diesem Namen ist bereits vorhanden" + +#, fuzzy, python-format +#~| msgid "This activity is not validated yet." +#~ msgid "Value %(value)r is not a valid choice." +#~ msgstr "Diese Veranstaltung ist noch nicht bestätigt." + +#, fuzzy +#~| msgid "This image cannot be loaded." +#~ msgid "This field cannot be null." +#~ msgstr "Dieses Bild kann nicht geladen werden." + +#, fuzzy +#~| msgid "This image cannot be loaded." +#~ msgid "This field cannot be blank." +#~ msgstr "Dieses Bild kann nicht geladen werden." + +#, fuzzy, python-format +#~| msgid "A template with this name already exist" +#~ msgid "%(model_name)s with this %(field_label)s already exists." +#~ msgstr "Eine Vorlage mit diesem Namen ist bereits vorhanden" + +#, fuzzy +#~| msgid "phone number" +#~ msgid "Decimal number" +#~ msgstr "Telefonnummer" + +#, fuzzy +#~| msgid "action" +#~ msgid "Duration" +#~ msgstr "Aktion" + +#, fuzzy +#~| msgid "address" +#~ msgid "Email address" +#~ msgstr "Adresse" + +#, fuzzy +#~| msgid "phone number" +#~ msgid "Floating point number" +#~ msgstr "Telefonnummer" + +#, fuzzy +#~| msgid "IP Address" +#~ msgid "IPv4 address" +#~ msgstr "IP Adresse" + +#, fuzzy +#~| msgid "IP Address" +#~ msgid "IP address" +#~ msgstr "IP Adresse" + +#, fuzzy, python-format +#~| msgid "This activity is not validated yet." +#~ msgid "“%(value)s” is not a valid UUID." +#~ msgstr "Diese Veranstaltung ist noch nicht bestätigt." + +#, fuzzy +#~| msgid "Invoice identifier" +#~ msgid "Universally unique identifier" +#~ msgstr "Rechnungskennung" + +#, fuzzy +#~| msgid "Object" +#~ msgid "A JSON object" +#~ msgstr "Objekt" + +#, fuzzy +#~| msgid "This address must be valid." +#~ msgid "Value must be valid JSON." +#~ msgstr "Diese Adresse muss gültig sein." + +#, fuzzy, python-format +#~| msgid "A template with this name already exist" +#~ msgid "%(model)s instance with %(field)s %(value)r does not exist." +#~ msgstr "Eine Vorlage mit diesem Namen ist bereits vorhanden" + +#, fuzzy +#~| msgid "phone number" +#~ msgid "Enter a whole number." +#~ msgstr "Telefonnummer" + +#, fuzzy +#~| msgid "Email validation" +#~ msgid "Enter a valid date." +#~ msgstr "Email validierung" + +#, fuzzy +#~| msgid "Email validation" +#~ msgid "Enter a valid time." +#~ msgstr "Email validierung" + +#, fuzzy +#~| msgid "Email validation" +#~ msgid "Enter a valid date/time." +#~ msgstr "Email validierung" + +#, fuzzy +#~| msgid "Email validation" +#~ msgid "Enter a valid duration." +#~ msgstr "Email validierung" + +#, fuzzy +#~| msgid "Email validation" +#~ msgid "Enter a list of values." +#~ msgstr "Email validierung" + +#, fuzzy +#~| msgid "phone number" +#~ msgid "Enter a complete value." +#~ msgstr "Telefonnummer" + +#, fuzzy +#~| msgid "Email validation" +#~ msgid "Enter a valid UUID." +#~ msgstr "Email validierung" + +#, fuzzy +#~| msgid "Email validation" +#~ msgid "Enter a valid JSON." +#~ msgstr "Email validierung" + +#, fuzzy, python-format +#~| msgid "This activity is not validated yet." +#~ msgid "“%(pk)s” is not a valid value." +#~ msgstr "Diese Veranstaltung ist noch nicht bestätigt." + +#, fuzzy +#~| msgid "Current activity" +#~ msgid "Currently" +#~ msgstr "Aktuelle Veranstaltung" + +#, fuzzy +#~| msgid "change" +#~ msgid "Change" +#~ msgstr "bearbeiten" + +#, fuzzy +#~| msgid "Search WEI" +#~ msgid "March" +#~ msgstr "WEI finden" + +#, fuzzy +#~| msgid "member" +#~ msgid "September" +#~ msgstr "Mitglied" + +#, fuzzy +#~| msgid "member" +#~ msgid "November" +#~ msgstr "Mitglied" + +#, fuzzy +#~| msgid "member" +#~ msgid "December" +#~ msgstr "Mitglied" + +#, fuzzy +#~| msgid "add" +#~ msgid "jan" +#~ msgstr "hinzufügen" + +#, fuzzy +#~| msgid "fee" +#~ msgid "feb" +#~ msgstr "Preis" + +#, fuzzy +#~| msgid "add" +#~ msgid "jun" +#~ msgstr "hinzufügen" + +#, fuzzy +#~| msgid "product" +#~ msgid "oct" +#~ msgstr "Produkt" + +#, fuzzy +#~| msgid "Search WEI" +#~ msgctxt "abbrev. month" +#~ msgid "March" +#~ msgstr "WEI finden" + +#, fuzzy +#~| msgid "Search WEI" +#~ msgctxt "alt. month" +#~ msgid "March" +#~ msgstr "WEI finden" + +#, fuzzy +#~| msgid "member" +#~ msgctxt "alt. month" +#~ msgid "September" +#~ msgstr "Mitglied" + +#, fuzzy +#~| msgid "member" +#~ msgctxt "alt. month" +#~ msgid "November" +#~ msgstr "Mitglied" + +#, fuzzy +#~| msgid "member" +#~ msgctxt "alt. month" +#~ msgid "December" +#~ msgstr "Mitglied" + +#, fuzzy +#~| msgid "This activity is not validated yet." +#~ msgid "This is not a valid IPv6 address." +#~ msgstr "Diese Veranstaltung ist noch nicht bestätigt." + +#, fuzzy, python-format +#~| msgid "year" +#~ msgid "%(num)d year" +#~ msgid_plural "%(num)d years" +#~ msgstr[0] "Jahr" +#~ msgstr[1] "Jahr" + +#, fuzzy +#~| msgid "No reason specified" +#~ msgid "No year specified" +#~ msgstr "Kein Grund gegeben" + +#, fuzzy +#~| msgid "No reason specified" +#~ msgid "No month specified" +#~ msgstr "Kein Grund gegeben" + +#, fuzzy +#~| msgid "No reason specified" +#~ msgid "No day specified" +#~ msgstr "Kein Grund gegeben" + +#, fuzzy +#~| msgid "No reason specified" +#~ msgid "No week specified" +#~ msgstr "Kein Grund gegeben" + +#, fuzzy +#~| msgid "Reset my password" +#~ msgid "Resource owner password-based" +#~ msgstr "Mein Passwort zurücksetzen" + +#, fuzzy +#~| msgid "This address must be valid." +#~ msgid "The access token is invalid." +#~ msgstr "Diese Adresse muss gültig sein." + +#, fuzzy +#~| msgid "This address must be valid." +#~ msgid "The access token has expired." +#~ msgstr "Diese Adresse muss gültig sein." + +#, fuzzy +#~| msgid "This address must be valid." +#~ msgid "The access token is valid but does not have enough scope." +#~ msgstr "Diese Adresse muss gültig sein." + #~ msgid "The BDE membership is included in the WEI registration." #~ msgstr "Die BDE-Mitgliedschaft ist in der WEI-Registrierung enthalten." diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index 3baa260d..6612e6ec 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-06-20 14:02+0200\n" +"POT-Creation-Date: 2025-07-15 18:18+0200\n" "PO-Revision-Date: 2022-04-11 23:12+0200\n" "Last-Translator: bleizi \n" "Language-Team: \n" @@ -65,7 +65,7 @@ msgstr "Usted no puede invitar más de 3 persona a esta actividad." #: apps/note/models/transactions.py:46 apps/note/models/transactions.py:299 #: apps/permission/models.py:329 #: apps/registration/templates/registration/future_profile_detail.html:16 -#: apps/wei/models.py:72 apps/wei/models.py:145 apps/wei/tables.py:282 +#: apps/wei/models.py:77 apps/wei/models.py:150 apps/wei/tables.py:282 #: apps/wei/templates/wei/base.html:26 #: apps/wei/templates/wei/weimembership_form.html:14 apps/wrapped/models.py:16 msgid "name" @@ -100,7 +100,7 @@ msgstr "tipos de actividad" #: apps/activity/models.py:68 #: apps/activity/templates/activity/includes/activity_info.html:19 #: apps/note/models/transactions.py:82 apps/permission/models.py:109 -#: apps/permission/models.py:188 apps/wei/models.py:92 apps/wei/models.py:156 +#: apps/permission/models.py:188 apps/wei/models.py:97 apps/wei/models.py:161 msgid "description" msgstr "descripción" @@ -121,7 +121,7 @@ msgstr "tipo" #: 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:294 -#: apps/wei/models.py:185 apps/wei/templates/wei/attribute_bus_1A.html:13 +#: apps/wei/models.py:190 apps/wei/templates/wei/attribute_bus_1A.html:13 #: apps/wei/templates/wei/survey.html:15 msgid "user" msgstr "usuario" @@ -1297,7 +1297,7 @@ msgid "add to registration form" msgstr "Validar la afiliación" #: apps/member/models.py:268 apps/member/models.py:331 -#: apps/note/models/notes.py:176 apps/wei/models.py:86 +#: apps/note/models/notes.py:176 apps/wei/models.py:91 msgid "club" msgstr "club" @@ -2017,8 +2017,8 @@ msgstr "" "pago y un usuario o un club" #: apps/note/models/transactions.py:357 apps/note/models/transactions.py:360 -#: apps/note/models/transactions.py:363 apps/wei/views.py:1097 -#: apps/wei/views.py:1101 +#: apps/note/models/transactions.py:363 apps/wei/views.py:1103 +#: apps/wei/views.py:1107 msgid "This field is required." msgstr "Este campo es obligatorio." @@ -2515,7 +2515,7 @@ msgstr "El usuario declara que ya abrió una cuenta a la Société Générale." #: apps/registration/templates/registration/future_profile_detail.html:73 #: apps/wei/templates/wei/weimembership_form.html:127 -#: apps/wei/templates/wei/weimembership_form.html:196 +#: apps/wei/templates/wei/weimembership_form.html:192 msgid "Validate registration" msgstr "Validar la afiliación" @@ -3043,8 +3043,8 @@ msgstr "Lista de los créditos de la Société Générale" msgid "Manage credits from the Société générale" msgstr "Gestionar los créditos de la Société Générale" -#: apps/wei/apps.py:10 apps/wei/models.py:42 apps/wei/models.py:43 -#: apps/wei/models.py:67 apps/wei/models.py:192 +#: apps/wei/apps.py:10 apps/wei/models.py:47 apps/wei/models.py:48 +#: apps/wei/models.py:72 apps/wei/models.py:197 #: note_kfet/templates/base.html:108 msgid "WEI" msgstr "WEI" @@ -3054,8 +3054,8 @@ msgid "The selected user is not validated. Please validate its account first" msgstr "" "El usuario seleccionado no ha sido validado. Validar esta cuenta primero" -#: apps/wei/forms/registration.py:84 apps/wei/models.py:140 -#: apps/wei/models.py:348 +#: apps/wei/forms/registration.py:84 apps/wei/models.py:145 +#: apps/wei/models.py:354 msgid "bus" msgstr "bus" @@ -3081,7 +3081,7 @@ msgstr "" "electrón libre)" #: apps/wei/forms/registration.py:100 apps/wei/forms/registration.py:110 -#: apps/wei/models.py:174 +#: apps/wei/models.py:179 msgid "WEI Roles" msgstr "Papeles en el WEI" @@ -3089,14 +3089,19 @@ msgstr "Papeles en el WEI" msgid "Select the roles that you are interested in." msgstr "Elegir los papeles que le interesa." -#: apps/wei/forms/registration.py:147 +#: apps/wei/forms/registration.py:160 msgid "This team doesn't belong to the given bus." msgstr "Este equipo no pertenece al bus dado." #: apps/wei/forms/surveys/wei2021.py:35 apps/wei/forms/surveys/wei2022.py:38 +#: apps/wei/forms/surveys/wei2025.py:36 msgid "Choose a word:" msgstr "Elegir una palabra :" +#: apps/wei/forms/surveys/wei2025.py:123 +msgid "Rate between 0 and 5." +msgstr "" + #: apps/wei/models.py:25 apps/wei/templates/wei/base.html:36 msgid "year" msgstr "año" @@ -3113,138 +3118,147 @@ msgstr "fecha de fin" #: apps/wei/models.py:37 #, fuzzy -#| msgid "total amount" -msgid "caution amount" -msgstr "monto total" +#| msgid "Credit amount" +msgid "deposit amount" +msgstr "Valor del crédito" -#: apps/wei/models.py:76 apps/wei/tables.py:305 +#: apps/wei/models.py:42 +#, fuzzy +#| msgid "No credit" +msgid "membership fee (soge credit)" +msgstr "No crédito" + +#: apps/wei/models.py:81 apps/wei/tables.py:305 msgid "seat count in the bus" msgstr "cantidad de asientos en el bus" -#: apps/wei/models.py:97 +#: apps/wei/models.py:102 msgid "survey information" msgstr "informaciones sobre el cuestionario" -#: apps/wei/models.py:98 +#: apps/wei/models.py:103 msgid "Information about the survey for new members, encoded in JSON" msgstr "" "Informaciones sobre el cuestionario para los nuevos miembros, registrado en " "JSON" -#: apps/wei/models.py:102 +#: apps/wei/models.py:107 msgid "Bus" msgstr "Bus" -#: apps/wei/models.py:103 apps/wei/templates/wei/weiclub_detail.html:51 +#: apps/wei/models.py:108 apps/wei/templates/wei/weiclub_detail.html:51 msgid "Buses" msgstr "Bus" -#: apps/wei/models.py:149 +#: apps/wei/models.py:154 msgid "color" msgstr "color" -#: apps/wei/models.py:150 +#: apps/wei/models.py:155 msgid "The color of the T-Shirt, stored with its number equivalent" msgstr "El color de la camiseta, registrado con su número equivalente" -#: apps/wei/models.py:161 +#: apps/wei/models.py:166 msgid "Bus team" msgstr "Equipo de bus" -#: apps/wei/models.py:162 +#: apps/wei/models.py:167 msgid "Bus teams" msgstr "Equipos de bus" -#: apps/wei/models.py:173 +#: apps/wei/models.py:178 msgid "WEI Role" msgstr "Papeles en el WEI" -#: apps/wei/models.py:197 +#: apps/wei/models.py:202 msgid "Credit from Société générale" msgstr "Crédito de la Société Générale" -#: apps/wei/models.py:202 apps/wei/views.py:984 -msgid "Caution check given" +#: apps/wei/models.py:207 apps/wei/templates/wei/weimembership_form.html:98 +#: apps/wei/views.py:997 +#, fuzzy +#| msgid "Caution check given" +msgid "Deposit check given" msgstr "Cheque de garantía dado" -#: apps/wei/models.py:208 +#: apps/wei/models.py:213 msgid "Check" msgstr "" -#: apps/wei/models.py:209 +#: apps/wei/models.py:214 #, fuzzy #| msgid "transactions" msgid "Note transaction" msgstr "Transacción" -#: apps/wei/models.py:212 +#: apps/wei/models.py:217 #, fuzzy -#| msgid "created at" -msgid "caution type" -msgstr "tipo de fianza" +#| msgid "Credit type" +msgid "deposit type" +msgstr "Tipo de crédito" -#: apps/wei/models.py:216 apps/wei/templates/wei/weimembership_form.html:64 +#: apps/wei/models.py:221 apps/wei/templates/wei/weimembership_form.html:64 msgid "birth date" msgstr "fecha de nacimiento" -#: apps/wei/models.py:222 apps/wei/models.py:232 +#: apps/wei/models.py:227 apps/wei/models.py:237 msgid "Male" msgstr "Hombre" -#: apps/wei/models.py:223 apps/wei/models.py:233 +#: apps/wei/models.py:228 apps/wei/models.py:238 msgid "Female" msgstr "Mujer" -#: apps/wei/models.py:224 +#: apps/wei/models.py:229 msgid "Non binary" msgstr "No binari@" -#: apps/wei/models.py:226 apps/wei/templates/wei/attribute_bus_1A.html:22 +#: apps/wei/models.py:231 apps/wei/templates/wei/attribute_bus_1A.html:22 #: apps/wei/templates/wei/weimembership_form.html:55 msgid "gender" msgstr "género" -#: apps/wei/models.py:234 +#: apps/wei/models.py:239 msgid "Unisex" msgstr "Unisex" -#: apps/wei/models.py:237 apps/wei/templates/wei/weimembership_form.html:58 +#: apps/wei/models.py:242 apps/wei/templates/wei/weimembership_form.html:58 msgid "clothing cut" msgstr "forma de ropa" -#: apps/wei/models.py:250 apps/wei/templates/wei/weimembership_form.html:61 +#: apps/wei/models.py:255 apps/wei/templates/wei/weimembership_form.html:61 msgid "clothing size" msgstr "medida de ropa" -#: apps/wei/models.py:256 +#: apps/wei/models.py:261 msgid "health issues" msgstr "problemas de salud" -#: apps/wei/models.py:261 apps/wei/templates/wei/weimembership_form.html:70 +#: apps/wei/models.py:266 apps/wei/templates/wei/weimembership_form.html:70 msgid "emergency contact name" msgstr "nombre del contacto de emergencia" -#: apps/wei/models.py:262 +#: apps/wei/models.py:267 msgid "The emergency contact must not be a WEI participant" msgstr "El contacto de emergencia no debe ser un participante de WEI" -#: apps/wei/models.py:267 apps/wei/templates/wei/weimembership_form.html:73 +#: apps/wei/models.py:272 apps/wei/templates/wei/weimembership_form.html:73 msgid "emergency contact phone" msgstr "teléfono del contacto de emergencia" -#: apps/wei/models.py:272 apps/wei/templates/wei/weimembership_form.html:52 +#: apps/wei/models.py:277 apps/wei/templates/wei/weimembership_form.html:52 msgid "first year" msgstr "primer año" -#: apps/wei/models.py:273 +#: apps/wei/models.py:278 msgid "Tells if the user is new in the school." msgstr "Indica si el usuario es nuevo en la escuela." -#: apps/wei/models.py:278 +#: apps/wei/models.py:283 msgid "registration information" msgstr "informaciones sobre la afiliación" -#: apps/wei/models.py:279 +#: apps/wei/models.py:284 msgid "" "Information about the registration (buses for old members, survey for the " "new members), encoded in JSON" @@ -3252,27 +3266,27 @@ msgstr "" "Informaciones sobre la afiliacion (bus para miembros ancianos, cuestionario " "para los nuevos miembros), registrado en JSON" -#: apps/wei/models.py:285 +#: apps/wei/models.py:290 msgid "WEI User" msgstr "Participante WEI" -#: apps/wei/models.py:286 +#: apps/wei/models.py:291 msgid "WEI Users" msgstr "Participantes WEI" -#: apps/wei/models.py:358 +#: apps/wei/models.py:364 msgid "team" msgstr "equipo" -#: apps/wei/models.py:368 +#: apps/wei/models.py:374 msgid "WEI registration" msgstr "Apuntación al WEI" -#: apps/wei/models.py:372 +#: apps/wei/models.py:378 msgid "WEI membership" msgstr "Afiliación al WEI" -#: apps/wei/models.py:373 +#: apps/wei/models.py:379 msgid "WEI memberships" msgstr "Afiliaciones al WEI" @@ -3300,7 +3314,7 @@ msgstr "Año" msgid "preferred bus" msgstr "bus preferido" -#: apps/wei/tables.py:210 apps/wei/templates/wei/bus_detail.html:36 +#: apps/wei/tables.py:210 apps/wei/templates/wei/bus_detail.html:38 #: apps/wei/templates/wei/busteam_detail.html:52 msgid "Teams" msgstr "Equipos" @@ -3372,9 +3386,9 @@ msgstr "Pago de entrada del WEI (estudiantes no pagados)" #: apps/wei/templates/wei/base.html:53 #, fuzzy -#| msgid "total amount" -msgid "Caution amount" -msgstr "monto total" +#| msgid "Credit amount" +msgid "Deposit amount" +msgstr "Valor del crédito" #: apps/wei/templates/wei/base.html:74 msgid "WEI list" @@ -3384,7 +3398,7 @@ msgstr "Lista de los WEI" msgid "Register 1A" msgstr "Apuntar un 1A" -#: apps/wei/templates/wei/base.html:83 apps/wei/views.py:644 +#: apps/wei/templates/wei/base.html:83 apps/wei/views.py:646 msgid "Register 2A+" msgstr "Apuntar un 2A+" @@ -3401,15 +3415,21 @@ msgid "View club" msgstr "Ver club" #: apps/wei/templates/wei/bus_detail.html:26 +#, fuzzy +#| msgid "survey information" +msgid "Edit information" +msgstr "informaciones sobre el cuestionario" + +#: apps/wei/templates/wei/bus_detail.html:28 #: apps/wei/templates/wei/busteam_detail.html:24 msgid "Add team" msgstr "Añadir un equipo" -#: apps/wei/templates/wei/bus_detail.html:49 +#: apps/wei/templates/wei/bus_detail.html:51 msgid "Members" msgstr "Miembros" -#: apps/wei/templates/wei/bus_detail.html:58 +#: apps/wei/templates/wei/bus_detail.html:60 #: apps/wei/templates/wei/busteam_detail.html:62 #: apps/wei/templates/wei/weimembership_list.html:31 msgid "View as PDF" @@ -3417,8 +3437,8 @@ msgstr "Descargar un 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:1159 -#: apps/wei/views.py:1214 apps/wei/views.py:1261 +#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:1165 +#: apps/wei/views.py:1220 apps/wei/views.py:1267 msgid "Survey WEI" msgstr "Cuestionario WEI" @@ -3494,10 +3514,6 @@ msgstr "Informaciones crudas del cuestionario" msgid "The algorithm didn't run." msgstr "El algoritmo no funcionó." -#: apps/wei/templates/wei/weimembership_form.html:98 -msgid "caution check given" -msgstr "cheque de garantía dado" - #: apps/wei/templates/wei/weimembership_form.html:105 msgid "preferred team" msgstr "equipo preferido" @@ -3532,11 +3548,18 @@ msgid "with the following roles:" msgstr "con los papeles :" #: apps/wei/templates/wei/weimembership_form.html:139 +#, fuzzy +#| msgid "" +#| "The WEI will be paid by Société générale. The membership will be created " +#| "even if the bank didn't pay the BDE yet. The membership transaction will " +#| "be created but will be invalid. You will have to validate it once the " +#| "bank validated the creation of the account, or to change the payment " +#| "method." msgid "" -"The WEI will be paid by Société générale. The membership will be created " -"even if the bank didn't pay the BDE yet. The membership transaction will be " -"created but will be invalid. You will have to validate it once the bank " -"validated the creation of the account, or to change the payment method." +"The WEI will partially be paid by Société générale. The membership will be " +"created even if the bank didn't pay the BDE yet. The membership transaction " +"will be created but will be invalid. You will have to validate it once the " +"bank validated the creation of the account, or to change the payment method." msgstr "" "El WEI será pagado por la Société Générale. La afiliación será creada aunque " "el banco no pago el BDE ya. La transacción de afiliación será creada pero " @@ -3558,27 +3581,26 @@ msgstr "Pagos de afiliación (estudiantes pagados)" msgid "Deposit (by Note transaction): %(amount)s" msgstr "Fianza (transacción) : %(amount)s" -#: apps/wei/templates/wei/weimembership_form.html:156 -#: apps/wei/templates/wei/weimembership_form.html:163 -#, python-format -msgid "Total needed: %(total)s" -msgstr "Total necesario : %(total)s" - -#: apps/wei/templates/wei/weimembership_form.html:160 +#: apps/wei/templates/wei/weimembership_form.html:157 #, python-format msgid "Deposit (by check): %(amount)s" msgstr "Fianza (cheque) : %(amount)s" -#: apps/wei/templates/wei/weimembership_form.html:168 +#: apps/wei/templates/wei/weimembership_form.html:161 +#, python-format +msgid "Total needed: %(total)s" +msgstr "Total necesario : %(total)s" + +#: apps/wei/templates/wei/weimembership_form.html:165 #, python-format msgid "Current balance: %(balance)s" msgstr "Saldo actual : %(balance)s" -#: apps/wei/templates/wei/weimembership_form.html:176 +#: apps/wei/templates/wei/weimembership_form.html:172 msgid "The user didn't give her/his caution check." msgstr "El usuario no dio su cheque de garantía." -#: apps/wei/templates/wei/weimembership_form.html:184 +#: apps/wei/templates/wei/weimembership_form.html:180 msgid "" "This user is not a member of the Kfet club for the coming year. The " "membership will be processed automatically, the WEI registration includes " @@ -3668,110 +3690,109 @@ msgstr "Gestionar el equipo" msgid "Register first year student to the WEI" msgstr "Registrar un 1A al WEI" -#: apps/wei/views.py:580 apps/wei/views.py:689 +#: apps/wei/views.py:571 apps/wei/views.py:664 +#, fuzzy +#| msgid "Check this case if the Société Générale paid the inscription." +msgid "Check if you will open a Société Générale account" +msgstr "Marcar esta casilla si Société Générale pagó la registración." + +#: apps/wei/views.py:582 apps/wei/views.py:694 msgid "This user is already registered to this WEI." msgstr "Este usuario ya afilió a este WEI." -#: apps/wei/views.py:585 +#: apps/wei/views.py:587 msgid "" "This user can't be in her/his first year since he/she has already " "participated to a WEI." msgstr "Este usuario no puede ser un 1A porque ya participó en un WEI." -#: apps/wei/views.py:608 +#: apps/wei/views.py:610 msgid "Register old student to the WEI" msgstr "Registrar un 2A+ al WEI" -#: apps/wei/views.py:663 apps/wei/views.py:768 +#: apps/wei/views.py:668 apps/wei/views.py:773 msgid "You already opened an account in the Société générale." msgstr "Usted ya abrió una cuenta a la Société Générale." -#: apps/wei/views.py:676 apps/wei/views.py:785 +#: apps/wei/views.py:681 apps/wei/views.py:790 msgid "Choose how you want to pay the deposit" msgstr "" -#: apps/wei/views.py:728 +#: apps/wei/views.py:733 msgid "Update WEI Registration" msgstr "Modificar la inscripción WEI" -#: apps/wei/views.py:810 +#: apps/wei/views.py:816 #, fuzzy #| msgid "The BDE membership is included in the WEI registration." msgid "No membership found for this registration" msgstr "La afiliación al BDE esta incluida en la afiliación WEI." -#: apps/wei/views.py:819 -#| msgid "" -#| "You don't have the permission to add an instance of model {app_label}." -#| "{model_name}." +#: apps/wei/views.py:825 msgid "You don't have the permission to update memberships" msgstr "" "Usted no tiene permiso a añadir una instancia al modelo {app_label}." "{model_name}." -#: apps/wei/views.py:825 +#: apps/wei/views.py:831 #, python-format -#| msgid "" -#| "You don't have the permission to delete this instance of model " -#| "{app_label}.{model_name}." msgid "You don't have the permission to update the field %(field)s" msgstr "Usted no tiene permiso a modificar el campo %(field)s" -#: apps/wei/views.py:870 +#: apps/wei/views.py:876 msgid "Delete WEI registration" msgstr "Suprimir la inscripción WEI" -#: apps/wei/views.py:881 +#: apps/wei/views.py:887 msgid "You don't have the right to delete this WEI registration." msgstr "Usted no tiene derecho a suprimir esta inscripción WEI." -#: apps/wei/views.py:899 +#: apps/wei/views.py:905 msgid "Validate WEI registration" msgstr "Validar la inscripción WEI" -#: apps/wei/views.py:985 +#: apps/wei/views.py:998 msgid "Please make sure the check is given before validating the registration" msgstr "" "Por favor asegúrese de que el cheque se entrega antes de validar el registro" -#: apps/wei/views.py:991 -#| msgid "credit transaction" +#: apps/wei/views.py:1004 msgid "Create deposit transaction" msgstr "Crear transacción de crédito" -#: apps/wei/views.py:992 +#: apps/wei/views.py:1005 #, python-format msgid "" "A transaction of %(amount).2f€ will be created from the user's Note account" msgstr "" -#: apps/wei/views.py:1087 -#, python-format +#: apps/wei/views.py:1093 +#, fuzzy, python-format #| msgid "" -#| "This user don't have enough money to join this club, and can't have a " -#| "negative balance." +#| "This user doesn't have enough money. Current balance: %(balance)d€, " +#| "credit: %(credit)d€, needed: %(needed)d€" msgid "" -"This user doesn't have enough money. " +"This user doesn't have enough money to join this club and pay the deposit. " "Current balance: %(balance)d€, credit: %(credit)d€, needed: %(needed)d€" msgstr "" -"Este usuario no tiene suficiente dinero. " -"Saldo actual : %(balance)d€, crédito: %(credit)d€, requerido: %(needed)d€" +"Este usuario no tiene suficiente dinero. Saldo actual : %(balance)d€, " +"crédito: %(credit)d€, requerido: %(needed)d€" -#: apps/wei/views.py:1140 -#, python-format -#| msgid "created at" -msgid "Caution %(name)s" +#: apps/wei/views.py:1146 +#, fuzzy, python-format +#| msgid "Caution %(name)s" +msgid "Deposit %(name)s" msgstr "Fianza %(name)s" -#: apps/wei/views.py:1354 +#: apps/wei/views.py:1360 msgid "Attribute buses to first year members" msgstr "Repartir los primer años en los buses" -#: apps/wei/views.py:1379 +#: apps/wei/views.py:1386 msgid "Attribute bus" msgstr "Repartir en un bus" -#: apps/wei/views.py:1419 +#: apps/wei/views.py:1426 msgid "" "No first year student without a bus found. Either all of them have a bus, or " "none has filled the survey yet." @@ -4337,6 +4358,24 @@ msgstr "" "pagar su afiliación. Tambien tiene que validar su correo electronico con el " "enlace que recibió." +#, fuzzy +#~| msgid "total amount" +#~ msgid "caution amount" +#~ msgstr "monto total" + +#, fuzzy +#~| msgid "created at" +#~ msgid "caution type" +#~ msgstr "tipo de fianza" + +#, fuzzy +#~| msgid "total amount" +#~ msgid "Caution amount" +#~ msgstr "monto total" + +#~ msgid "caution check given" +#~ msgstr "cheque de garantía dado" + #, fuzzy #~| msgid "Invitation" #~ msgid "Syndication" diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 9832c986..07121046 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: 2025-06-27 19:15+0200\n" +"POT-Creation-Date: 2025-07-15 18:17+0200\n" "PO-Revision-Date: 2022-04-11 22:05+0200\n" "Last-Translator: bleizi \n" "Language-Team: French \n" @@ -66,7 +66,7 @@ msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité." #: apps/note/models/transactions.py:46 apps/note/models/transactions.py:299 #: apps/permission/models.py:329 #: apps/registration/templates/registration/future_profile_detail.html:16 -#: apps/wei/models.py:72 apps/wei/models.py:145 apps/wei/tables.py:282 +#: apps/wei/models.py:77 apps/wei/models.py:150 apps/wei/tables.py:282 #: apps/wei/templates/wei/base.html:26 #: apps/wei/templates/wei/weimembership_form.html:14 apps/wrapped/models.py:16 msgid "name" @@ -101,7 +101,7 @@ msgstr "types d'activité" #: apps/activity/models.py:68 #: apps/activity/templates/activity/includes/activity_info.html:19 #: apps/note/models/transactions.py:82 apps/permission/models.py:109 -#: apps/permission/models.py:188 apps/wei/models.py:92 apps/wei/models.py:156 +#: apps/permission/models.py:188 apps/wei/models.py:97 apps/wei/models.py:161 msgid "description" msgstr "description" @@ -122,7 +122,7 @@ msgstr "type" #: 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:294 -#: apps/wei/models.py:185 apps/wei/templates/wei/attribute_bus_1A.html:13 +#: apps/wei/models.py:190 apps/wei/templates/wei/attribute_bus_1A.html:13 #: apps/wei/templates/wei/survey.html:15 msgid "user" msgstr "utilisateur⋅rice" @@ -1240,7 +1240,7 @@ msgid "add to registration form" msgstr "ajouter au formulaire d'inscription" #: apps/member/models.py:268 apps/member/models.py:331 -#: apps/note/models/notes.py:176 apps/wei/models.py:86 +#: apps/note/models/notes.py:176 apps/wei/models.py:91 msgid "club" msgstr "club" @@ -1962,8 +1962,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:1097 -#: apps/wei/views.py:1101 +#: apps/note/models/transactions.py:363 apps/wei/views.py:1103 +#: apps/wei/views.py:1107 msgid "This field is required." msgstr "Ce champ est requis." @@ -2468,7 +2468,7 @@ msgstr "" #: apps/registration/templates/registration/future_profile_detail.html:73 #: apps/wei/templates/wei/weimembership_form.html:127 -#: apps/wei/templates/wei/weimembership_form.html:196 +#: apps/wei/templates/wei/weimembership_form.html:192 msgid "Validate registration" msgstr "Valider l'inscription" @@ -2994,8 +2994,8 @@ msgstr "Liste des crédits de la Société générale" msgid "Manage credits from the Société générale" msgstr "Gérer les crédits de la Société générale" -#: apps/wei/apps.py:10 apps/wei/models.py:42 apps/wei/models.py:43 -#: apps/wei/models.py:67 apps/wei/models.py:192 +#: apps/wei/apps.py:10 apps/wei/models.py:47 apps/wei/models.py:48 +#: apps/wei/models.py:72 apps/wei/models.py:197 #: note_kfet/templates/base.html:108 msgid "WEI" msgstr "WEI" @@ -3006,8 +3006,8 @@ msgstr "" "L'utilisateur·rice sélectionné·e n'est pas validé·e. Merci de d'abord " "valider son compte" -#: apps/wei/forms/registration.py:84 apps/wei/models.py:140 -#: apps/wei/models.py:348 +#: apps/wei/forms/registration.py:84 apps/wei/models.py:145 +#: apps/wei/models.py:354 msgid "bus" msgstr "bus" @@ -3033,7 +3033,7 @@ msgstr "" "bus ou électron libre)" #: apps/wei/forms/registration.py:100 apps/wei/forms/registration.py:110 -#: apps/wei/models.py:174 +#: apps/wei/models.py:179 msgid "WEI Roles" msgstr "Rôles au WEI" @@ -3041,7 +3041,7 @@ msgstr "Rôles au WEI" msgid "Select the roles that you are interested in." msgstr "Sélectionnez les rôles qui vous intéressent." -#: apps/wei/forms/registration.py:147 +#: apps/wei/forms/registration.py:160 msgid "This team doesn't belong to the given bus." msgstr "Cette équipe n'appartient pas à ce bus." @@ -3069,137 +3069,142 @@ msgid "date end" msgstr "fin" #: apps/wei/models.py:37 -#, fuzzy -#| msgid "total amount" -msgid "caution amount" -msgstr "montant total" +msgid "deposit amount" +msgstr "montant de la caution" -#: apps/wei/models.py:76 apps/wei/tables.py:305 +#: apps/wei/models.py:42 +msgid "membership fee (soge credit)" +msgstr "Cotisation pour adhérer (crédit sogé)" + +#: apps/wei/models.py:81 apps/wei/tables.py:305 msgid "seat count in the bus" msgstr "nombre de sièges dans le bus" -#: apps/wei/models.py:97 +#: apps/wei/models.py:102 msgid "survey information" msgstr "informations sur le questionnaire" -#: apps/wei/models.py:98 +#: apps/wei/models.py:103 msgid "Information about the survey for new members, encoded in JSON" msgstr "" "Informations sur le sondage pour les nouveaux membres, encodées en JSON" -#: apps/wei/models.py:102 +#: apps/wei/models.py:107 msgid "Bus" msgstr "Bus" -#: apps/wei/models.py:103 apps/wei/templates/wei/weiclub_detail.html:51 +#: apps/wei/models.py:108 apps/wei/templates/wei/weiclub_detail.html:51 msgid "Buses" msgstr "Bus" -#: apps/wei/models.py:149 +#: apps/wei/models.py:154 msgid "color" msgstr "couleur" -#: apps/wei/models.py:150 +#: apps/wei/models.py:155 msgid "The color of the T-Shirt, stored with its number equivalent" msgstr "" "La couleur du T-Shirt, stocké sous la forme de son équivalent numérique" -#: apps/wei/models.py:161 +#: apps/wei/models.py:166 msgid "Bus team" msgstr "Équipe de bus" -#: apps/wei/models.py:162 +#: apps/wei/models.py:167 msgid "Bus teams" msgstr "Équipes de bus" -#: apps/wei/models.py:173 +#: apps/wei/models.py:178 msgid "WEI Role" msgstr "Rôle au WEI" -#: apps/wei/models.py:197 +#: apps/wei/models.py:202 msgid "Credit from Société générale" msgstr "Crédit de la Société générale" -#: apps/wei/models.py:202 apps/wei/views.py:984 -msgid "Caution check given" +#: apps/wei/models.py:207 apps/wei/templates/wei/weimembership_form.html:98 +#: apps/wei/views.py:997 +msgid "Deposit check given" msgstr "Chèque de caution donné" -#: apps/wei/models.py:208 +#: apps/wei/models.py:213 msgid "Check" -msgstr "" +msgstr "Chèque" -#: apps/wei/models.py:209 +#: apps/wei/models.py:214 msgid "Note transaction" msgstr "Transaction Note" -#: apps/wei/models.py:212 -msgid "caution type" -msgstr "date de création" +#: apps/wei/models.py:217 +#, fuzzy +#| msgid "Credit type" +msgid "deposit type" +msgstr "Type de rechargement" -#: apps/wei/models.py:216 apps/wei/templates/wei/weimembership_form.html:64 +#: apps/wei/models.py:221 apps/wei/templates/wei/weimembership_form.html:64 msgid "birth date" msgstr "date de naissance" -#: apps/wei/models.py:222 apps/wei/models.py:232 +#: apps/wei/models.py:227 apps/wei/models.py:237 msgid "Male" msgstr "Homme" -#: apps/wei/models.py:223 apps/wei/models.py:233 +#: apps/wei/models.py:228 apps/wei/models.py:238 msgid "Female" msgstr "Femme" -#: apps/wei/models.py:224 +#: apps/wei/models.py:229 msgid "Non binary" msgstr "Non-binaire" -#: apps/wei/models.py:226 apps/wei/templates/wei/attribute_bus_1A.html:22 +#: apps/wei/models.py:231 apps/wei/templates/wei/attribute_bus_1A.html:22 #: apps/wei/templates/wei/weimembership_form.html:55 msgid "gender" msgstr "genre" -#: apps/wei/models.py:234 +#: apps/wei/models.py:239 msgid "Unisex" msgstr "Unisexe" -#: apps/wei/models.py:237 apps/wei/templates/wei/weimembership_form.html:58 +#: apps/wei/models.py:242 apps/wei/templates/wei/weimembership_form.html:58 msgid "clothing cut" msgstr "coupe de vêtement" -#: apps/wei/models.py:250 apps/wei/templates/wei/weimembership_form.html:61 +#: apps/wei/models.py:255 apps/wei/templates/wei/weimembership_form.html:61 msgid "clothing size" msgstr "taille de vêtement" -#: apps/wei/models.py:256 +#: apps/wei/models.py:261 msgid "health issues" msgstr "problèmes de santé" -#: apps/wei/models.py:261 apps/wei/templates/wei/weimembership_form.html:70 +#: apps/wei/models.py:266 apps/wei/templates/wei/weimembership_form.html:70 msgid "emergency contact name" msgstr "nom du contact en cas d'urgence" -#: apps/wei/models.py:262 +#: apps/wei/models.py:267 msgid "The emergency contact must not be a WEI participant" msgstr "" "Le contact en cas d'urgence ne doit pas être une personne qui participe au " "WEI" -#: apps/wei/models.py:267 apps/wei/templates/wei/weimembership_form.html:73 +#: apps/wei/models.py:272 apps/wei/templates/wei/weimembership_form.html:73 msgid "emergency contact phone" msgstr "téléphone du contact en cas d'urgence" -#: apps/wei/models.py:272 apps/wei/templates/wei/weimembership_form.html:52 +#: apps/wei/models.py:277 apps/wei/templates/wei/weimembership_form.html:52 msgid "first year" msgstr "première année" -#: apps/wei/models.py:273 +#: apps/wei/models.py:278 msgid "Tells if the user is new in the school." msgstr "Indique si l'utilisateur⋅rice est nouvelleeau dans l'école." -#: apps/wei/models.py:278 +#: apps/wei/models.py:283 msgid "registration information" msgstr "informations sur l'inscription" -#: apps/wei/models.py:279 +#: apps/wei/models.py:284 msgid "" "Information about the registration (buses for old members, survey for the " "new members), encoded in JSON" @@ -3207,27 +3212,27 @@ msgstr "" "Informations sur l'inscription (bus pour les 2A+, questionnaire pour les " "1A), encodées en JSON" -#: apps/wei/models.py:285 +#: apps/wei/models.py:290 msgid "WEI User" msgstr "Participant·e au WEI" -#: apps/wei/models.py:286 +#: apps/wei/models.py:291 msgid "WEI Users" msgstr "Participant·e·s au WEI" -#: apps/wei/models.py:358 +#: apps/wei/models.py:364 msgid "team" msgstr "équipe" -#: apps/wei/models.py:368 +#: apps/wei/models.py:374 msgid "WEI registration" msgstr "Inscription au WEI" -#: apps/wei/models.py:372 +#: apps/wei/models.py:378 msgid "WEI membership" msgstr "Adhésion au WEI" -#: apps/wei/models.py:373 +#: apps/wei/models.py:379 msgid "WEI memberships" msgstr "Adhésions au WEI" @@ -3322,10 +3327,8 @@ msgid "WEI fee (unpaid students)" msgstr "Prix du WEI (étudiant⋅es)" #: apps/wei/templates/wei/base.html:53 -#, fuzzy -#| msgid "total amount" -msgid "Caution amount" -msgstr "montant total" +msgid "Deposit amount" +msgstr "Caution" #: apps/wei/templates/wei/base.html:74 msgid "WEI list" @@ -3335,7 +3338,7 @@ msgstr "Liste des WEI" msgid "Register 1A" msgstr "Inscrire un⋅e 1A" -#: apps/wei/templates/wei/base.html:83 apps/wei/views.py:644 +#: apps/wei/templates/wei/base.html:83 apps/wei/views.py:646 msgid "Register 2A+" msgstr "Inscrire un⋅e 2A+" @@ -3352,7 +3355,6 @@ msgid "View club" msgstr "Voir le club" #: apps/wei/templates/wei/bus_detail.html:26 -#| msgid "survey information" msgid "Edit information" msgstr "Modifier les informations" @@ -3373,8 +3375,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:1159 -#: apps/wei/views.py:1214 apps/wei/views.py:1261 +#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:1165 +#: apps/wei/views.py:1220 apps/wei/views.py:1267 msgid "Survey WEI" msgstr "Questionnaire WEI" @@ -3451,10 +3453,6 @@ msgstr "Informations brutes du sondage" msgid "The algorithm didn't run." msgstr "L'algorithme n'a pas été exécuté." -#: apps/wei/templates/wei/weimembership_form.html:98 -msgid "caution check given" -msgstr "chèque de caution donné" - #: apps/wei/templates/wei/weimembership_form.html:105 msgid "preferred team" msgstr "équipe préférée" @@ -3490,52 +3488,53 @@ msgstr "avec les rôles suivants :" #: apps/wei/templates/wei/weimembership_form.html:139 msgid "" -"The WEI will be paid by Société générale. The membership will be created " -"even if the bank didn't pay the BDE yet. The membership transaction will be " -"created but will be invalid. You will have to validate it once the bank " -"validated the creation of the account, or to change the payment method." +"The WEI will partially be paid by Société générale. The membership will be " +"created even if the bank didn't pay the BDE yet. The membership transaction " +"will be created but will be invalid. You will have to validate it once the " +"bank validated the creation of the account, or to change the payment method." msgstr "" -"Le WEI va être payé par la Société générale. L'adhésion sera créée même si " -"la banque n'a pas encore payé le BDE. La transaction d'adhésion sera créée " -"mais invalide. Vous devrez la valider une fois que la banque aura validé la " -"création du compte, ou bien changer de moyen de paiement." +"Le WEI va être partiellement payé par la Société générale. L'adhésion sera " +"créée même si la banque n'a pas encore payé le BDE. La transaction " +"d'adhésion sera créée mais invalide. Vous devrez la valider une fois que la " +"banque aura validé la création du compte, ou bien changer de moyen de " +"paiement." #: apps/wei/templates/wei/weimembership_form.html:147 msgid "Required payments:" msgstr "Paiements requis" #: apps/wei/templates/wei/weimembership_form.html:149 -#, fuzzy, python-format -#| msgid "membership fee (paid students)" +#, python-format msgid "Membership fees: %(amount)s" -msgstr "cotisation pour adhérer (normalien·ne élève)" +msgstr "Frais d'inscription : %(amount)s" #: apps/wei/templates/wei/weimembership_form.html:153 #, python-format msgid "Deposit (by Note transaction): %(amount)s" msgstr "Caution (par transaction) : %(amount)s" -#: apps/wei/templates/wei/weimembership_form.html:156 -#: apps/wei/templates/wei/weimembership_form.html:163 -#, python-format -msgid "Total needed: %(total)s" -msgstr "Total nécessaire : %(total)s" - -#: apps/wei/templates/wei/weimembership_form.html:160 +#: apps/wei/templates/wei/weimembership_form.html:157 #, python-format msgid "Deposit (by check): %(amount)s" msgstr "Caution (par chèque) : %(amount)s" -#: apps/wei/templates/wei/weimembership_form.html:168 +#: apps/wei/templates/wei/weimembership_form.html:161 +#, python-format +msgid "Total needed: %(total)s" +msgstr "Total nécessaire : %(total)s" + +#: apps/wei/templates/wei/weimembership_form.html:165 #, python-format msgid "Current balance: %(balance)s" msgstr "Solde actuel : %(balance)s" -#: apps/wei/templates/wei/weimembership_form.html:176 +#: apps/wei/templates/wei/weimembership_form.html:172 +#, fuzzy +#| msgid "The user didn't give her/his deposit check." msgid "The user didn't give her/his caution check." msgstr "L'utilisateur⋅rice n'a pas donné son chèque de caution." -#: apps/wei/templates/wei/weimembership_form.html:184 +#: apps/wei/templates/wei/weimembership_form.html:180 msgid "" "This user is not a member of the Kfet club for the coming year. The " "membership will be processed automatically, the WEI registration includes " @@ -3626,11 +3625,15 @@ msgstr "Gérer l'équipe WEI" msgid "Register first year student to the WEI" msgstr "Inscrire un⋅e 1A au WEI" -#: apps/wei/views.py:580 apps/wei/views.py:689 +#: apps/wei/views.py:571 apps/wei/views.py:664 +msgid "Check if you will open a Société Générale account" +msgstr "Cochez cette case si vous ouvrez un compte à la Société Générale." + +#: apps/wei/views.py:582 apps/wei/views.py:694 msgid "This user is already registered to this WEI." msgstr "Cette personne est déjà inscrite au WEI." -#: apps/wei/views.py:585 +#: apps/wei/views.py:587 msgid "" "This user can't be in her/his first year since he/she has already " "participated to a WEI." @@ -3638,95 +3641,94 @@ 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:608 +#: apps/wei/views.py:610 msgid "Register old student to the WEI" msgstr "Inscrire un⋅e 2A+ au WEI" -#: apps/wei/views.py:663 apps/wei/views.py:768 +#: apps/wei/views.py:668 apps/wei/views.py:773 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:676 apps/wei/views.py:785 +#: apps/wei/views.py:681 apps/wei/views.py:790 msgid "Choose how you want to pay the deposit" -msgstr "" +msgstr "Choisissez comment payer la caution" -#: apps/wei/views.py:728 +#: apps/wei/views.py:733 msgid "Update WEI Registration" msgstr "Modifier l'inscription WEI" -#: apps/wei/views.py:810 +#: apps/wei/views.py:816 msgid "No membership found for this registration" msgstr "Pas d'adhésion trouvée pour cette inscription" -#: apps/wei/views.py:819 -msgid "You don't have the permission to update memberships" -msgstr "" -"Vous n'avez pas la permission d'ajouter une instance du modèle {app_label}." -"{model_name}." - #: apps/wei/views.py:825 +msgid "You don't have the permission to update memberships" +msgstr "Vous n'avez pas la permission de modifier une inscription" + +#: apps/wei/views.py:831 #, python-format msgid "You don't have the permission to update the field %(field)s" msgstr "Vous n'avez pas la permission de modifier le champ %(field)s" -#: apps/wei/views.py:870 +#: apps/wei/views.py:876 msgid "Delete WEI registration" msgstr "Supprimer l'inscription WEI" -#: apps/wei/views.py:881 +#: apps/wei/views.py:887 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:899 +#: apps/wei/views.py:905 msgid "Validate WEI registration" msgstr "Valider l'inscription WEI" -#: apps/wei/views.py:985 +#: apps/wei/views.py:998 msgid "Please make sure the check is given before validating the registration" msgstr "" "Merci de vous assurer que le chèque a bien été donné avant de valider " "l'adhésion" -#: apps/wei/views.py:991 +#: apps/wei/views.py:1004 msgid "Create deposit transaction" msgstr "Créer une transaction de caution" -#: apps/wei/views.py:992 +#: apps/wei/views.py:1005 #, python-format msgid "" "A transaction of %(amount).2f€ will be created from the user's Note account" msgstr "" "Un transaction de %(amount).2f€ va être créée depuis la note de l'utilisateur" -#: apps/wei/views.py:1087 +#: apps/wei/views.py:1093 #, python-format msgid "" "This user doesn't have enough money to join this club and pay the deposit. " "Current balance: %(balance)d€, credit: %(credit)d€, needed: %(needed)d€" msgstr "" "Cet⋅te utilisateur⋅rice n'a pas assez d'argent pour rejoindre ce club et " -"payer la cautionSolde actuel : %(balance)d€, crédit : %(credit)d€, requis : " -"%(needed)d€" +"payer la caution. Solde actuel : %(balance)d€, crédit : %(credit)d€, " +"requis : %(needed)d€" -#: apps/wei/views.py:1140 -#, fuzzy, python-format -#| msgid "total amount" -msgid "Caution %(name)s" -msgstr "montant total" +#: apps/wei/views.py:1146 +#, python-format +msgid "Deposit %(name)s" +msgstr "Caution %(name)s" -#: apps/wei/views.py:1354 +#: apps/wei/views.py:1360 msgid "Attribute buses to first year members" msgstr "Répartir les 1A dans les bus" -#: apps/wei/views.py:1380 +#: apps/wei/views.py:1386 msgid "Attribute bus" msgstr "Attribuer un bus" -#: apps/wei/views.py:1420 +#: apps/wei/views.py:1426 msgid "" "No first year student without a bus found. Either all of them have a bus, or " "none has filled the survey yet." msgstr "" +"Aucun 1A sans bus trouvé. Soit ils ont tous été attribués, soitaucun n'a " +"encore rempli le sondage." #: apps/wrapped/apps.py:10 msgid "wrapped" @@ -4289,9 +4291,20 @@ msgstr "" "d'adhésion. Vous devez également valider votre adresse email en suivant le " "lien que vous avez reçu." -#, fuzzy, python-format -#~| msgid "Creation date" -#~ msgid "Deposit %(name)s" +#~ msgid "caution amount" +#~ msgstr "montant de la caution" + +#~ msgid "caution type" +#~ msgstr "type de caution" + +#~ msgid "Caution amount" +#~ msgstr "Montant de la caution" + +#~ msgid "caution check given" +#~ msgstr "chèque de caution donné" + +#, python-format +#~ msgid "Caution %(name)s" #~ msgstr "Caution %(name)s" #, fuzzy @@ -4675,9 +4688,6 @@ msgstr "" #~ msgid "Application requires the following permissions" #~ msgstr "L'application requiert les permissions suivantes :" -#~ msgid "Deposit amount" -#~ msgstr "Caution" - #~ msgid "The BDE membership is included in the WEI registration." #~ msgstr "L'adhésion au BDE est offerte avec l'inscription au WEI."