diff --git a/apps/activity/migrations/0007_alter_guest_activity.py b/apps/activity/migrations/0007_alter_guest_activity.py new file mode 100644 index 00000000..9badcc1b --- /dev/null +++ b/apps/activity/migrations/0007_alter_guest_activity.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.20 on 2025-05-08 19:07 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('activity', '0006_guest_school'), + ] + + operations = [ + migrations.AlterField( + model_name='guest', + name='activity', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='activity.activity'), + ), + ] diff --git a/apps/activity/models.py b/apps/activity/models.py index c7c92e8d..4e313a57 100644 --- a/apps/activity/models.py +++ b/apps/activity/models.py @@ -234,7 +234,7 @@ class Guest(models.Model): """ activity = models.ForeignKey( Activity, - on_delete=models.PROTECT, + on_delete=models.CASCADE, related_name='+', ) diff --git a/apps/activity/templates/activity/activity_detail.html b/apps/activity/templates/activity/activity_detail.html index a94d1e37..1a8d01ee 100644 --- a/apps/activity/templates/activity/activity_detail.html +++ b/apps/activity/templates/activity/activity_detail.html @@ -95,5 +95,23 @@ SPDX-License-Identifier: GPL-3.0-or-later errMsg(xhr.responseJSON); }); }); + $("#delete_activity").click(function () { + if (!confirm("{% trans 'Are you sure you want to delete this activity?' %}")) { + return; + } + + $.ajax({ + url: "/api/activity/activity/{{ activity.pk }}/", + type: "DELETE", + headers: { + "X-CSRFTOKEN": CSRF_TOKEN + } + }).done(function () { + addMsg("{% trans 'Activity deleted' %}", "success"); + window.location.href = "/activity/"; // Redirige vers la liste des activités + }).fail(function (xhr) { + errMsg(xhr.responseJSON); + }); + }); {% endblock %} diff --git a/apps/activity/templates/activity/includes/activity_info.html b/apps/activity/templates/activity/includes/activity_info.html index a16ad33b..f9ea634b 100644 --- a/apps/activity/templates/activity/includes/activity_info.html +++ b/apps/activity/templates/activity/includes/activity_info.html @@ -70,7 +70,10 @@ SPDX-License-Identifier: GPL-3.0-or-later {% if ".change_"|has_perm:activity %} {% trans "edit"|capfirst %} {% endif %} - {% if activity.activity_type.can_invite and not activity_started %} + {% if not activity.valid and ".delete_"|has_perm:activity %} + {% trans "delete"|capfirst %} + {% endif %} + {% if activity.activity_type.can_invite and not activity_started and activity.valid %} {% trans "Invite" %} {% endif %} {% endif %} diff --git a/apps/activity/urls.py b/apps/activity/urls.py index 962be72a..63a3a169 100644 --- a/apps/activity/urls.py +++ b/apps/activity/urls.py @@ -15,4 +15,5 @@ urlpatterns = [ path('/update/', views.ActivityUpdateView.as_view(), name='activity_update'), path('new/', views.ActivityCreateView.as_view(), name='activity_create'), path('calendar.ics', views.CalendarView.as_view(), name='calendar_ics'), + path('/delete', views.ActivityDeleteView.as_view(), name='delete_activity'), ] diff --git a/apps/activity/views.py b/apps/activity/views.py index 80bc1506..3081c45b 100644 --- a/apps/activity/views.py +++ b/apps/activity/views.py @@ -9,7 +9,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import PermissionDenied from django.db import transaction from django.db.models import F, Q -from django.http import HttpResponse +from django.http import HttpResponse, JsonResponse from django.urls import reverse_lazy from django.utils import timezone from django.utils.decorators import method_decorator @@ -153,6 +153,34 @@ class ActivityUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): return reverse_lazy('activity:activity_detail', kwargs={"pk": self.kwargs["pk"]}) +class ActivityDeleteView(View): + """ + Deletes an Activity + """ + def delete(self, request, pk): + try: + activity = Activity.objects.get(pk=pk) + activity.delete() + return JsonResponse({"message": "Activity deleted"}) + except Activity.DoesNotExist: + return JsonResponse({"error": "Activity not found"}, status=404) + + def dispatch(self, *args, **kwargs): + """ + Don't display the delete button if the user has no right to delete. + """ + if not self.request.user.is_authenticated: + return self.handle_no_permission() + + activity = Activity.objects.get(pk=self.kwargs["pk"]) + if not PermissionBackend.check_perm(self.request, "activity.delete_activity", activity): + raise PermissionDenied(_("You are not allowed to delete this activity.")) + + if activity.valid: + raise PermissionDenied(_("This activity is valid.")) + return super().dispatch(*args, **kwargs) + + class ActivityInviteView(ProtectQuerysetMixin, ProtectedCreateView): """ Invite a Guest, The rules to invites someone are defined in `forms:activity.GuestForm` diff --git a/apps/food/views.py b/apps/food/views.py index f8c7977d..a5b86686 100644 --- a/apps/food/views.py +++ b/apps/food/views.py @@ -169,7 +169,8 @@ class BasicFoodCreateView(ProtectQuerysetMixin, ProtectedCreateView): template_name = "food/food_update.html" def get_sample_object(self): - return BasicFood( + # We choose a club which may work or BDE else + food = BasicFood( name="", owner_id=1, expiry_date=timezone.now(), @@ -178,6 +179,14 @@ class BasicFoodCreateView(ProtectQuerysetMixin, ProtectedCreateView): date_type='DLC', ) + for membership in self.request.user.memberships.all(): + club_id = membership.club.id + food.owner_id = club_id + if PermissionBackend.check_perm(self.request, "food.add_basicfood", food): + return food + + return food + @transaction.atomic def form_valid(self, form): if QRCode.objects.filter(qr_code_number=self.kwargs['slug']).count() > 0: @@ -228,13 +237,22 @@ class TransformedFoodCreateView(ProtectQuerysetMixin, ProtectedCreateView): template_name = "food/food_update.html" def get_sample_object(self): - return TransformedFood( + # We choose a club which may work or BDE else + food = TransformedFood( name="", owner_id=1, expiry_date=timezone.now(), is_ready=True, ) + for membership in self.request.user.memberships.all(): + club_id = membership.club.id + food.owner_id = club_id + if PermissionBackend.check_perm(self.request, "food.add_transformedfood", food): + return food + + return food + @transaction.atomic def form_valid(self, form): form.instance.expiry_date = timezone.now() + timedelta(days=3) @@ -246,10 +264,10 @@ class TransformedFoodCreateView(ProtectQuerysetMixin, ProtectedCreateView): return reverse_lazy('food:transformedfood_view', kwargs={"pk": self.object.pk}) -MAX_FORMS = 10 +MAX_FORMS = 100 -class ManageIngredientsView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): +class ManageIngredientsView(LoginRequiredMixin, UpdateView): """ A view to manage ingredient for a transformed food """ @@ -280,6 +298,14 @@ class ManageIngredientsView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView ingredient.end_of_life = _('Fully used in {meal}'.format( meal=self.object.name)) ingredient.save() + # We recalculate new expiry date and allergens + self.object.expiry_date = self.object.creation_date + self.object.shelf_life + self.object.allergens.clear() + + for ingredient in self.object.ingredients.iterator(): + if not (ingredient.polymorphic_ctype.model == 'basicfood' and ingredient.date_type == 'DDM'): + self.object.expiry_date = min(self.object.expiry_date, ingredient.expiry_date) + self.object.allergens.set(self.object.allergens.union(ingredient.allergens.all())) self.object.save(old_ingredients=old_ingredients, old_allergens=old_allergens) return HttpResponseRedirect(self.get_success_url()) diff --git a/apps/member/migrations/0014_create_bda.py b/apps/member/migrations/0014_create_bda.py new file mode 100644 index 00000000..3bebdf5d --- /dev/null +++ b/apps/member/migrations/0014_create_bda.py @@ -0,0 +1,46 @@ +from django.db import migrations + +def create_bda(apps, schema_editor): + """ + The club BDA is now pre-injected. + """ + Club = apps.get_model("member", "club") + NoteClub = apps.get_model("note", "noteclub") + Alias = apps.get_model("note", "alias") + ContentType = apps.get_model('contenttypes', 'ContentType') + polymorphic_ctype_id = ContentType.objects.get_for_model(NoteClub).id + + Club.objects.get_or_create( + id=10, + name="BDA", + email="bda.ensparissaclay@gmail.com", + require_memberships=True, + membership_fee_paid=750, + membership_fee_unpaid=750, + membership_duration=396, + membership_start="2024-08-01", + membership_end="2025-09-30", + ) + NoteClub.objects.get_or_create( + id=1937, + club_id=10, + polymorphic_ctype_id=polymorphic_ctype_id, + ) + Alias.objects.get_or_create( + id=1937, + note_id=1937, + name="BDA", + normalized_name="bda", + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('member', '0013_auto_20240801_1436'), + ] + + operations = [ + migrations.RunPython(create_bda), + ] + diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index f1f01dcc..28d47194 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -1695,7 +1695,7 @@ "wei", "weimembership" ], - "query": "[\"AND\", {\"club\": [\"club\"], \"club__weiclub__membership_end__gte\": [\"today\"]}, [\"OR\", {\"registration__soge_credit\": true}, {\"user__note__balance__gte\": {\"F\": [\"F\", \"fee\"]}}]]", + "query": "{\"club\": [\"club\"]}", "type": "add", "mask": 2, "field": "", @@ -3998,6 +3998,358 @@ "description": "Créer une transaction de ou vers la note d'un club tant que la source reste au dessus de -50 €" } }, + { + "model": "permission.permission", + "pk": 271, + "fields": { + "model": [ + "wei", + "bus" + ], + "query": "{\"wei\": [\"club\"]}", + "type": "change", + "mask": 3, + "field": "", + "permanent": false, + "description": "Modifier n'importe quel bus du wei" + } + }, + { + "model": "permission.permission", + "pk": 272, + "fields": { + "model": [ + "wei", + "bus" + ], + "query": "{\"wei\": [\"club\"]}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir tous les bus du wei" + } + }, + { + "model": "permission.permission", + "pk": 273, + "fields": { + "model": [ + "wei", + "busteam" + ], + "query": "{\"bus__wei\": [\"club\"], \"bus__wei__membership_end__gte\": [\"today\"]}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir toutes les équipes WEI" + } + }, + { + "model": "permission.permission", + "pk": 274, + "fields": { + "model": [ + "member", + "club" + ], + "query": "{\"bus__wei\": [\"club\"]}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir les informations de clubs des bus" + } + }, + { + "model": "permission.permission", + "pk": 275, + "fields": { + "model": [ + "member", + "club" + ], + "query": "{\"bus__wei\": [\"club\"]}", + "type": "change", + "mask": 3, + "field": "", + "permanent": false, + "description": "Modifier les clubs des bus" + } + }, + { + "model": "permission.permission", + "pk": 276, + "fields": { + "model": [ + "member", + "membership" + ], + "query": "{\"club__bus__wei\": [\"club\"]}", + "type": "add", + "mask": 3, + "field": "", + "permanent": false, + "description": "Ajouter un⋅e membre à un club de bus" + } + }, + { + "model": "permission.permission", + "pk": 277, + "fields": { + "model": [ + "member", + "membership" + ], + "query": "{\"club__bus__wei\": [\"club\"]}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir les adhérents d'un club de bus" + } + }, + { + "model": "permission.permission", + "pk": 278, + "fields": { + "model": [ + "member", + "membership" + ], + "query": "{\"club__bus__wei\": [\"club\"]}", + "type": "change", + "mask": 3, + "field": "", + "permanent": false, + "description": "Modifier l'adhésion d'un club de bus" + } + }, + { + "model": "permission.permission", + "pk": 279, + "fields": { + "model": [ + "note", + "note" + ], + "query": "{\"noteclub__club__bus__wei\": [\"club\"]}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir la note d'un club de bus" + } + }, + { + "model": "permission.permission", + "pk": 280, + "fields": { + "model": [ + "note", + "transaction" + ], + "query": "[\"OR\", {\"source__noteclub__club__bus__wei\": [\"club\"]}, {\"destination__noteclub__club__bus__wei\": [\"club\"]}]", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir les transactions d'un club de bus" + } + }, + { + "model": "permission.permission", + "pk": 281, + "fields": { + "model": [ + "note", + "transaction" + ], + "query": "[\"AND\", [\"OR\", {\"source__noteclub__club__bus__wei\": [\"club\"]}, {\"destination__noteclub__club__bus__wei\": [\"club\"]}], [\"OR\", {\"source__balance__gte\": {\"F\": [\"SUB\", [\"MUL\", [\"F\", \"amount\"], [\"F\", \"quantity\"]], 2000]}}, {\"valid\": false}]]", + "type": "add", + "mask": 3, + "field": "", + "permanent": false, + "description": "Créer une transaction d'un club de bus tant que la source reste au dessus de -20 €" + } + }, + { + "model": "permission.permission", + "pk": 282, + "fields": { + "model": [ + "note", + "transaction" + ], + "query": "[\"AND\", [\"OR\", {\"source__noteclub__club\": [\"club\"]}, {\"destination__noteclub__club\": [\"club\"]}], [\"OR\", {\"source__balance__gte\": {\"F\": [\"SUB\", [\"MUL\", [\"F\", \"amount\"], [\"F\", \"quantity\"]], 2000]}}, {\"valid\": false}]]", + "type": "add", + "mask": 3, + "field": "", + "permanent": false, + "description": "Créer une transaction d'un WEI tant que la source reste au dessus de -20 €" + } + }, + { + "model": "permission.permission", + "pk": 283, + "fields": { + "model": [ + "auth", + "user" + ], + "query": "{\"memberships__club__name\": \"Kfet\", \"memberships__roles__name\": \"Adh\u00e9rent\u22c5e Kfet\", \"memberships__date_start__lte\": [\"today\"], \"memberships__date_end__gte\": [\"today\"]}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir n'importe quel⋅le utilisateur⋅rice qui est adhérent⋅e Kfet" + } + }, + { + "model": "permission.permission", + "pk": 284, + "fields": { + "model": [ + "member", + "club" + ], + "query": "{\"bus\": [\"membership\", \"weimembership\", \"bus\"]}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir les informations de club de son bus" + } + }, + { + "model": "permission.permission", + "pk": 285, + "fields": { + "model": [ + "member", + "club" + ], + "query": "{\"bus\": [\"membership\", \"weimembership\", \"bus\"]}", + "type": "change", + "mask": 3, + "field": "", + "permanent": false, + "description": "Modifier le club de son bus" + } + }, + { + "model": "permission.permission", + "pk": 286, + "fields": { + "model": [ + "member", + "membership" + ], + "query": "{\"club__bus\": [\"membership\", \"weimembership\", \"bus\"]}", + "type": "add", + "mask": 3, + "field": "", + "permanent": false, + "description": "Ajouter un⋅e membre au club de son bus" + } + }, + { + "model": "permission.permission", + "pk": 287, + "fields": { + "model": [ + "member", + "membership" + ], + "query": "{\"club__bus\": [\"membership\", \"weimembership\", \"bus\"]}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir les adhérents du club de son bus" + } + }, + { + "model": "permission.permission", + "pk": 288, + "fields": { + "model": [ + "member", + "membership" + ], + "query": "{\"club__bus\": [\"membership\", \"weimembership\", \"bus\"]}", + "type": "change", + "mask": 3, + "field": "", + "permanent": false, + "description": "Modifier l'adhésion au club de son bus" + } + }, + { + "model": "permission.permission", + "pk": 289, + "fields": { + "model": [ + "note", + "note" + ], + "query": "{\"noteclub__club__bus\": [\"membership\", \"weimembership\", \"bus\"]}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir la note du club de son bus" + } + }, + { + "model": "permission.permission", + "pk": 290, + "fields": { + "model": [ + "note", + "transaction" + ], + "query": "[\"OR\", {\"source__noteclub__club__bus\": [\"membership\", \"weimembership\", \"bus\"]}, {\"destination__noteclub__club__bus\": [\"membership\", \"weimembership\", \"bus\"]}]", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir les transactions du club de son bus" + } + }, + { + "model": "permission.permission", + "pk": 291, + "fields": { + "model": [ + "wei", + "bus" + ], + "query": "{\"pk\": [\"membership\", \"weimembership\", \"bus\", \"pk\"], \"wei__date_end__gte\": [\"today\"]}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir mon bus" + } + }, + { + "model": "permission.permission", + "pk": 292, + "fields": { + "model": [ + "member", + "membership" + ], + "query": "{\"club__pk__lte\": 2}", + "type": "add", + "mask": 3, + "field": "", + "permanent": false, + "description": "Ajouter un membre au BDE ou à la Kfet" + } + }, { "model": "permission.role", "pk": 1, @@ -4091,8 +4443,8 @@ 158, 159, 160, - 212, - 222 + 212, + 222 ] } }, @@ -4133,14 +4485,14 @@ 50, 141, 169, - 217, - 218, - 219, - 220, - 221, - 247, - 258, - 259 + 217, + 218, + 219, + 220, + 221, + 247, + 258, + 259 ] } }, @@ -4152,8 +4504,8 @@ "name": "Pr\u00e9sident\u22c5e de club", "permissions": [ 62, - 142, - 135 + 135, + 142 ] } }, @@ -4358,6 +4710,8 @@ "name": "GC WEI", "permissions": [ 22, + 49, + 62, 70, 72, 76, @@ -4382,7 +4736,23 @@ 112, 113, 128, - 130 + 130, + 142, + 269, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 292 ] } }, @@ -4401,7 +4771,14 @@ 119, 120, 121, - 122 + 122, + 284, + 285, + 286, + 287, + 289, + 290, + 291 ] } }, @@ -4538,8 +4915,8 @@ "name": "GC anti-VSS", "permissions": [ 42, - 135, - 150, + 135, + 150, 163, 164 ] @@ -4555,13 +4932,147 @@ 137, 211, 212, - 213, - 214, - 215, - 216 + 213, + 214, + 215, + 216 ] } }, + { + "model": "permission.role", + "pk": 23, + "fields": { + "for_club": 2, + "name": "Darbonne", + "permissions": [ + 30, + 31, + 32 + ] + } + }, + { + "model": "permission.role", + "pk": 24, + "fields": { + "for_club": null, + "name": "Staffeur⋅euse (S&L,Respo Tech,...)", + "permissions": [] + } + }, + { + "model": "permission.role", + "pk": 25, + "fields": { + "for_club": null, + "name": "Référent⋅e Bus", + "permissions": [ + 22, + 84, + 115, + 117, + 118, + 119, + 120, + 121, + 122, + 284, + 285, + 286, + 287, + 289, + 290, + 291 + ] + } + }, + { + "model": "permission.role", + "pk": 28, + "fields": { + "for_club": 10, + "name": "Trésorièr⸱e BDA", + "permissions": [ + 55, + 56, + 57, + 58, + 135, + 143, + 176, + 177, + 178, + 243, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269 + ] + } + }, + { + "model": "permission.role", + "pk": 30, + "fields": { + "for_club": 10, + "name": "Respo sorties", + "permissions": [ + 49, + 62, + 141, + 241, + 242, + 243 + ] + } + }, + { + "model": "permission.role", + "pk": 31, + "fields": { + "for_club": 1, + "name": "Respo comm", + "permissions": [ + 135, + 244 + ] + } + }, + { + "model": "permission.role", + "pk": 32, + "fields": { + "for_club": 10, + "name": "Respo comm Art", + "permissions": [ + 135, + 245 + ] + } + }, + { + "model": "permission.role", + "pk": 33, + "fields": { + "for_club": 10, + "name": "Respo Jam", + "permissions": [ + 247, + 250, + 251, + 252, + 253, + 254 + ] + } + }, { "model": "wei.weirole", "pk": 12, @@ -4596,5 +5107,15 @@ "model": "wei.weirole", "pk": 18, "fields": {} + }, + { + "model": "wei.weirole", + "pk": 24, + "fields": {} + }, + { + "model": "wei.weirole", + "pk": 25, + "fields": {} } ] diff --git a/apps/permission/tests/test_permission_denied.py b/apps/permission/tests/test_permission_denied.py index 792bd1de..c2f3ad3a 100644 --- a/apps/permission/tests/test_permission_denied.py +++ b/apps/permission/tests/test_permission_denied.py @@ -10,7 +10,7 @@ from django.utils import timezone from django.utils.crypto import get_random_string from activity.models import Activity from member.models import Club, Membership -from note.models import NoteUser +from note.models import NoteUser, NoteClub from wei.models import WEIClub, Bus, WEIRegistration @@ -122,10 +122,13 @@ class TestPermissionDenied(TestCase): def test_validate_weiregistration(self): wei = WEIClub.objects.create( + name="WEI Test", membership_start=date.today(), date_start=date.today() + timedelta(days=1), date_end=date.today() + timedelta(days=1), + parent_club=Club.objects.get(name="Kfet"), ) + NoteClub.objects.create(club=wei) registration = WEIRegistration.objects.create(wei=wei, user=self.user, birth_date="2000-01-01") response = self.client.get(reverse("wei:validate_registration", kwargs=dict(pk=registration.pk))) self.assertEqual(response.status_code, 403) diff --git a/apps/wei/forms/__init__.py b/apps/wei/forms/__init__.py index e1a09c3a..71fb2c5f 100644 --- a/apps/wei/forms/__init__.py +++ b/apps/wei/forms/__init__.py @@ -1,10 +1,11 @@ # Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later -from .registration import WEIForm, WEIRegistrationForm, WEIMembership1AForm, WEIMembershipForm, BusForm, BusTeamForm +from .registration import WEIForm, WEIRegistrationForm, WEIRegistration1AForm, WEIRegistration2AForm, WEIMembership1AForm, \ + WEIMembershipForm, BusForm, BusTeamForm from .surveys import WEISurvey, WEISurveyInformation, WEISurveyAlgorithm, CurrentSurvey __all__ = [ - 'WEIForm', 'WEIRegistrationForm', 'WEIMembership1AForm', 'WEIMembershipForm', 'BusForm', 'BusTeamForm', + 'WEIForm', 'WEIRegistrationForm', 'WEIRegistration1AForm', 'WEIRegistration2AForm', 'WEIMembership1AForm', 'WEIMembershipForm', 'BusForm', 'BusTeamForm', 'WEISurvey', 'WEISurveyInformation', 'WEISurveyAlgorithm', 'CurrentSurvey', ] diff --git a/apps/wei/forms/registration.py b/apps/wei/forms/registration.py index 38568b93..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 @@ -24,6 +24,7 @@ class WEIForm(forms.ModelForm): "membership_end": DatePickerInput(), "date_start": DatePickerInput(), "date_end": DatePickerInput(), + "caution_amount": AmountInput(), } @@ -39,7 +40,11 @@ class WEIRegistrationForm(forms.ModelForm): class Meta: model = WEIRegistration - exclude = ('wei', 'clothing_cut') + fields = [ + 'user', 'soge_credit', 'birth_date', 'gender', 'clothing_size', + 'health_issues', 'emergency_contact_name', 'emergency_contact_phone', + 'first_year', 'information_json', 'caution_check' + ] widgets = { "user": Autocomplete( User, @@ -49,11 +54,30 @@ class WEIRegistrationForm(forms.ModelForm): 'placeholder': 'Nom ...', }, ), - "birth_date": DatePickerInput(options={'minDate': '1900-01-01', - 'maxDate': '2100-01-01'}), + "birth_date": DatePickerInput(options={ + 'minDate': '1900-01-01', + 'maxDate': '2100-01-01' + }), + "caution_check": forms.BooleanField( + required=False, + ), } +class WEIRegistration2AForm(WEIRegistrationForm): + class Meta(WEIRegistrationForm.Meta): + fields = WEIRegistrationForm.Meta.fields + ['caution_type'] + widgets = WEIRegistrationForm.Meta.widgets.copy() + widgets.update({ + "caution_type": forms.RadioSelect(), + }) + + +class WEIRegistration1AForm(WEIRegistrationForm): + class Meta(WEIRegistrationForm.Meta): + fields = WEIRegistrationForm.Meta.fields + + class WEIChooseBusForm(forms.Form): bus = forms.ModelMultipleChoiceField( queryset=Bus.objects, @@ -72,7 +96,7 @@ class WEIChooseBusForm(forms.Form): ) roles = forms.ModelMultipleChoiceField( - queryset=WEIRole.objects.filter(~Q(name="1A")), + 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(), @@ -81,13 +105,8 @@ class WEIChooseBusForm(forms.Form): class WEIMembershipForm(forms.ModelForm): - caution_check = forms.BooleanField( - required=False, - label=_("Caution check given"), - ) - roles = forms.ModelMultipleChoiceField( - queryset=WEIRole.objects, + queryset=WEIRole.objects.filter(~Q(name="GC WEI")), label=_("WEI Roles"), widget=CheckboxSelectMultiple(), ) @@ -121,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 \ @@ -132,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/forms/surveys/__init__.py b/apps/wei/forms/surveys/__init__.py index 0a33bc16..ef692d25 100644 --- a/apps/wei/forms/surveys/__init__.py +++ b/apps/wei/forms/surveys/__init__.py @@ -2,11 +2,11 @@ # SPDX-License-Identifier: GPL-3.0-or-later from .base import WEISurvey, WEISurveyInformation, WEISurveyAlgorithm -from .wei2024 import WEISurvey2024 +from .wei2025 import WEISurvey2025 __all__ = [ 'WEISurvey', 'WEISurveyInformation', 'WEISurveyAlgorithm', 'CurrentSurvey', ] -CurrentSurvey = WEISurvey2024 +CurrentSurvey = WEISurvey2025 diff --git a/apps/wei/forms/surveys/base.py b/apps/wei/forms/surveys/base.py index 3f3bff3b..c2fde39d 100644 --- a/apps/wei/forms/surveys/base.py +++ b/apps/wei/forms/surveys/base.py @@ -121,6 +121,13 @@ class WEISurveyAlgorithm: """ raise NotImplementedError + @classmethod + def get_bus_information_form(cls): + """ + The class of the form to update the bus information. + """ + raise NotImplementedError + class WEISurvey: """ diff --git a/apps/wei/forms/surveys/wei2025.py b/apps/wei/forms/surveys/wei2025.py new file mode 100644 index 00000000..d92cc23f --- /dev/null +++ b/apps/wei/forms/surveys/wei2025.py @@ -0,0 +1,347 @@ +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +import time +import json +from functools import lru_cache +from random import Random + +from django import forms +from django.db import transaction +from django.db.models import Q +from django.utils.translation import gettext_lazy as _ + +from .base import WEISurvey, WEISurveyInformation, WEISurveyAlgorithm, WEIBusInformation +from ...models import WEIMembership, Bus + +WORDS = [ + '13 organisé', '3ième mi temps', 'Années 2000', 'Apéro', 'BBQ', 'BP', 'Beauf', 'Binge drinking', 'Bon enfant', + 'Cartouche', 'Catacombes', 'Chansons paillardes', 'Chansons populaires', 'Chanteur', 'Chartreuse', 'Chill', + 'Core', 'DJ', 'Dancefloor', 'Danse', 'David Guetta', 'Disco', 'Eau de vie', 'Électro', 'Escalade', 'Familial', + 'Fanfare', 'Fracassage', 'Féria', 'Hard rock', 'Hoeggarden', 'House', 'Huit-six', 'IPA', 'Inclusif', 'Inferno', + 'Introverti', 'Jager bomb', 'Jazz', 'Jeux d\'alcool', 'Jeux de rôles', 'Jeux vidéo', 'Jul', 'Jus de fruit', + 'Karaoké', 'LGBTQI+', 'Lady Gaga', 'Loup garou', 'Morning beer', 'Métal', 'Nuit blanche', 'Ovalie', 'Psychedelic', + 'Pétanque', 'Rave', 'Reggae', 'Rhum', 'Ricard', 'Rock', 'Rosé', 'Rétro', 'Séducteur', 'Techno', 'Thérapie taxi', + 'Théâtre', 'Trap', 'Turn up', 'Underground', 'Volley', 'Wati B', 'Zinédine Zidane', +] + + +class WEISurveyForm2025(forms.Form): + """ + Survey form for the year 2025. + Members choose 20 words, from which we calculate the best associated bus. + """ + + word = forms.ChoiceField( + label=_("Choose a word:"), + widget=forms.RadioSelect(), + ) + + def set_registration(self, registration): + """ + Filter the bus selector with the buses of the current WEI. + """ + information = WEISurveyInformation2025(registration) + if not information.seed: + information.seed = int(1000 * time.time()) + information.save(registration) + registration._force_save = True + registration.save() + + if self.data: + self.fields["word"].choices = [(w, w) for w in WORDS] + if self.is_valid(): + return + + rng = Random((information.step + 1) * information.seed) + + buses = WEISurveyAlgorithm2025.get_buses() + informations = {bus: WEIBusInformation2025(bus) for bus in buses} + scores = sum((list(informations[bus].scores.values()) for bus in buses), []) + if scores: + average_score = sum(scores) / len(scores) + else: + average_score = 0 + + preferred_words = {bus: [word for word in WORDS + if informations[bus].scores[word] >= average_score] + for bus in buses} + + # Correction : proposer plusieurs mots différents à chaque étape + n_choices = 4 # Nombre de mots à proposer à chaque étape + all_preferred_words = set() + for bus_words in preferred_words.values(): + all_preferred_words.update(bus_words) + all_preferred_words = list(all_preferred_words) + rng.shuffle(all_preferred_words) + words = all_preferred_words[:n_choices] + self.fields["word"].choices = [(w, w) for w in words] + + +class WEIBusInformation2025(WEIBusInformation): + """ + For each word, the bus has a score + """ + scores: dict + + def __init__(self, bus): + self.scores = {} + for word in WORDS: + self.scores[word] = 0 + super().__init__(bus) + + +class BusInformationForm2025(forms.ModelForm): + class Meta: + model = Bus + fields = ['information_json'] + widgets = {} + + def __init__(self, *args, words=None, **kwargs): + super().__init__(*args, **kwargs) + + initial_scores = {} + if self.instance and self.instance.information_json: + try: + info = json.loads(self.instance.information_json) + initial_scores = info.get("scores", {}) + except (json.JSONDecodeError, TypeError, AttributeError): + initial_scores = {} + if words is None: + words = WORDS + self.words = words + + choices = [(i, str(i)) for i in range(6)] # [(0, '0'), (1, '1'), ..., (5, '5')] + for word in words: + self.fields[word] = forms.TypedChoiceField( + label=word, + choices=choices, + coerce=int, + initial=initial_scores.get(word, 0), + required=True, + widget=forms.RadioSelect, + help_text=_("Rate between 0 and 5."), + ) + + def clean(self): + cleaned_data = super().clean() + scores = {} + for word in self.words: + value = cleaned_data.get(word) + if value is not None: + scores[word] = value + # On encode en JSON + cleaned_data['information_json'] = json.dumps({"scores": scores}) + return cleaned_data + + +class WEISurveyInformation2025(WEISurveyInformation): + """ + We store the id of the selected bus. We store only the name, but is not used in the selection: + that's only for humans that try to read data. + """ + # Random seed that is stored at the first time to ensure that words are generated only once + seed = 0 + step = 0 + + def __init__(self, registration): + for i in range(1, 21): + setattr(self, "word" + str(i), None) + super().__init__(registration) + + +class WEISurvey2025(WEISurvey): + """ + Survey for the year 2025. + """ + + @classmethod + def get_year(cls): + return 2025 + + @classmethod + def get_survey_information_class(cls): + return WEISurveyInformation2025 + + def get_form_class(self): + return WEISurveyForm2025 + + def update_form(self, form): + """ + Filter the bus selector with the buses of the WEI. + """ + form.set_registration(self.registration) + + @transaction.atomic + def form_valid(self, form): + word = form.cleaned_data["word"] + self.information.step += 1 + setattr(self.information, "word" + str(self.information.step), word) + self.save() + + @classmethod + def get_algorithm_class(cls): + return WEISurveyAlgorithm2025 + + def is_complete(self) -> bool: + """ + The survey is complete once the bus is chosen. + """ + return self.information.step == 20 + + @classmethod + @lru_cache() + def word_mean(cls, word): + """ + Calculate the mid-score given by all buses. + """ + buses = cls.get_algorithm_class().get_buses() + return sum([cls.get_algorithm_class().get_bus_information(bus).scores[word] for bus in buses]) / buses.count() + + @lru_cache() + def score(self, bus): + if not self.is_complete(): + raise ValueError("Survey is not ended, can't calculate score") + + bus_info = self.get_algorithm_class().get_bus_information(bus) + # Score is the given score by the bus subtracted to the mid-score of the buses. + s = sum(bus_info.scores[getattr(self.information, 'word' + str(i))] + - self.word_mean(getattr(self.information, 'word' + str(i))) for i in range(1, 21)) / 20 + return s + + @lru_cache() + def scores_per_bus(self): + return {bus: self.score(bus) for bus in self.get_algorithm_class().get_buses()} + + @lru_cache() + def ordered_buses(self): + values = list(self.scores_per_bus().items()) + values.sort(key=lambda item: -item[1]) + return values + + @classmethod + def clear_cache(cls): + cls.word_mean.cache_clear() + return super().clear_cache() + + +class WEISurveyAlgorithm2025(WEISurveyAlgorithm): + """ + The algorithm class for the year 2025. + We use Gale-Shapley algorithm to attribute 1y students into buses. + """ + + @classmethod + def get_survey_class(cls): + return WEISurvey2025 + + @classmethod + def get_bus_information_class(cls): + return WEIBusInformation2025 + + @classmethod + def get_bus_information_form(cls): + return BusInformationForm2025 + + def run_algorithm(self, display_tqdm=False): + """ + Gale-Shapley algorithm implementation. + We modify it to allow buses to have multiple "weddings". + """ + surveys = list(self.get_survey_class()(r) for r in self.get_registrations()) # All surveys + surveys = [s for s in surveys if s.is_complete()] # Don't consider invalid surveys + # Don't manage hardcoded people + surveys = [s for s in surveys if not hasattr(s.information, 'hardcoded') or not s.information.hardcoded] + + # Reset previous algorithm run + for survey in surveys: + survey.free() + survey.save() + + non_men = [s for s in surveys if s.registration.gender != 'male'] + men = [s for s in surveys if s.registration.gender == 'male'] + + quotas = {} + registrations = self.get_registrations() + non_men_total = registrations.filter(~Q(gender='male')).count() + for bus in self.get_buses(): + free_seats = bus.size - WEIMembership.objects.filter(bus=bus, registration__first_year=False).count() + # Remove hardcoded people + free_seats -= WEIMembership.objects.filter(bus=bus, registration__first_year=True, + registration__information_json__icontains="hardcoded").count() + quotas[bus] = 4 + int(non_men_total / registrations.count() * free_seats) + + tqdm_obj = None + if display_tqdm: + from tqdm import tqdm + tqdm_obj = tqdm(total=len(non_men), desc="Non-hommes") + + # Repartition for non men people first + self.make_repartition(non_men, quotas, tqdm_obj=tqdm_obj) + + quotas = {} + for bus in self.get_buses(): + free_seats = bus.size - WEIMembership.objects.filter(bus=bus, registration__first_year=False).count() + free_seats -= sum(1 for s in non_men if s.information.selected_bus_pk == bus.pk) + # Remove hardcoded people + free_seats -= WEIMembership.objects.filter(bus=bus, registration__first_year=True, + registration__information_json__icontains="hardcoded").count() + quotas[bus] = free_seats + + if display_tqdm: + tqdm_obj.close() + + from tqdm import tqdm + tqdm_obj = tqdm(total=len(men), desc="Hommes") + + self.make_repartition(men, quotas, tqdm_obj=tqdm_obj) + + if display_tqdm: + tqdm_obj.close() + + # Clear cache information after running algorithm + WEISurvey2025.clear_cache() + + def make_repartition(self, surveys, quotas=None, tqdm_obj=None): + free_surveys = surveys.copy() # Remaining surveys + while free_surveys: # Some students are not affected + survey = free_surveys[0] + buses = survey.ordered_buses() # Preferences of the student + for bus, current_score in buses: + if self.get_bus_information(bus).has_free_seats(surveys, quotas): + # Selected bus has free places. Put student in the bus + survey.select_bus(bus) + survey.save() + free_surveys.remove(survey) + break + else: + # Current bus has not enough places. Remove the least preferred student from the bus if existing + least_preferred_survey = None + least_score = -1 + # Find the least student in the bus that has a lower score than the current student + for survey2 in surveys: + if not survey2.information.valid or survey2.information.get_selected_bus() != bus: + continue + score2 = survey2.score(bus) + if current_score <= score2: # Ignore better students + continue + if least_preferred_survey is None or score2 < least_score: + least_preferred_survey = survey2 + least_score = score2 + + if least_preferred_survey is not None: + # Remove the least student from the bus and put the current student in. + # If it does not exist, choose the next bus. + least_preferred_survey.free() + least_preferred_survey.save() + free_surveys.append(least_preferred_survey) + survey.select_bus(bus) + survey.save() + free_surveys.remove(survey) + break + else: + raise ValueError(f"User {survey.registration.user} has no free seat") + + if tqdm_obj is not None: + tqdm_obj.n = len(surveys) - len(free_surveys) + tqdm_obj.refresh() diff --git a/apps/wei/migrations/0011_alter_weiclub_year.py b/apps/wei/migrations/0011_alter_weiclub_year.py new file mode 100644 index 00000000..086ea4eb --- /dev/null +++ b/apps/wei/migrations/0011_alter_weiclub_year.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.21 on 2025-05-25 12:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wei', '0010_remove_weiregistration_specific_diet'), + ] + + operations = [ + migrations.AlterField( + model_name='weiclub', + name='year', + field=models.PositiveIntegerField(default=2025, unique=True, verbose_name='year'), + ), + ] diff --git a/apps/wei/migrations/0012_bus_club.py b/apps/wei/migrations/0012_bus_club.py new file mode 100644 index 00000000..80f2e14b --- /dev/null +++ b/apps/wei/migrations/0012_bus_club.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.21 on 2025-05-29 16:16 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('member', '0014_create_bda'), + ('wei', '0011_alter_weiclub_year'), + ] + + operations = [ + migrations.AddField( + model_name='bus', + name='club', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bus', to='member.club', verbose_name='club'), + ), + ] diff --git a/apps/wei/migrations/0013_weiclub_caution_amount_weiregistration_caution_type.py b/apps/wei/migrations/0013_weiclub_caution_amount_weiregistration_caution_type.py new file mode 100644 index 00000000..49a9a4b6 --- /dev/null +++ b/apps/wei/migrations/0013_weiclub_caution_amount_weiregistration_caution_type.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.21 on 2025-06-01 21:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wei', '0012_bus_club'), + ] + + operations = [ + migrations.AddField( + model_name='weiclub', + name='caution_amount', + field=models.PositiveIntegerField(default=0, verbose_name='caution amount'), + ), + migrations.AddField( + model_name='weiregistration', + name='caution_type', + field=models.CharField(choices=[('check', 'Check'), ('note', 'Note transaction')], default='check', max_length=16, verbose_name='caution type'), + ), + ] diff --git a/apps/wei/models.py b/apps/wei/models.py index f4169316..684feaf8 100644 --- a/apps/wei/models.py +++ b/apps/wei/models.py @@ -33,6 +33,11 @@ class WEIClub(Club): verbose_name=_("date end"), ) + caution_amount = models.PositiveIntegerField( + verbose_name=_("caution amount"), + default=0, + ) + class Meta: verbose_name = _("WEI") verbose_name_plural = _("WEI") @@ -72,6 +77,15 @@ class Bus(models.Model): default=50, ) + club = models.OneToOneField( + Club, + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name="bus", + verbose_name=_("club"), + ) + description = models.TextField( blank=True, default="", @@ -188,6 +202,16 @@ class WEIRegistration(models.Model): verbose_name=_("Caution check given") ) + caution_type = models.CharField( + max_length=16, + choices=( + ('check', _("Check")), + ('note', _("Note transaction")), + ), + default='check', + verbose_name=_("caution type"), + ) + birth_date = models.DateField( verbose_name=_("birth date"), ) diff --git a/apps/wei/tables.py b/apps/wei/tables.py index de5c84af..c8837e44 100644 --- a/apps/wei/tables.py +++ b/apps/wei/tables.py @@ -98,7 +98,7 @@ class WEIRegistrationTable(tables.Table): if not hasperm: return format_html("") - url = reverse_lazy('wei:validate_registration', args=(record.pk,)) + url = reverse_lazy('wei:wei_update_registration', args=(record.pk,)) + '?validate=true' text = _('Validate') if record.fee > record.user.note.balance and not record.soge_credit: btn_class = 'btn-secondary' diff --git a/apps/wei/templates/wei/base.html b/apps/wei/templates/wei/base.html index 43d61797..975b71c8 100644 --- a/apps/wei/templates/wei/base.html +++ b/apps/wei/templates/wei/base.html @@ -40,22 +40,20 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% trans 'membership fee'|capfirst %}
{{ club.membership_fee_paid|pretty_money }}
{% else %} - {% with bde_kfet_fee=club.parent_club.membership_fee_paid|add:club.parent_club.parent_club.membership_fee_paid %} -
{% trans 'WEI fee (paid students)'|capfirst %}
-
{{ club.membership_fee_paid|add:bde_kfet_fee|pretty_money }} -
- {% endwith %} - {% with bde_kfet_fee=club.parent_club.membership_fee_unpaid|add:club.parent_club.parent_club.membership_fee_unpaid %} +
{% trans 'WEI fee (paid students)'|capfirst %}
+
{{ club.membership_fee_paid|pretty_money }} +
{% trans 'WEI fee (unpaid students)'|capfirst %}
-
{{ club.membership_fee_unpaid|add:bde_kfet_fee|pretty_money }} -
- {% endwith %} +
{{ club.membership_fee_unpaid|pretty_money }} {% endif %} {% endif %} + {% if club.caution_amount > 0 %} +
{% trans 'Caution amount'|capfirst %}
+
{{ club.caution_amount|pretty_money }}
+ {% endif %} + {% if "note.view_note"|has_perm:club.note %}
{% trans 'balance'|capfirst %}
{{ club.note.balance | pretty_money }}
diff --git a/apps/wei/templates/wei/bus_detail.html b/apps/wei/templates/wei/bus_detail.html index c8f3ce20..af4eaccb 100644 --- a/apps/wei/templates/wei/bus_detail.html +++ b/apps/wei/templates/wei/bus_detail.html @@ -16,8 +16,14 @@ SPDX-License-Identifier: GPL-3.0-or-later diff --git a/apps/wei/templates/wei/busteam_detail.html b/apps/wei/templates/wei/busteam_detail.html index 27348d03..1b5dc3c3 100644 --- a/apps/wei/templates/wei/busteam_detail.html +++ b/apps/wei/templates/wei/busteam_detail.html @@ -18,6 +18,8 @@ SPDX-License-Identifier: GPL-3.0-or-later diff --git a/apps/wei/templates/wei/busteam_form.html b/apps/wei/templates/wei/busteam_form.html index c62fec40..24522a80 100644 --- a/apps/wei/templates/wei/busteam_form.html +++ b/apps/wei/templates/wei/busteam_form.html @@ -13,9 +13,17 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% csrf_token %} + {{ form.media }} {{ form|crispy }}
+ {% endblock %} \ No newline at end of file diff --git a/apps/wei/templates/wei/weiclub_detail.html b/apps/wei/templates/wei/weiclub_detail.html index cd4b5efb..f7c18c9a 100644 --- a/apps/wei/templates/wei/weiclub_detail.html +++ b/apps/wei/templates/wei/weiclub_detail.html @@ -95,9 +95,11 @@ SPDX-License-Identifier: GPL-3.0-or-later {% endif %} - {% if can_validate_1a %} - {% trans "Attribute buses" %} - {% endif %} +{% if can_validate_1a %} + {% trans "Attribute buses" %} +{% endif %} + + {% endblock %} {% block extrajavascript %} diff --git a/apps/wei/templates/wei/weimembership_form.html b/apps/wei/templates/wei/weimembership_form.html index ff3024ca..a9c85d5d 100644 --- a/apps/wei/templates/wei/weimembership_form.html +++ b/apps/wei/templates/wei/weimembership_form.html @@ -143,25 +143,35 @@ SPDX-License-Identifier: GPL-3.0-or-later {% endblocktrans %} {% else %} - {% if registration.user.note.balance < fee %} -
- {% with pretty_fee=fee|pretty_money %} - {% blocktrans trimmed with balance=registration.user.note.balance|pretty_money %} - The note don't have enough money ({{ balance }}, {{ pretty_fee }} required). - The registration may fail if you don't credit the note now. - {% endblocktrans %} - {% endwith %} -
- {% else %} -
- {% blocktrans trimmed with pretty_fee=fee|pretty_money %} - The note has enough money ({{ pretty_fee }} required), the registration is possible. - {% 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 %}
  • +
  • {% 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 %} - {% if not registration.caution_check and not registration.first_year %} + {% if not registration.caution_check and not registration.first_year and registration.caution_type == 'check' %}
{% trans "The user didn't give her/his caution check." %}
@@ -200,4 +210,27 @@ SPDX-License-Identifier: GPL-3.0-or-later } } + {% endblock %} diff --git a/apps/wei/tests/test_wei_algorithm_2024.py b/apps/wei/tests/test_wei_algorithm_2024.py index bae36399..d1e5f428 100644 --- a/apps/wei/tests/test_wei_algorithm_2024.py +++ b/apps/wei/tests/test_wei_algorithm_2024.py @@ -6,8 +6,6 @@ from datetime import date, timedelta from django.contrib.auth.models import User from django.test import TestCase -from django.urls import reverse -from note.models import NoteUser from ..forms.surveys.wei2024 import WEIBusInformation2024, WEISurvey2024, WORDS, WEISurveyInformation2024 from ..models import Bus, WEIClub, WEIRegistration @@ -129,44 +127,3 @@ class TestWEIAlgorithm(TestCase): self.assertLessEqual(max_score - score, 25) # Always less than 25 % of tolerance self.assertLessEqual(penalty / 100, 25) # Tolerance of 5 % - - def test_register_1a(self): - """ - Test register a first year member to the WEI and complete the survey - """ - response = self.client.get(reverse("wei:wei_register_1A", kwargs=dict(wei_pk=self.wei.pk))) - self.assertEqual(response.status_code, 200) - - user = User.objects.create(username="toto", email="toto@example.com") - NoteUser.objects.create(user=user) - response = self.client.post(reverse("wei:wei_register_1A", kwargs=dict(wei_pk=self.wei.pk)), dict( - user=user.id, - soge_credit=True, - birth_date=date(2000, 1, 1), - gender='nonbinary', - clothing_cut='female', - clothing_size='XS', - health_issues='I am a bot', - emergency_contact_name='NoteKfet2020', - emergency_contact_phone='+33123456789', - )) - qs = WEIRegistration.objects.filter(user_id=user.id) - self.assertTrue(qs.exists()) - registration = qs.get() - self.assertRedirects(response, reverse("wei:wei_survey", kwargs=dict(pk=registration.pk)), 302, 200) - for question in WORDS: - # Fill 1A Survey, 10 pages - # be careful if questionnary form change (number of page, type of answer...) - response = self.client.post(reverse("wei:wei_survey", kwargs=dict(pk=registration.pk)), { - question: "1" - }) - registration.refresh_from_db() - survey = WEISurvey2024(registration) - self.assertRedirects(response, reverse("wei:wei_survey", kwargs=dict(pk=registration.pk)), 302, - 302 if survey.is_complete() else 200) - self.assertIsNotNone(getattr(survey.information, question), "Survey page " + question + " failed") - survey = WEISurvey2024(registration) - self.assertTrue(survey.is_complete()) - survey.select_bus(self.buses[0]) - survey.save() - self.assertIsNotNone(survey.information.get_selected_bus()) diff --git a/apps/wei/tests/test_wei_algorithm_2025.py b/apps/wei/tests/test_wei_algorithm_2025.py new file mode 100644 index 00000000..5930eb3b --- /dev/null +++ b/apps/wei/tests/test_wei_algorithm_2025.py @@ -0,0 +1,111 @@ +# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +import random + +from django.contrib.auth.models import User +from django.test import TestCase + +from ..forms.surveys.wei2025 import WEIBusInformation2025, WEISurvey2025, WORDS, WEISurveyInformation2025 +from ..models import Bus, WEIClub, WEIRegistration + + +class TestWEIAlgorithm(TestCase): + """ + Run some tests to ensure that the WEI algorithm is working well. + """ + fixtures = ('initial',) + + def setUp(self): + """ + Create some test data, with one WEI and 10 buses with random score attributions. + """ + self.wei = WEIClub.objects.create( + name="WEI 2025", + email="wei2025@example.com", + date_start='2025-09-12', + date_end='2025-09-14', + year=2025, + membership_start='2025-06-01' + ) + + self.buses = [] + for i in range(10): + bus = Bus.objects.create(wei=self.wei, name=f"Bus {i}", size=10) + self.buses.append(bus) + information = WEIBusInformation2025(bus) + for word in WORDS: + information.scores[word] = random.randint(0, 101) + information.save() + bus.save() + + def test_survey_algorithm_small(self): + """ + There are only a few people in each bus, ensure that each person has its best bus + """ + # Add a few users + for i in range(10): + user = User.objects.create(username=f"user{i}") + registration = WEIRegistration.objects.create( + user=user, + wei=self.wei, + first_year=True, + birth_date='2000-01-01', + ) + information = WEISurveyInformation2025(registration) + for j in range(1, 21): + setattr(information, f'word{j}', random.choice(WORDS)) + information.step = 20 + information.save(registration) + registration.save() + + # Run algorithm + WEISurvey2025.get_algorithm_class()().run_algorithm() + + # Ensure that everyone has its first choice + for r in WEIRegistration.objects.filter(wei=self.wei).all(): + survey = WEISurvey2025(r) + preferred_bus = survey.ordered_buses()[0][0] + chosen_bus = survey.information.get_selected_bus() + self.assertEqual(preferred_bus, chosen_bus) + + def test_survey_algorithm_full(self): + """ + Buses are full of first year people, ensure that they are happy + """ + # Add a lot of users + for i in range(95): + user = User.objects.create(username=f"user{i}") + registration = WEIRegistration.objects.create( + user=user, + wei=self.wei, + first_year=True, + birth_date='2000-01-01', + ) + information = WEISurveyInformation2025(registration) + for j in range(1, 21): + setattr(information, f'word{j}', random.choice(WORDS)) + information.step = 20 + information.save(registration) + registration.save() + + # Run algorithm + WEISurvey2025.get_algorithm_class()().run_algorithm() + + penalty = 0 + # Ensure that everyone seems to be happy + # We attribute a penalty for each user that didn't have its first choice + # The penalty is the square of the distance between the score of the preferred bus + # and the score of the attributed bus + # We consider it acceptable if the mean of this distance is lower than 5 % + for r in WEIRegistration.objects.filter(wei=self.wei).all(): + survey = WEISurvey2025(r) + chosen_bus = survey.information.get_selected_bus() + buses = survey.ordered_buses() + score = min(v for bus, v in buses if bus == chosen_bus) + max_score = buses[0][1] + penalty += (max_score - score) ** 2 + + self.assertLessEqual(max_score - score, 25) # Always less than 25 % of tolerance + + self.assertLessEqual(penalty / 100, 25) # Tolerance of 5 % diff --git a/apps/wei/tests/test_wei_registration.py b/apps/wei/tests/test_wei_registration.py index ffff04c9..d286581c 100644 --- a/apps/wei/tests/test_wei_registration.py +++ b/apps/wei/tests/test_wei_registration.py @@ -126,6 +126,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, )) qs = WEIClub.objects.filter(name="Create WEI Test", year=self.year + 1) self.assertTrue(qs.exists()) @@ -160,6 +161,7 @@ class TestWEIRegistration(TestCase): membership_end="2000-09-30", date_start="2000-09-01", date_end="2000-09-03", + caution_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) @@ -318,6 +320,7 @@ class TestWEIRegistration(TestCase): bus=[], team=[], roles=[], + caution_type='check' )) self.assertEqual(response.status_code, 200) self.assertFalse(response.context["membership_form"].is_valid()) @@ -334,7 +337,8 @@ class TestWEIRegistration(TestCase): emergency_contact_phone='+33123456789', bus=[self.bus.id], team=[self.team.id], - roles=[role.id for role in WEIRole.objects.filter(~Q(name="1A")).all()], + roles=[role.id for role in WEIRole.objects.filter(~Q(name="1A") & ~Q(name="GC WEI")).all()], + caution_type='check' )) qs = WEIRegistration.objects.filter(user_id=user.id) self.assertTrue(qs.exists()) @@ -354,6 +358,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' )) self.assertEqual(response.status_code, 200) self.assertTrue("This user is already registered to this WEI." in str(response.context["form"].errors)) @@ -506,11 +511,12 @@ 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' ) ) qs = WEIRegistration.objects.filter(user_id=self.user.id, soge_credit=False, clothing_size="M") self.assertTrue(qs.exists()) - self.assertRedirects(response, reverse("wei:validate_registration", kwargs=dict(pk=qs.get().pk)), 302, 200) + self.assertRedirects(response, reverse("wei:wei_detail", kwargs=dict(pk=qs.get().wei.pk)), 302, 200) # Check the page when the registration is already validated membership = WEIMembership( @@ -560,11 +566,12 @@ 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' ) ) qs = WEIRegistration.objects.filter(user_id=self.user.id, clothing_size="L") self.assertTrue(qs.exists()) - self.assertRedirects(response, reverse("wei:validate_registration", kwargs=dict(pk=qs.get().pk)), 302, 200) + self.assertRedirects(response, reverse("wei:wei_detail", kwargs=dict(pk=qs.get().wei.pk)), 302, 200) # Test invalid form response = self.client.post( @@ -583,6 +590,7 @@ class TestWEIRegistration(TestCase): team=[], roles=[], information_json=self.registration.information_json, + caution_type='check' ) ) self.assertFalse(response.context["membership_form"].is_valid()) @@ -624,7 +632,7 @@ class TestWEIRegistration(TestCase): second_bus = Bus.objects.create(wei=self.wei, name="Second bus") second_team = BusTeam.objects.create(bus=second_bus, name="Second team", color=42) response = self.client.post(reverse("wei:validate_registration", kwargs=dict(pk=self.registration.pk)), dict( - roles=[WEIRole.objects.get(name="GC WEI").id], + roles=[WEIRole.objects.get(name="Adhérent⋅e WEI").id], bus=self.bus.pk, team=second_team.pk, credit_type=4, # Bank transfer @@ -632,13 +640,14 @@ class TestWEIRegistration(TestCase): last_name="admin", first_name="admin", bank="Société générale", + caution_check=True, )) self.assertEqual(response.status_code, 200) self.assertFalse(response.context["form"].is_valid()) self.assertTrue("This team doesn't belong to the given bus." in str(response.context["form"].errors)) response = self.client.post(reverse("wei:validate_registration", kwargs=dict(pk=self.registration.pk)), dict( - roles=[WEIRole.objects.get(name="GC WEI").id], + roles=[WEIRole.objects.get(name="Adhérent⋅e WEI").id], bus=self.bus.pk, team=self.team.pk, credit_type=4, # Bank transfer @@ -646,8 +655,10 @@ class TestWEIRegistration(TestCase): last_name="admin", first_name="admin", bank="Société générale", + caution_check=True, )) self.assertRedirects(response, reverse("wei:wei_registrations", kwargs=dict(pk=self.registration.wei.pk)), 302, 200) + # Check if the membership is successfully created membership = WEIMembership.objects.filter(user_id=self.user.id, club=self.wei) self.assertTrue(membership.exists()) @@ -767,7 +778,7 @@ class TestDefaultWEISurvey(TestCase): WEISurvey.update_form(None, None) self.assertEqual(CurrentSurvey.get_algorithm_class().get_survey_class(), CurrentSurvey) - self.assertEqual(CurrentSurvey.get_year(), 2024) + self.assertEqual(CurrentSurvey.get_year(), 2025) class TestWeiAPI(TestAPI): diff --git a/apps/wei/urls.py b/apps/wei/urls.py index 3084dd51..5f9283c0 100644 --- a/apps/wei/urls.py +++ b/apps/wei/urls.py @@ -4,7 +4,7 @@ from django.urls import path from .views import CurrentWEIDetailView, WEI1AListView, WEIListView, WEICreateView, WEIDetailView, WEIUpdateView, \ - WEIRegistrationsView, WEIMembershipsView, MemberListRenderView, \ + WEIRegistrationsView, WEIMembershipsView, MemberListRenderView, BusInformationUpdateView, \ BusCreateView, BusManageView, BusUpdateView, BusTeamCreateView, BusTeamManageView, BusTeamUpdateView, \ WEIAttributeBus1AView, WEIAttributeBus1ANextView, WEIRegister1AView, WEIRegister2AView, WEIUpdateRegistrationView, \ WEIDeleteRegistrationView, WEIValidateRegistrationView, WEISurveyView, WEISurveyEndView, WEIClosedView @@ -42,4 +42,5 @@ urlpatterns = [ path('detail//closed/', WEIClosedView.as_view(), name="wei_closed"), path('bus-1A//', WEIAttributeBus1AView.as_view(), name="wei_bus_1A"), path('bus-1A/next//', WEIAttributeBus1ANextView.as_view(), name="wei_bus_1A_next"), + path('update-bus-info//', BusInformationUpdateView.as_view(), name="update_bus_info"), ] diff --git a/apps/wei/views.py b/apps/wei/views.py index a2e8ccff..bfc7c616 100644 --- a/apps/wei/views.py +++ b/apps/wei/views.py @@ -4,16 +4,18 @@ import os import shutil import subprocess -from datetime import date, timedelta +from datetime import date from tempfile import mkdtemp from django.conf import settings +from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.models import User from django.core.exceptions import PermissionDenied from django.db import transaction from django.db.models import Q, Count from django.db.models.functions.text import Lower +from django import forms from django.http import HttpResponse, Http404 from django.shortcuts import redirect from django.template.loader import render_to_string @@ -33,7 +35,7 @@ from permission.views import ProtectQuerysetMixin, ProtectedCreateView from .forms.registration import WEIChooseBusForm from .models import WEIClub, WEIRegistration, WEIMembership, Bus, BusTeam, WEIRole -from .forms import WEIForm, WEIRegistrationForm, BusForm, BusTeamForm, WEIMembership1AForm, \ +from .forms import WEIForm, WEIRegistrationForm, WEIRegistration1AForm, WEIRegistration2AForm, BusForm, BusTeamForm, WEIMembership1AForm, \ WEIMembershipForm, CurrentSurvey from .tables import BusRepartitionTable, BusTable, BusTeamTable, WEITable, WEIRegistrationTable, \ WEIRegistration1ATable, WEIMembershipTable @@ -441,6 +443,10 @@ class BusTeamCreateView(ProtectQuerysetMixin, ProtectedCreateView): self.object.refresh_from_db() return reverse_lazy("wei:manage_bus_team", kwargs={"pk": self.object.pk}) + def get_template_names(self): + names = super().get_template_names() + return names + class BusTeamUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): """ @@ -473,6 +479,10 @@ class BusTeamUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): self.object.refresh_from_db() return reverse_lazy("wei:manage_bus_team", kwargs={"pk": self.object.pk}) + def get_template_names(self): + names = super().get_template_names() + return names + class BusTeamManageView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): """ @@ -500,7 +510,7 @@ class WEIRegister1AView(ProtectQuerysetMixin, ProtectedCreateView): Register a new user to the WEI """ model = WEIRegistration - form_class = WEIRegistrationForm + form_class = WEIRegistration1AForm extra_context = {"title": _("Register first year student to the WEI")} def get_sample_object(self): @@ -546,9 +556,17 @@ class WEIRegister1AView(ProtectQuerysetMixin, ProtectedCreateView): def get_form(self, form_class=None): form = super().get_form(form_class) form.fields["user"].initial = self.request.user - del form.fields["first_year"] - del form.fields["caution_check"] - del form.fields["information_json"] + + # 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 "information_json" in form.fields: + del form.fields["information_json"] + if "caution_type" in form.fields: + del form.fields["caution_type"] + return form @transaction.atomic @@ -586,7 +604,7 @@ class WEIRegister2AView(ProtectQuerysetMixin, ProtectedCreateView): Register an old user to the WEI """ model = WEIRegistration - form_class = WEIRegistrationForm + form_class = WEIRegistration2AForm extra_context = {"title": _("Register old student to the WEI")} def get_sample_object(self): @@ -644,9 +662,19 @@ class WEIRegister2AView(ProtectQuerysetMixin, ProtectedCreateView): form.fields["soge_credit"].disabled = True form.fields["soge_credit"].help_text = _("You already opened an account in the Société générale.") - del form.fields["caution_check"] - del form.fields["first_year"] - del form.fields["information_json"] + # 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 "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) return form @@ -673,6 +701,9 @@ class WEIRegister2AView(ProtectQuerysetMixin, ProtectedCreateView): information["preferred_roles_pk"] = [role.pk for role in choose_bus_form.cleaned_data["roles"]] information["preferred_roles_name"] = [role.name for role in choose_bus_form.cleaned_data["roles"]] form.instance.information = information + + # Sauvegarder le type de caution + form.instance.caution_type = form.cleaned_data["caution_type"] form.instance.save() if 'treasury' in settings.INSTALLED_APPS: @@ -702,11 +733,15 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update # We can't update a registration once the WEI is started and before the membership start date if today >= wei.date_start or today < wei.membership_start: return redirect(reverse_lazy('wei:wei_closed', args=(wei.pk,))) + # Store the validate parameter in the view's state + self.should_validate = request.GET.get('validate', False) return super().dispatch(request, *args, **kwargs) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["club"] = self.object.wei + # Pass the validate parameter to the template + context["should_validate"] = self.should_validate if self.object.is_validated: membership_form = self.get_membership_form(instance=self.object.membership, @@ -740,10 +775,21 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update # 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): 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"] + + # 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) + 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"] @@ -759,10 +805,30 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update def form_valid(self, form): # If the membership is already validated, then we update the bus and the team (and the roles) if form.instance.is_validated: - membership_form = self.get_membership_form(self.request.POST, form.instance.membership) - if not membership_form.is_valid(): + try: + membership = form.instance.membership + if membership is None: + raise ValueError(_("No membership found for this registration")) + + membership_form = self.get_membership_form(self.request.POST, instance=membership) + if not membership_form.is_valid(): + return self.form_invalid(form) + + # Vérifier que l'utilisateur a la permission de modifier le membership + # On vérifie d'abord si l'utilisateur a la permission générale de modification + if not self.request.user.has_perm("wei.change_weimembership"): + raise PermissionDenied(_("You don't have the permission to update memberships")) + + # On vérifie ensuite les permissions spécifiques pour chaque champ modifié + for field_name in membership_form.changed_data: + perm = f"wei.change_weimembership_{field_name}" + if not self.request.user.has_perm(perm): + raise PermissionDenied(_("You don't have the permission to update the field %(field)s") % {'field': field_name}) + + membership_form.save() + except (WEIMembership.DoesNotExist, ValueError, PermissionDenied) as e: + form.add_error(None, str(e)) return self.form_invalid(form) - membership_form.save() # If it is not validated and if this is an old member, then we update the choices elif not form.instance.first_year and PermissionBackend.check_perm( self.request, "wei.change_weiregistration_information_json", self.object): @@ -777,6 +843,10 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update information["preferred_roles_pk"] = [role.pk for role in choose_bus_form.cleaned_data["roles"]] information["preferred_roles_name"] = [role.name for role in choose_bus_form.cleaned_data["roles"]] 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"] form.instance.save() return super().form_valid(form) @@ -787,14 +857,8 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update survey = CurrentSurvey(self.object) if not survey.is_complete(): return reverse_lazy("wei:wei_survey", kwargs={"pk": self.object.pk}) - if PermissionBackend.check_perm(self.request, "wei.add_weimembership", WEIMembership( - club=self.object.wei, - user=self.object.user, - date_start=date.today(), - date_end=date.today(), - fee=0, - registration=self.object, - )): + # On redirige vers la validation uniquement si c'est explicitement demandé (et stocké dans la vue) + if self.should_validate and self.request.user.has_perm("wei.add_weimembership"): return reverse_lazy("wei:validate_registration", kwargs={"pk": self.object.pk}) return reverse_lazy("wei:wei_detail", kwargs={"pk": self.object.wei.pk}) @@ -836,18 +900,23 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): extra_context = {"title": _("Validate WEI registration")} def get_sample_object(self): + """ + Return a sample object for permission checking + """ registration = WEIRegistration.objects.get(pk=self.kwargs["pk"]) return WEIMembership( - club=registration.wei, user=registration.user, - date_start=date.today(), - date_end=date.today() + timedelta(days=1), - fee=0, + club=registration.wei, + date_start=registration.wei.date_start, + fee=registration.wei.membership_fee_paid if registration.user.profile.paid else registration.wei.membership_fee_unpaid, + # Add any fields needed for proper permission checking registration=registration, ) def dispatch(self, request, *args, **kwargs): - wei = WEIRegistration.objects.get(pk=self.kwargs["pk"]).wei + registration = WEIRegistration.objects.get(pk=self.kwargs["pk"]) + + wei = registration.wei today = date.today() # We can't validate anyone once the WEI is started and before the membership start date if today >= wei.date_start or today < wei.membership_start: @@ -878,7 +947,14 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): date_start__gte=bde.membership_start, ).exists() - context["fee"] = registration.fee + fee = registration.fee + context["fee"] = fee + + # Calculer le montant total nécessaire (frais + caution si transaction) + total_needed = fee + if registration.caution_type == 'note': + total_needed += registration.wei.caution_amount + context["total_needed"] = total_needed form = context["form"] if registration.soge_credit: @@ -890,18 +966,41 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): def get_form_class(self): registration = WEIRegistration.objects.get(pk=self.kwargs["pk"]) - if registration.first_year and 'sleected_bus_pk' not in registration.information: + if registration.first_year and 'selected_bus_pk' not in registration.information: 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"]) form.fields["last_name"].initial = registration.user.last_name form.fields["first_name"].initial = registration.user.first_name - if "caution_check" in form.fields: - form.fields["caution_check"].initial = registration.caution_check + # Ajouter le champ caution_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( + required=True, + initial=registration.caution_check, + label=_("Caution check given"), + help_text=_("Please make sure the check is given before validating the registration") + ) + else: + form.fields["caution_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 + } + ) if registration.soge_credit: form.fields["credit_type"].disabled = True @@ -985,10 +1084,20 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): if credit_type is None or registration.soge_credit: credit_amount = 0 - if not registration.soge_credit and user.note.balance + credit_amount < fee: - # Users must have money before registering to the WEI. + # Calculer le montant total nécessaire (frais + caution si transaction) + total_needed = fee + if registration.caution_type == 'note': + 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: form.add_error('credit_type', - _("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 to join this club and pay the deposit. " + "Current balance: %(balance)d€, credit: %(credit)d€, needed: %(needed)d€") % { + 'balance': user.note.balance, + 'credit': credit_amount, + 'needed': total_needed} + ) return super().form_invalid(form) if credit_amount: @@ -1028,6 +1137,18 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): membership.refresh_from_db() 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': + 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}, + valid=True, + ) + return super().form_valid(form) def get_success_url(self): @@ -1247,6 +1368,7 @@ class WEI1AListView(LoginRequiredMixin, ProtectQuerysetMixin, SingleTableView): def get_queryset(self, filter_permissions=True, **kwargs): qs = super().get_queryset(filter_permissions, **kwargs) qs = qs.filter(first_year=True, membership__isnull=False) + qs = qs.filter(wei=self.club) qs = qs.order_by('-membership__bus') return qs @@ -1289,8 +1411,48 @@ class WEIAttributeBus1ANextView(LoginRequiredMixin, RedirectView): if not wei.exists(): raise Http404 wei = wei.get() - qs = WEIRegistration.objects.filter(wei=wei, membership__isnull=False, membership__bus__isnull=True) - qs = qs.filter(information_json__contains='selected_bus_pk') # not perfect, but works... - if qs.exists(): - return reverse_lazy('wei:wei_bus_1A', args=(qs.first().pk, )) - return reverse_lazy('wei:wei_1A_list', args=(wei.pk, )) + + # On cherche d'abord les 1A qui ont une inscription validée (membership) mais pas de bus + qs = WEIRegistration.objects.filter( + wei=wei, + first_year=True, + membership__isnull=False, + membership__bus__isnull=True + ) + + # Parmi eux, on prend ceux qui ont répondu au questionnaire (ont un bus préféré) + qs = qs.filter(information_json__contains='selected_bus_pk') + + if not qs.exists(): + # Si on ne trouve personne, on affiche un message et on retourne à la liste + messages.info(self.request, _("No first year student without a bus found. Either all of them have a bus, or none has filled the survey yet.")) + return reverse_lazy('wei:wei_1A_list', args=(wei.pk,)) + + # On redirige vers la page d'attribution pour le premier étudiant trouvé + return reverse_lazy('wei:wei_bus_1A', args=(qs.first().pk,)) + + +class BusInformationUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): + model = Bus + + def get_form_class(self): + return CurrentSurvey.get_algorithm_class().get_bus_information_form() + + def dispatch(self, request, *args, **kwargs): + wei = self.get_object().wei + today = date.today() + # We can't update a bus once the WEI is started + if today >= wei.date_start: + return redirect(reverse_lazy('wei:wei_closed', args=(wei.pk,))) + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["club"] = self.object.wei + context["information"] = CurrentSurvey.get_algorithm_class().get_bus_information(self.object) + self.object.save() + return context + + def get_success_url(self): + self.object.refresh_from_db() + return reverse_lazy("wei:manage_bus", kwargs={"pk": self.object.pk}) 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. diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 055b0093..f4698e23 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: 2024-08-17 11:57+0200\n" +"POT-Creation-Date: 2025-06-02 00:58+0200\n" "PO-Revision-Date: 2020-11-16 20:02+0000\n" "Last-Translator: bleizi \n" "Language-Team: German \n" @@ -18,51 +18,57 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.3.2\n" +#: apps/activity/api/serializers.py:77 +#, fuzzy +#| msgid "This credit is already validated." +msgid "This opener already exists" +msgstr "Dieser Kredit ist bereits validiert." + #: apps/activity/apps.py:10 apps/activity/models.py:129 -#: apps/activity/models.py:169 +#: apps/activity/models.py:169 apps/activity/models.py:329 msgid "activity" msgstr "Veranstaltung" -#: apps/activity/forms.py:34 +#: apps/activity/forms.py:35 msgid "The note of this club is inactive." msgstr "" -#: apps/activity/forms.py:41 apps/activity/models.py:142 +#: apps/activity/forms.py:42 apps/activity/models.py:142 msgid "The end date must be after the start date." msgstr "Das Abschlussdatum muss nach das Anfangsdatum sein." -#: apps/activity/forms.py:82 apps/activity/models.py:271 +#: apps/activity/forms.py:83 apps/activity/models.py:277 msgid "You can't invite someone once the activity is started." msgstr "" "Sie dürfen nicht jemandem einladen wenn die Veranstaltung angefangen hat." -#: apps/activity/forms.py:85 apps/activity/models.py:274 +#: apps/activity/forms.py:86 apps/activity/models.py:280 msgid "This activity is not validated yet." msgstr "Diese Veranstaltung ist noch nicht bestätigt." -#: apps/activity/forms.py:95 apps/activity/models.py:282 +#: apps/activity/forms.py:96 apps/activity/models.py:288 msgid "This person has been already invited 5 times this year." msgstr "Diese Person wurde schon 5 mal dieses Jahr eingeladen." -#: apps/activity/forms.py:99 apps/activity/models.py:286 +#: apps/activity/forms.py:100 apps/activity/models.py:292 msgid "This person is already invited." msgstr "Diese Person wurde schon eingeladen." -#: apps/activity/forms.py:103 apps/activity/models.py:290 +#: apps/activity/forms.py:104 apps/activity/models.py:296 msgid "You can't invite more than 3 people to this activity." msgstr "Sie dürfen höchstens 3 Leute zu dieser Veranstaltung einladen." -#: apps/activity/models.py:28 apps/activity/models.py:63 apps/food/models.py:42 -#: apps/food/models.py:56 apps/member/models.py:203 +#: apps/activity/models.py:28 apps/activity/models.py:63 apps/food/models.py:18 +#: apps/food/models.py:35 apps/member/models.py:203 #: apps/member/templates/member/includes/club_info.html:4 #: apps/member/templates/member/includes/profile_info.html:4 #: apps/note/models/notes.py:263 apps/note/models/transactions.py:26 #: 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:67 apps/wei/models.py:131 apps/wei/tables.py:282 +#: apps/wei/models.py:72 apps/wei/models.py:145 apps/wei/tables.py:282 #: apps/wei/templates/wei/base.html:26 -#: apps/wei/templates/wei/weimembership_form.html:14 +#: apps/wei/templates/wei/weimembership_form.html:14 apps/wrapped/models.py:16 msgid "name" msgstr "Name" @@ -95,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:78 apps/wei/models.py:142 +#: apps/permission/models.py:188 apps/wei/models.py:92 apps/wei/models.py:156 msgid "description" msgstr "Beschreibung" @@ -114,9 +120,9 @@ msgstr "Wo findet die Veranstaltung statt ? (z.B Kfet)." msgid "type" msgstr "Type" -#: apps/activity/models.py:91 apps/logs/models.py:22 apps/member/models.py:318 -#: apps/note/models/notes.py:148 apps/treasury/models.py:293 -#: apps/wei/models.py:171 apps/wei/templates/wei/attribute_bus_1A.html:13 +#: apps/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/templates/wei/survey.html:15 msgid "user" msgstr "User" @@ -171,7 +177,7 @@ msgid "entry time" msgstr "Eintrittzeit" #: apps/activity/models.py:180 apps/note/apps.py:14 -#: apps/note/models/notes.py:77 +#: apps/note/models/notes.py:77 apps/wrapped/models.py:60 msgid "note" msgstr "Note" @@ -199,21 +205,21 @@ msgstr "Eintritt von {note} zur Veranstaltung {activity}" msgid "Already entered on " msgstr "Schon eingetretten " -#: apps/activity/models.py:204 apps/activity/tables.py:56 +#: apps/activity/models.py:205 apps/activity/tables.py:58 msgid "{:%Y-%m-%d %H:%M:%S}" msgstr "{:%Y-%m-%d %H:%M:%S}" -#: apps/activity/models.py:212 +#: apps/activity/models.py:213 msgid "The balance is negative." msgstr "Kontostand ist im Rot." -#: apps/activity/models.py:242 +#: apps/activity/models.py:243 #: apps/treasury/templates/treasury/sogecredit_detail.html:14 #: apps/wei/templates/wei/attribute_bus_1A.html:16 msgid "last name" msgstr "Nachname" -#: apps/activity/models.py:247 +#: apps/activity/models.py:248 #: apps/member/templates/member/includes/profile_info.html:4 #: apps/registration/templates/registration/future_profile_detail.html:16 #: apps/treasury/templates/treasury/sogecredit_detail.html:17 @@ -222,79 +228,144 @@ msgstr "Nachname" msgid "first name" msgstr "Vorname" -#: apps/activity/models.py:254 +#: apps/activity/models.py:253 +msgid "school" +msgstr "" + +#: apps/activity/models.py:260 msgid "inviter" msgstr "Einlader" -#: apps/activity/models.py:258 +#: apps/activity/models.py:264 msgid "guest" msgstr "Gast" -#: apps/activity/models.py:259 +#: apps/activity/models.py:265 msgid "guests" msgstr "Gäste" -#: apps/activity/models.py:312 +#: apps/activity/models.py:318 msgid "Invitation" msgstr "Einladung" -#: apps/activity/tables.py:27 +#: apps/activity/models.py:336 apps/activity/models.py:340 +#, fuzzy +#| msgid "opened" +msgid "Opener" +msgstr "geöffnet" + +#: apps/activity/models.py:341 +#: apps/activity/templates/activity/activity_detail.html:16 +#, fuzzy +#| msgid "opened" +msgid "Openers" +msgstr "geöffnet" + +#: apps/activity/models.py:345 +#, fuzzy, python-brace-format +#| msgid "Entry for {note} to the activity {activity}" +msgid "{opener} is opener of activity {acivity}" +msgstr "Eintritt von {note} zur Veranstaltung {activity}" + +#: apps/activity/tables.py:29 msgid "The activity is currently open." msgstr "Die Veranstaltung ist geöffnet." -#: apps/activity/tables.py:28 +#: apps/activity/tables.py:30 msgid "The validation of the activity is pending." msgstr "Diese Veranstaltung ist noch nicht bestätigt." -#: apps/activity/tables.py:43 +#: apps/activity/tables.py:45 #: apps/member/templates/member/picture_update.html:18 -#: apps/treasury/tables.py:107 +#: apps/treasury/tables.py:110 msgid "Remove" msgstr "Entfernen" -#: apps/activity/tables.py:56 +#: apps/activity/tables.py:58 msgid "Entered on " msgstr "Eingetreten um " -#: apps/activity/tables.py:58 +#: apps/activity/tables.py:60 msgid "remove" msgstr "entfernen" -#: apps/activity/tables.py:82 apps/note/forms.py:68 apps/treasury/models.py:208 +#: apps/activity/tables.py:84 apps/note/forms.py:69 apps/treasury/models.py:209 msgid "Type" msgstr "Type" -#: apps/activity/tables.py:84 apps/member/forms.py:196 +#: apps/activity/tables.py:86 apps/member/forms.py:199 #: apps/registration/forms.py:91 apps/treasury/forms.py:131 -#: apps/wei/forms/registration.py:104 +#: apps/wei/forms/registration.py:116 msgid "Last name" msgstr "Nachname" -#: apps/activity/tables.py:86 apps/member/forms.py:201 +#: apps/activity/tables.py:88 apps/member/forms.py:204 #: apps/note/templates/note/transaction_form.html:138 #: apps/registration/forms.py:96 apps/treasury/forms.py:133 -#: apps/wei/forms/registration.py:109 +#: apps/wei/forms/registration.py:121 msgid "First name" msgstr "Vorname" -#: apps/activity/tables.py:88 apps/note/models/notes.py:86 +#: apps/activity/tables.py:90 apps/note/models/notes.py:86 msgid "Note" msgstr "Note" -#: apps/activity/tables.py:90 apps/member/tables.py:50 +#: apps/activity/tables.py:92 apps/member/tables.py:50 msgid "Balance" msgstr "Kontostand" -#: apps/activity/templates/activity/activity_detail.html:15 +#: apps/activity/tables.py:141 apps/activity/tables.py:148 +#: apps/note/tables.py:166 apps/note/tables.py:173 apps/note/tables.py:234 +#: apps/note/tables.py:281 apps/treasury/tables.py:39 +#: apps/treasury/templates/treasury/invoice_confirm_delete.html:30 +#: apps/treasury/templates/treasury/sogecredit_detail.html:65 +#: apps/wei/tables.py:75 apps/wei/tables.py:118 +#: apps/wei/templates/wei/weiregistration_confirm_delete.html:31 +#: 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 +msgid "Delete" +msgstr "Löschen" + +#: apps/activity/templates/activity/activity_detail.html:24 +#: apps/member/templates/member/club_alias.html:20 +#: apps/member/templates/member/profile_alias.html:19 +#: apps/member/templates/member/profile_trust.html:19 +#: apps/treasury/tables.py:101 +#: apps/treasury/templates/treasury/sogecredit_list.html:34 +#: apps/treasury/templates/treasury/sogecredit_list.html:73 +msgid "Add" +msgstr "Neue" + +#: apps/activity/templates/activity/activity_detail.html:35 msgid "Guests list" msgstr "Gastliste" -#: apps/activity/templates/activity/activity_detail.html:33 +#: apps/activity/templates/activity/activity_detail.html:55 #, fuzzy #| msgid "Guests list" msgid "Guest deleted" msgstr "Gastliste" +#: apps/activity/templates/activity/activity_detail.html:99 +#, 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 activity?" +msgstr "" +"Möchten Sie diese Rechnung wirklich löschen? Diese Aktion kann nicht " +"rückgängig gemacht werden." + +#: apps/activity/templates/activity/activity_detail.html:110 +#, fuzzy +#| msgid "Activity detail" +msgid "Activity deleted" +msgstr "Veranstaltunginfo" + #: apps/activity/templates/activity/activity_entry.html:14 #: apps/note/models/transactions.py:261 #: apps/note/templates/note/transaction_form.html:17 @@ -336,17 +407,17 @@ msgid "Entry done!" msgstr "Eintrittseite" #: apps/activity/templates/activity/activity_form.html:16 -#: apps/food/templates/food/add_ingredient_form.html:16 -#: apps/food/templates/food/basicfood_form.html:16 -#: apps/food/templates/food/create_qrcode_form.html:19 -#: apps/food/templates/food/transformedfood_form.html:16 +#: apps/food/templates/food/food_update.html:17 +#: apps/food/templates/food/manage_ingredients.html:48 +#: apps/food/templates/food/qrcode.html:18 +#: apps/food/templates/food/transformedfood_update.html:45 #: apps/member/templates/member/add_members.html:46 #: apps/member/templates/member/club_form.html:16 #: apps/note/templates/note/transactiontemplate_form.html:18 #: apps/treasury/forms.py:89 apps/treasury/forms.py:143 #: apps/treasury/templates/treasury/invoice_form.html:74 #: apps/wei/templates/wei/bus_form.html:17 -#: apps/wei/templates/wei/busteam_form.html:17 +#: apps/wei/templates/wei/busteam_form.html:18 #: apps/wei/templates/wei/weiclub_form.html:17 #: apps/wei/templates/wei/weiregistration_form.html:18 msgid "Submit" @@ -402,42 +473,62 @@ msgid "edit" msgstr "bearbeiten" #: apps/activity/templates/activity/includes/activity_info.html:74 +#: apps/logs/models.py:65 apps/note/tables.py:230 apps/note/tables.py:279 +#: apps/permission/models.py:126 apps/treasury/tables.py:38 +#: apps/wei/tables.py:74 +msgid "delete" +msgstr "entfernen" + +#: apps/activity/templates/activity/includes/activity_info.html:77 msgid "Invite" msgstr "Einladen" -#: apps/activity/views.py:37 +#: apps/activity/views.py:38 msgid "Create new activity" msgstr "Neue Veranstaltung schaffen" -#: apps/activity/views.py:67 note_kfet/templates/base.html:96 +#: apps/activity/views.py:71 note_kfet/templates/base.html:96 msgid "Activities" msgstr "Veranstaltungen" -#: apps/activity/views.py:108 +#: apps/activity/views.py:105 msgid "Activity detail" msgstr "Veranstaltunginfo" -#: apps/activity/views.py:128 +#: apps/activity/views.py:150 msgid "Update activity" msgstr "Veranstaltung bearbeiten" -#: apps/activity/views.py:155 +#: apps/activity/views.py:177 +#, fuzzy +#| msgid "" +#| "You are not allowed to display the entry interface for this activity." +msgid "You are not allowed to delete this activity." +msgstr "Sie haben nicht das Recht diese Seite zu benuzten." + +#: apps/activity/views.py:180 +#, fuzzy +#| msgid "This activity is closed." +msgid "This activity is valid." +msgstr "Diese Veranstaltung ist geschlossen." + +#: apps/activity/views.py:206 msgid "Invite guest to the activity \"{}\"" msgstr "Gast zur Veranstaltung \"{}\" einladen" -#: apps/activity/views.py:193 +#: apps/activity/views.py:246 msgid "You are not allowed to display the entry interface for this activity." msgstr "Sie haben nicht das Recht diese Seite zu benuzten." -#: apps/activity/views.py:196 +#: apps/activity/views.py:249 msgid "This activity does not support activity entries." msgstr "Diese Veranstaltung braucht nicht Eintritt." -#: apps/activity/views.py:199 +#: apps/activity/views.py:252 msgid "This activity is closed." msgstr "Diese Veranstaltung ist geschlossen." -#: apps/activity/views.py:295 +#: apps/activity/views.py:357 msgid "Entry for activity \"{}\"" msgstr "Eintritt zur Veranstaltung \"{}\"" @@ -445,297 +536,365 @@ msgstr "Eintritt zur Veranstaltung \"{}\"" msgid "API" msgstr "API" -#: apps/food/apps.py:11 apps/food/models.py:105 +#: apps/food/apps.py:11 msgid "food" msgstr "" -#: apps/food/forms.py:32 -msgid "Fully used" -msgstr "" - -#: apps/food/forms.py:50 +#: apps/food/forms.py:49 msgid "Pasta METRO 5kg" msgstr "" -#: apps/food/forms.py:96 +#: apps/food/forms.py:53 apps/food/forms.py:81 +msgid "Specific order given to GCKs" +msgstr "" + +#: apps/food/forms.py:77 msgid "Lasagna" msgstr "" -#: apps/food/models.py:18 +#: apps/food/forms.py:116 +msgid "Shelf life (in hours)" +msgstr "" + +#: apps/food/forms.py:138 apps/food/forms.py:162 +#: apps/food/templates/food/transformedfood_update.html:25 +msgid "Fully used" +msgstr "" + +#: apps/food/forms.py:171 apps/food/templates/food/qrcode.html:29 +#: apps/food/templates/food/transformedfood_update.html:23 +#: apps/note/templates/note/transaction_form.html:132 +#: apps/treasury/models.py:61 +msgid "Name" +msgstr "Name" + +#: apps/food/forms.py:181 #, fuzzy #| msgid "phone number" -msgid "QR-code number" +msgid "QR code number" msgstr "Telefonnummer" -#: apps/food/models.py:26 -msgid "food container" -msgstr "" - -#: apps/food/models.py:30 -msgid "QR-code" -msgstr "" - -#: apps/food/models.py:31 -msgid "QR-codes" -msgstr "" - -#: apps/food/models.py:34 -#, python-brace-format -msgid "QR-code number {qr_code_number}" -msgstr "" - -#: apps/food/models.py:47 +#: apps/food/models.py:23 msgid "Allergen" msgstr "" -#: apps/food/models.py:48 apps/food/templates/food/basicfood_detail.html:17 -#: apps/food/templates/food/transformedfood_detail.html:20 +#: apps/food/models.py:24 msgid "Allergens" msgstr "" -#: apps/food/models.py:64 +#: apps/food/models.py:43 msgid "owner" msgstr "" -#: apps/food/models.py:70 -msgid "allergen" +#: apps/food/models.py:49 +msgid "allergens" msgstr "" -#: apps/food/models.py:74 +#: apps/food/models.py:53 #, fuzzy #| msgid "birth date" msgid "expiry date" msgstr "Geburtsdatum" -#: apps/food/models.py:80 -msgid "was eaten" +#: apps/food/models.py:59 +msgid "end of life" msgstr "" -#: apps/food/models.py:89 +#: apps/food/models.py:64 msgid "is ready" msgstr "" -#: apps/food/models.py:94 -#, fuzzy -#| msgid "active" -msgid "is active" -msgstr "Aktiv" - -#: apps/food/models.py:106 -msgid "foods" +#: apps/food/models.py:70 +msgid "order" msgstr "" -#: apps/food/models.py:122 +#: apps/food/models.py:107 apps/food/views.py:34 +#: note_kfet/templates/base.html:72 +msgid "Food" +msgstr "" + +#: apps/food/models.py:108 +msgid "Foods" +msgstr "" + +#: apps/food/models.py:117 #, fuzzy #| msgid "start date" msgid "arrival date" msgstr "Anfangsdatum" -#: apps/food/models.py:152 +#: apps/food/models.py:169 msgid "Basic food" msgstr "" -#: apps/food/models.py:153 +#: apps/food/models.py:170 msgid "Basic foods" msgstr "" -#: apps/food/models.py:161 +#: apps/food/models.py:182 #, fuzzy #| msgid "created at" msgid "creation date" msgstr "erschafft am" -#: apps/food/models.py:169 -msgid "transformed ingredient" -msgstr "" - -#: apps/food/models.py:174 +#: apps/food/models.py:188 msgid "shelf life" msgstr "" -#: apps/food/models.py:225 apps/food/views.py:365 +#: apps/food/models.py:196 +msgid "transformed ingredient" +msgstr "" + +#: apps/food/models.py:258 #, fuzzy #| msgid "Transfer money" msgid "Transformed food" msgstr "Geld überweisen" -#: apps/food/models.py:226 +#: apps/food/models.py:259 msgid "Transformed foods" msgstr "" -#: apps/food/templates/food/basicfood_detail.html:14 -#: apps/food/templates/food/qrcode_detail.html:15 -#: apps/food/templates/food/transformedfood_detail.html:14 +#: apps/food/models.py:271 #, fuzzy -#| msgid "Owned" -msgid "Owner" -msgstr "Besetzt" +#| msgid "phone number" +msgid "qr code number" +msgstr "Telefonnummer" -#: apps/food/templates/food/basicfood_detail.html:15 -#, fuzzy -#| msgid "start date" -msgid "Arrival date" -msgstr "Anfangsdatum" - -#: apps/food/templates/food/basicfood_detail.html:16 -#: apps/food/templates/food/qrcode_detail.html:16 -#: apps/food/templates/food/transformedfood_detail.html:19 -#, fuzzy -#| msgid "birth date" -msgid "Expiry date" -msgstr "Geburtsdatum" - -#: apps/food/templates/food/basicfood_detail.html:24 -#: apps/food/templates/food/transformedfood_detail.html:36 -#, fuzzy -#| msgid "active" -msgid "Active" -msgstr "Aktiv" - -#: apps/food/templates/food/basicfood_detail.html:25 -#: apps/food/templates/food/transformedfood_detail.html:37 -msgid "Eaten" +#: apps/food/models.py:278 +msgid "food container" msgstr "" -#: apps/food/templates/food/basicfood_detail.html:28 -#: apps/food/templates/food/qrcode_detail.html:20 -#: apps/food/templates/food/qrcode_detail.html:24 -#: apps/food/templates/food/transformedfood_detail.html:41 +#: apps/food/models.py:282 +msgid "QR-code" +msgstr "" + +#: apps/food/models.py:283 +msgid "QR-codes" +msgstr "" + +#: apps/food/models.py:286 +#: apps/food/templates/food/transformedfood_update.html:24 +#, fuzzy +#| msgid "phone number" +msgid "QR-code number" +msgstr "Telefonnummer" + +#: apps/food/templates/food/food_detail.html:19 +msgid "Contained in" +msgstr "" + +#: apps/food/templates/food/food_detail.html:26 +msgid "Contain" +msgstr "" + +#: apps/food/templates/food/food_detail.html:35 #, fuzzy #| msgid "Update bus" msgid "Update" msgstr "Bus bearbeiten" -#: apps/food/templates/food/basicfood_detail.html:32 -#: apps/food/templates/food/qrcode_detail.html:34 -#: apps/food/templates/food/transformedfood_detail.html:46 +#: apps/food/templates/food/food_detail.html:40 #, fuzzy #| msgid "Add team" msgid "Add to a meal" msgstr "Neue Team" -#: apps/food/templates/food/create_qrcode_form.html:14 +#: apps/food/templates/food/food_detail.html:45 #, fuzzy -#| msgid "Transfer money" -msgid "New basic food" -msgstr "Geld überweisen" +#| msgid "manage entries" +msgid "Manage ingredients" +msgstr "Einträge verwalten" -#: apps/food/templates/food/qrcode_detail.html:10 +#: apps/food/templates/food/food_detail.html:49 #, fuzzy -#| msgid "phone number" -msgid "number" -msgstr "Telefonnummer" +#| msgid "Return to credit list" +msgid "Return to the food list" +msgstr "Zurück zur Kreditlist" -#: apps/food/templates/food/qrcode_detail.html:14 -#: apps/note/templates/note/transaction_form.html:132 -#: apps/treasury/models.py:60 -msgid "Name" -msgstr "Name" - -#: apps/food/templates/food/qrcode_detail.html:29 -#, fuzzy -#| msgid "Profile detail" -msgid "View details" -msgstr "Profile detail" - -#: apps/food/templates/food/transformedfood_detail.html:16 -#: apps/food/templates/food/transformedfood_detail.html:35 -msgid "Ready" -msgstr "" - -#: apps/food/templates/food/transformedfood_detail.html:18 -#, fuzzy -#| msgid "created at" -msgid "Creation date" -msgstr "erschafft am" - -#: apps/food/templates/food/transformedfood_detail.html:27 -msgid "Ingredients" -msgstr "" - -#: apps/food/templates/food/transformedfood_detail.html:34 -msgid "Shelf life" -msgstr "" - -#: apps/food/templates/food/transformedfood_list.html:11 +#: apps/food/templates/food/food_list.html:14 msgid "Meal served" msgstr "" -#: apps/food/templates/food/transformedfood_list.html:16 +#: apps/food/templates/food/food_list.html:19 #, fuzzy #| msgid "New user" msgid "New meal" msgstr "Neue User" -#: apps/food/templates/food/transformedfood_list.html:25 +#: apps/food/templates/food/food_list.html:28 #, fuzzy #| msgid "There is no results." msgid "There is no meal served." msgstr "Es gibt keine Ergebnisse." -#: apps/food/templates/food/transformedfood_list.html:33 -msgid "Open" +#: apps/food/templates/food/food_list.html:35 +msgid "Free food" msgstr "" -#: apps/food/templates/food/transformedfood_list.html:40 +#: apps/food/templates/food/food_list.html:42 #, fuzzy #| msgid "There is no results." -msgid "There is no free meal." +msgid "There is no free food." msgstr "Es gibt keine Ergebnisse." -#: apps/food/templates/food/transformedfood_list.html:48 -msgid "All meals" +#: apps/food/templates/food/food_list.html:50 +#, fuzzy +#| msgid "for club" +msgid "Food of your clubs" +msgstr "Für Club" + +#: apps/food/templates/food/food_list.html:56 +#, fuzzy +#| msgid "for club" +msgid "Food of club" +msgstr "Für Club" + +#: apps/food/templates/food/food_list.html:63 +msgid "Yours club has not food yet." msgstr "" -#: apps/food/templates/food/transformedfood_list.html:55 -#, fuzzy -#| msgid "There is no results." -msgid "There is no meal." -msgstr "Es gibt keine Ergebnisse." - -#: apps/food/views.py:28 -msgid "Add the ingredient" +#: apps/food/templates/food/manage_ingredients.html:45 +#: apps/food/templates/food/transformedfood_update.html:42 +msgid "Add ingredient" msgstr "" -#: apps/food/views.py:42 +#: apps/food/templates/food/manage_ingredients.html:46 +#: apps/food/templates/food/transformedfood_update.html:43 #, fuzzy -#| msgid "This credit is already validated." -msgid "The product is already prepared" -msgstr "Dieser Kredit ist bereits validiert." +#| msgid "Remove product" +msgid "Remove ingredient" +msgstr "Produkt entfernen" -#: apps/food/views.py:70 +#: apps/food/templates/food/qrcode.html:22 +msgid "Copy constructor" +msgstr "" + +#: apps/food/templates/food/qrcode.html:23 +#, fuzzy +#| msgid "Transfer money" +msgid "New food" +msgstr "Geld überweisen" + +#: apps/food/templates/food/qrcode.html:32 +#, fuzzy +#| msgid "Owned" +msgid "Owner" +msgstr "Besetzt" + +#: apps/food/templates/food/qrcode.html:35 +#, fuzzy +#| msgid "birth date" +msgid "Expiry date" +msgstr "Geburtsdatum" + +#: apps/food/utils.py:6 +msgid "second" +msgstr "" + +#: apps/food/utils.py:6 +msgid "seconds" +msgstr "" + +#: apps/food/utils.py:7 +msgid "minute" +msgstr "" + +#: apps/food/utils.py:7 +msgid "minutes" +msgstr "" + +#: apps/food/utils.py:8 +msgid "hour" +msgstr "" + +#: apps/food/utils.py:8 +msgid "hours" +msgstr "" + +#: apps/food/utils.py:9 +#, fuzzy +#| msgid "days" +msgid "day" +msgstr "Tagen" + +#: apps/food/utils.py:9 apps/member/templates/member/includes/club_info.html:27 +msgid "days" +msgstr "Tagen" + +#: apps/food/utils.py:10 +msgid "week" +msgstr "" + +#: apps/food/utils.py:10 +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" +msgstr "hinzufügen" + +#: apps/food/views.py:118 +msgid "Add a new QRCode" +msgstr "" + +#: apps/food/views.py:167 +#, fuzzy +#| msgid "Update an invoice" +msgid "Add an aliment" +msgstr "Rechnung bearbeiten" + +#: apps/food/views.py:235 +#, fuzzy +#| msgid "Add team" +msgid "Add a meal" +msgstr "Neue Team" + +#: apps/food/views.py:275 +#, fuzzy +#| msgid "manage entries" +msgid "Manage ingredients of:" +msgstr "Einträge verwalten" + +#: apps/food/views.py:289 apps/food/views.py:297 +#, python-brace-format +msgid "Fully used in {meal}" +msgstr "" + +#: apps/food/views.py:344 +msgid "Add the ingredient:" +msgstr "" + +#: apps/food/views.py:370 +#, python-brace-format +msgid "Food fully used in : {meal.name}" +msgstr "" + +#: apps/food/views.py:389 #, fuzzy #| msgid "Update an invoice" msgid "Update an aliment" msgstr "Rechnung bearbeiten" -#: apps/food/views.py:97 +#: apps/food/views.py:437 #, fuzzy #| msgid "WEI Detail" msgid "Details of:" msgstr "WEI Infos" -#: apps/food/views.py:121 -msgid "Add a new basic food with QRCode" -msgstr "" +#: 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:185 -msgid "Add a new QRCode" -msgstr "" - -#: apps/food/views.py:235 -msgid "QRCode" -msgstr "" - -#: apps/food/views.py:271 -msgid "Add a new meal" -msgstr "" - -#: apps/food/views.py:337 -#, fuzzy -#| msgid "Update team" -msgid "Update a meal" -msgstr "Team bearbeiten" +#: 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" #: apps/logs/apps.py:11 msgid "Logs" @@ -765,12 +924,6 @@ msgstr "neue Daten" msgid "create" msgstr "schaffen" -#: apps/logs/models.py:65 apps/note/tables.py:230 apps/note/tables.py:277 -#: apps/permission/models.py:126 apps/treasury/tables.py:38 -#: apps/wei/tables.py:74 -msgid "delete" -msgstr "entfernen" - #: apps/logs/models.py:68 msgid "action" msgstr "Aktion" @@ -806,11 +959,11 @@ msgstr "Mitgliedschaftpreis (bezahlte Studenten)" msgid "membership fee (unpaid students)" msgstr "Mitgliedschaftpreis (unbezahlte Studenten)" -#: apps/member/admin.py:65 apps/member/models.py:330 +#: apps/member/admin.py:65 apps/member/models.py:337 msgid "roles" msgstr "Rollen" -#: apps/member/admin.py:66 apps/member/models.py:344 +#: apps/member/admin.py:66 apps/member/models.py:351 msgid "fee" msgstr "Preis" @@ -818,26 +971,26 @@ msgstr "Preis" msgid "member" msgstr "Mitglied" -#: apps/member/forms.py:24 +#: apps/member/forms.py:25 msgid "Permission mask" msgstr "Berechtigungsmaske" -#: apps/member/forms.py:46 +#: apps/member/forms.py:48 msgid "Report frequency" msgstr "Bericht Frequenz" -#: apps/member/forms.py:48 +#: apps/member/forms.py:50 msgid "Last report date" msgstr "Letzen Bericht Datum" -#: apps/member/forms.py:52 +#: apps/member/forms.py:54 msgid "" "Anti-VSS (Violences Sexistes et Sexuelles) charter read and approved" msgstr "" "Anti-VSS (Violences Sexistes et Sexuelles) Charta gelesen und " "angenommen" -#: apps/member/forms.py:53 +#: apps/member/forms.py:55 msgid "" "Tick after having read and accepted the anti-VSS charter " @@ -847,65 +1000,65 @@ msgstr "" "haben, die hier als pdf-Datei verfügbar ist" -#: apps/member/forms.py:60 +#: apps/member/forms.py:62 msgid "You can't register to the note if you come from the future." msgstr "Sie dürfen nicht einloggen wenn sie aus der Zukunft kommen." -#: apps/member/forms.py:86 +#: apps/member/forms.py:89 msgid "select an image" msgstr "Wählen sie ein Bild aus" -#: apps/member/forms.py:87 +#: apps/member/forms.py:90 msgid "Maximal size: 2MB" msgstr "Maximal Größe: 2MB" -#: apps/member/forms.py:112 +#: apps/member/forms.py:115 msgid "This image cannot be loaded." msgstr "Dieses Bild kann nicht geladen werden." -#: apps/member/forms.py:151 apps/member/views.py:102 -#: apps/registration/forms.py:33 apps/registration/views.py:276 +#: apps/member/forms.py:154 apps/member/views.py:117 +#: apps/registration/forms.py:33 apps/registration/views.py:282 msgid "An alias with a similar name already exists." msgstr "Ein ähnliches Alias ist schon benutzt." -#: apps/member/forms.py:175 +#: apps/member/forms.py:178 msgid "Inscription paid by Société Générale" msgstr "Mitgliedschaft von der Société Générale bezahlt" -#: apps/member/forms.py:177 +#: apps/member/forms.py:180 msgid "Check this case if the Société Générale paid the inscription." msgstr "Die Société Générale die Mitgliedschaft bezahlt." -#: apps/member/forms.py:182 apps/registration/forms.py:78 -#: apps/wei/forms/registration.py:91 +#: apps/member/forms.py:185 apps/registration/forms.py:78 +#: apps/wei/forms/registration.py:103 msgid "Credit type" msgstr "Kredittype" -#: apps/member/forms.py:183 apps/registration/forms.py:79 -#: apps/wei/forms/registration.py:92 +#: apps/member/forms.py:186 apps/registration/forms.py:79 +#: apps/wei/forms/registration.py:104 msgid "No credit" msgstr "Kein Kredit" -#: apps/member/forms.py:185 +#: apps/member/forms.py:188 msgid "You can credit the note of the user." msgstr "Sie dûrfen diese Note kreditieren." -#: apps/member/forms.py:189 apps/registration/forms.py:84 -#: apps/wei/forms/registration.py:97 +#: apps/member/forms.py:192 apps/registration/forms.py:84 +#: apps/wei/forms/registration.py:109 msgid "Credit amount" msgstr "Kreditanzahl" -#: apps/member/forms.py:206 apps/note/templates/note/transaction_form.html:144 +#: apps/member/forms.py:209 apps/note/templates/note/transaction_form.html:144 #: apps/registration/forms.py:101 apps/treasury/forms.py:135 -#: apps/wei/forms/registration.py:114 +#: apps/wei/forms/registration.py:126 msgid "Bank" msgstr "Bank" -#: apps/member/forms.py:233 +#: apps/member/forms.py:236 msgid "User" msgstr "User" -#: apps/member/forms.py:247 +#: apps/member/forms.py:250 msgid "Roles" msgstr "Rollen" @@ -1040,10 +1193,6 @@ msgstr "bezahlt" msgid "Tells if the user receive a salary." msgstr "User ist bezahlt." -#: apps/member/models.py:99 apps/treasury/tables.py:143 -msgid "No" -msgstr "Nein" - #: apps/member/models.py:100 msgid "Yes (receive them in french)" msgstr "Ja (auf Fränzosich)" @@ -1108,7 +1257,7 @@ msgstr "Ihre Note Kfet Konto bestätigen" #: apps/member/templates/member/includes/club_info.html:55 #: apps/member/templates/member/includes/profile_info.html:40 #: apps/registration/templates/registration/future_profile_detail.html:22 -#: apps/wei/templates/wei/base.html:70 +#: apps/wei/templates/wei/base.html:68 #: apps/wei/templates/wei/weimembership_form.html:20 msgid "email" msgstr "Email" @@ -1161,8 +1310,8 @@ msgstr "" msgid "add to registration form" msgstr "Registrierung validieren" -#: apps/member/models.py:268 apps/member/models.py:324 -#: apps/note/models/notes.py:176 +#: apps/member/models.py:268 apps/member/models.py:331 +#: apps/note/models/notes.py:176 apps/wei/models.py:86 msgid "club" msgstr "Club" @@ -1170,37 +1319,37 @@ msgstr "Club" msgid "clubs" msgstr "Clubs" -#: apps/member/models.py:335 +#: apps/member/models.py:342 msgid "membership starts on" msgstr "Mitgliedschaft fängt an" -#: apps/member/models.py:339 +#: apps/member/models.py:346 msgid "membership ends on" msgstr "Mitgliedschaft endet am" -#: apps/member/models.py:348 apps/note/models/transactions.py:385 +#: apps/member/models.py:355 apps/note/models/transactions.py:385 msgid "membership" msgstr "Mitgliedschaft" -#: apps/member/models.py:349 +#: apps/member/models.py:356 msgid "memberships" msgstr "Mitgliedschaften" -#: apps/member/models.py:353 +#: apps/member/models.py:360 #, python-brace-format msgid "Membership of {user} for the club {club}" msgstr "Mitgliedschaft von {user} für das Club {club}" -#: apps/member/models.py:372 +#: apps/member/models.py:379 #, python-brace-format msgid "The role {role} does not apply to the club {club}." msgstr "Die Rolle {role} ist nicht erlaubt für das Club {club}." -#: apps/member/models.py:381 apps/member/views.py:715 +#: apps/member/models.py:388 apps/member/views.py:759 msgid "User is already a member of the club" msgstr "User ist schon ein Mitglied dieser club" -#: apps/member/models.py:393 apps/member/views.py:724 +#: apps/member/models.py:400 apps/member/views.py:768 msgid "User is not a member of the parent club" msgstr "User ist noch nicht Mitglied des Urclubs" @@ -1255,7 +1404,7 @@ msgid "Account #" msgstr "Konto #" #: apps/member/templates/member/base.html:48 -#: apps/member/templates/member/base.html:62 apps/member/views.py:59 +#: apps/member/templates/member/base.html:62 apps/member/views.py:61 #: apps/registration/templates/registration/future_profile_detail.html:48 #: apps/wei/templates/wei/weimembership_form.html:117 msgid "Update Profile" @@ -1316,20 +1465,11 @@ msgstr "" "erlaubt." #: apps/member/templates/member/club_alias.html:10 -#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:287 -#: apps/member/views.py:520 +#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:318 +#: apps/member/views.py:559 msgid "Note aliases" msgstr "Note Aliases" -#: apps/member/templates/member/club_alias.html:20 -#: apps/member/templates/member/profile_alias.html:19 -#: apps/member/templates/member/profile_trust.html:19 -#: apps/treasury/tables.py:99 -#: apps/treasury/templates/treasury/sogecredit_list.html:34 -#: apps/treasury/templates/treasury/sogecredit_list.html:73 -msgid "Add" -msgstr "Neue" - #: apps/member/templates/member/club_detail.html:13 #: apps/permission/templates/permission/all_rights.html:32 msgid "Club managers" @@ -1366,10 +1506,6 @@ msgstr "Keine Mitgliedschaft mit diesem pattern gefunden." msgid "Club Parent" msgstr "Urclub" -#: apps/member/templates/member/includes/club_info.html:27 -msgid "days" -msgstr "Tagen" - #: apps/member/templates/member/includes/club_info.html:31 #: apps/wei/templates/wei/base.html:40 msgid "membership fee" @@ -1378,13 +1514,13 @@ msgstr "Mitgliedsachftpreis" #: apps/member/templates/member/includes/club_info.html:43 #: apps/member/templates/member/includes/profile_info.html:55 #: apps/treasury/templates/treasury/sogecredit_detail.html:24 -#: apps/wei/templates/wei/base.html:60 +#: apps/wei/templates/wei/base.html:58 msgid "balance" msgstr "Kontostand" #: apps/member/templates/member/includes/club_info.html:47 #: apps/member/templates/member/includes/profile_info.html:20 -#: apps/note/models/notes.py:287 apps/wei/templates/wei/base.html:66 +#: apps/note/models/notes.py:287 apps/wei/templates/wei/base.html:64 msgid "aliases" msgstr "Aliases" @@ -1473,11 +1609,11 @@ msgstr "" msgid "Show my applications" msgstr "" -#: apps/member/templates/member/picture_update.html:38 +#: apps/member/templates/member/picture_update.html:40 msgid "Nevermind" msgstr "Vergessen" -#: apps/member/templates/member/picture_update.html:39 +#: apps/member/templates/member/picture_update.html:41 msgid "Crop and upload" msgstr "Beschneiden und hochladen" @@ -1522,51 +1658,51 @@ msgstr "Speichern" msgid "Registrations" msgstr "Anmeldung" -#: apps/member/views.py:72 apps/registration/forms.py:23 +#: apps/member/views.py:74 apps/registration/forms.py:23 msgid "This address must be valid." msgstr "Diese Adresse muss gültig sein." -#: apps/member/views.py:139 +#: apps/member/views.py:154 msgid "Profile detail" msgstr "Profile detail" -#: apps/member/views.py:205 +#: apps/member/views.py:220 msgid "Search user" msgstr "User finden" -#: apps/member/views.py:253 +#: apps/member/views.py:272 msgid "Note friendships" msgstr "" -#: apps/member/views.py:308 +#: apps/member/views.py:342 msgid "Update note picture" msgstr "Notebild ändern" -#: apps/member/views.py:357 +#: apps/member/views.py:391 msgid "Manage auth token" msgstr "Auth token bearbeiten" -#: apps/member/views.py:384 +#: apps/member/views.py:418 msgid "Create new club" msgstr "Neue Club" -#: apps/member/views.py:403 +#: apps/member/views.py:437 msgid "Search club" msgstr "Club finden" -#: apps/member/views.py:436 +#: apps/member/views.py:475 msgid "Club detail" msgstr "Club Details" -#: apps/member/views.py:543 +#: apps/member/views.py:587 msgid "Update club" msgstr "Club bearbeiten" -#: apps/member/views.py:577 +#: apps/member/views.py:621 msgid "Add new member to the club" msgstr "Neue Mitglieder" -#: apps/member/views.py:706 apps/wei/views.py:973 +#: apps/member/views.py:750 msgid "" "This user don't have enough money to join this club, and can't have a " "negative balance." @@ -1574,19 +1710,19 @@ msgstr "" "Diese User hat nicht genug Geld um Mitglied zu werden, und darf nich im Rot " "sein." -#: apps/member/views.py:728 +#: apps/member/views.py:772 msgid "The membership must start after {:%m-%d-%Y}." msgstr "Die Mitgliedschaft muss nach {:%m-%d-Y} anfängen." -#: apps/member/views.py:733 +#: apps/member/views.py:777 msgid "The membership must begin before {:%m-%d-%Y}." msgstr "Die Mitgliedschaft muss vor {:%m-%d-Y} anfängen." -#: apps/member/views.py:883 +#: apps/member/views.py:927 msgid "Manage roles of an user in the club" msgstr "Rollen in diesen Club bearbeiten" -#: apps/member/views.py:908 +#: apps/member/views.py:952 msgid "Members of the club" msgstr "Mitlglieder dieses Club" @@ -1619,35 +1755,35 @@ msgstr "" "Diese Transaktion ist nicht möglich weil die Note des Sender oder des " "Empfänger inaktiv ist." -#: apps/note/forms.py:39 +#: apps/note/forms.py:40 msgid "Source" msgstr "Sender" -#: apps/note/forms.py:53 +#: apps/note/forms.py:54 msgid "Destination" msgstr "Empfänger" -#: apps/note/forms.py:74 apps/note/templates/note/transaction_form.html:123 +#: apps/note/forms.py:75 apps/note/templates/note/transaction_form.html:123 msgid "Reason" msgstr "Grund" -#: apps/note/forms.py:79 apps/treasury/tables.py:136 +#: apps/note/forms.py:80 apps/treasury/tables.py:141 msgid "Valid" msgstr "Gültig" -#: apps/note/forms.py:85 +#: apps/note/forms.py:86 msgid "Total amount greater than" msgstr "Totalanzahl größer als" -#: apps/note/forms.py:93 +#: apps/note/forms.py:94 msgid "Total amount less than" msgstr "Totalanzahl kleiner als" -#: apps/note/forms.py:99 +#: apps/note/forms.py:100 msgid "Created after" msgstr "Erschafft nacht" -#: apps/note/forms.py:106 +#: apps/note/forms.py:107 msgid "Created before" msgstr "Erschafft vor" @@ -1752,7 +1888,7 @@ msgstr "" #: apps/note/models/notes.py:243 #, fuzzy #| msgid "Manage aliases" -msgid "friendship" +msgid "frienship" msgstr "Aliases bearbeiten" #: apps/note/models/notes.py:248 @@ -1902,8 +2038,9 @@ 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:978 -#: apps/wei/views.py:982 +#: 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 msgid "This field is required." msgstr "Dies ist ein Pflichtfeld." @@ -1911,7 +2048,7 @@ msgstr "Dies ist ein Pflichtfeld." msgid "membership transaction" msgstr "Mitgliedschafttransaktion" -#: apps/note/models/transactions.py:381 apps/treasury/models.py:300 +#: apps/note/models/transactions.py:381 apps/treasury/models.py:301 msgid "membership transactions" msgstr "Mitgliedschaftttransaktionen" @@ -1927,18 +2064,6 @@ msgstr "Klicken Sie zum gültigmachen" msgid "No reason specified" msgstr "Kein Grund gegeben" -#: apps/note/tables.py:166 apps/note/tables.py:173 apps/note/tables.py:234 -#: apps/note/tables.py:279 apps/treasury/tables.py:39 -#: apps/treasury/templates/treasury/invoice_confirm_delete.html:30 -#: apps/treasury/templates/treasury/sogecredit_detail.html:65 -#: apps/wei/tables.py:75 apps/wei/tables.py:118 -#: apps/wei/templates/wei/weiregistration_confirm_delete.html:31 -#: note_kfet/templates/oauth2_provider/application_confirm_delete.html:18 -#: note_kfet/templates/oauth2_provider/application_detail.html:39 -#: note_kfet/templates/oauth2_provider/authorized-token-delete.html:12 -msgid "Delete" -msgstr "Löschen" - #: apps/note/tables.py:191 msgid "Trust back" msgstr "" @@ -1951,15 +2076,16 @@ msgstr "Neue Bus" #: apps/note/tables.py:262 apps/note/templates/note/conso_form.html:151 #: apps/wei/tables.py:49 apps/wei/tables.py:50 -#: apps/wei/templates/wei/base.html:89 -#: apps/wei/templates/wei/bus_detail.html:20 +#: apps/wei/templates/wei/base.html:87 +#: apps/wei/templates/wei/bus_detail.html:24 #: apps/wei/templates/wei/busteam_detail.html:20 -#: apps/wei/templates/wei/busteam_detail.html:40 +#: 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" -#: apps/note/tables.py:266 apps/note/tables.py:293 +#: apps/note/tables.py:267 apps/note/tables.py:296 msgid "Hide/Show" msgstr "" @@ -2045,8 +2171,8 @@ msgid "Action" msgstr "Aktion" #: apps/note/templates/note/transaction_form.html:116 -#: apps/treasury/forms.py:137 apps/treasury/tables.py:67 -#: apps/treasury/tables.py:132 +#: apps/treasury/forms.py:137 apps/treasury/tables.py:68 +#: apps/treasury/tables.py:136 #: apps/treasury/templates/treasury/remittance_form.html:23 msgid "Amount" msgstr "Anzahl" @@ -2112,34 +2238,35 @@ msgid "Button displayed" msgstr "Tastenliste" #: apps/note/templates/note/transactiontemplate_list.html:100 +#: apps/wrapped/templates/wrapped/wrapped_list.html:70 msgid "An error occured" msgstr "" -#: apps/note/views.py:36 +#: apps/note/views.py:37 msgid "Transfer money" msgstr "Geld überweisen" -#: apps/note/views.py:74 +#: apps/note/views.py:75 msgid "Create new button" msgstr "Neue Tatse berstellen" -#: apps/note/views.py:83 +#: apps/note/views.py:84 msgid "Search button" msgstr "Tatsen finden" -#: apps/note/views.py:111 +#: apps/note/views.py:116 msgid "Update button" msgstr "Tatse bearbeiten" -#: apps/note/views.py:151 note_kfet/templates/base.html:66 +#: apps/note/views.py:156 note_kfet/templates/base.html:66 msgid "Consumptions" msgstr "Verbräuche" -#: apps/note/views.py:165 +#: apps/note/views.py:170 msgid "You can't see any button." msgstr "Sie können keine Taste sehen." -#: apps/note/views.py:204 +#: apps/note/views.py:209 msgid "Search transactions" msgstr "Transaktion finden" @@ -2231,7 +2358,7 @@ msgstr "" "Sie haben nicht die Berechtigung, das Feld {field} in dieser Instanz von " "Modell {app_label} zu ändern. {model_name}" -#: apps/permission/signals.py:83 apps/permission/views.py:105 +#: apps/permission/signals.py:83 apps/permission/views.py:104 #, python-brace-format msgid "" "You don't have the permission to add an instance of model {app_label}." @@ -2294,21 +2421,24 @@ 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 "" -#: apps/permission/views.py:72 +#: apps/permission/views.py:71 #, python-brace-format msgid "" "You don't have the permission to update this instance of the model " @@ -2318,7 +2448,7 @@ msgstr "" "diesen Parametern zu aktualisieren. Bitte korrigieren Sie Ihre Daten und " "versuchen Sie es erneut." -#: apps/permission/views.py:76 +#: apps/permission/views.py:75 #, python-brace-format msgid "" "You don't have the permission to create an instance of the model \"{model}\" " @@ -2328,11 +2458,11 @@ msgstr "" "diesen Parametern zu erstellen. Bitte korrigieren Sie Ihre Daten und " "versuchen Sie es erneut." -#: apps/permission/views.py:112 note_kfet/templates/base.html:114 +#: apps/permission/views.py:111 note_kfet/templates/base.html:120 msgid "Rights" msgstr "Rechten" -#: apps/permission/views.py:117 +#: apps/permission/views.py:137 msgid "All rights" msgstr "Alle Rechten" @@ -2422,7 +2552,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:186 +#: apps/wei/templates/wei/weimembership_form.html:196 msgid "Validate registration" msgstr "Registrierung validieren" @@ -2472,60 +2602,68 @@ msgstr "Danke" msgid "The Note Kfet team." msgstr "Die NoteKfet Team." -#: apps/registration/views.py:42 +#: apps/registration/views.py:43 msgid "Register new user" msgstr "Neuen User registrieren" -#: apps/registration/views.py:100 +#: apps/registration/views.py:101 msgid "Email validation" msgstr "Email validierung" -#: apps/registration/views.py:102 +#: apps/registration/views.py:103 msgid "Validate email" msgstr "Email validieren" -#: apps/registration/views.py:146 +#: apps/registration/views.py:147 msgid "Email validation unsuccessful" msgstr "Email validierung unerfolgreich" -#: apps/registration/views.py:157 +#: apps/registration/views.py:158 msgid "Email validation email sent" msgstr "Validierungsemail wurde gesendet" -#: apps/registration/views.py:165 +#: apps/registration/views.py:166 msgid "Resend email validation link" msgstr "E-Mail-Validierungslink erneut senden" -#: apps/registration/views.py:183 +#: apps/registration/views.py:184 msgid "Pre-registered users list" msgstr "Vorregistrierte Userliste" -#: apps/registration/views.py:207 +#: apps/registration/views.py:213 msgid "Unregistered users" msgstr "Unregistrierte Users" -#: apps/registration/views.py:220 +#: apps/registration/views.py:226 msgid "Registration detail" msgstr "Registrierung Detailen" -#: apps/registration/views.py:256 +#: apps/registration/views.py:262 #, fuzzy, python-format #| msgid "Note of %(club)s club" msgid "Join %(club)s Club" msgstr "%(club)s Note" -#: apps/registration/views.py:299 -msgid "You must join the BDE." +#: apps/registration/views.py:305 +#, fuzzy +#| msgid "You must join the BDE." +msgid "You must join a club." msgstr "Sie müssen die BDE beitreten." -#: apps/registration/views.py:330 +#: apps/registration/views.py:309 +#, fuzzy +#| msgid "You must join the BDE." +msgid "You must also join the parent club BDE." +msgstr "Sie müssen die BDE beitreten." + +#: apps/registration/views.py:340 msgid "" "The entered amount is not enough for the memberships, should be at least {}" msgstr "" "Der eingegebene Betrag reicht für die Mitgliedschaft nicht aus, sollte " "mindestens {} betragen" -#: apps/registration/views.py:425 +#: apps/registration/views.py:435 msgid "Invalidate pre-registration" msgstr "Ungültige Vorregistrierung" @@ -2533,7 +2671,7 @@ msgstr "Ungültige Vorregistrierung" msgid "Treasury" msgstr "Quaestor" -#: apps/treasury/forms.py:26 apps/treasury/models.py:112 +#: apps/treasury/forms.py:26 apps/treasury/models.py:113 #: apps/treasury/templates/treasury/invoice_form.html:22 msgid "This invoice is locked and can no longer be edited." msgstr "Diese Rechnung ist gesperrt und kann nicht mehr bearbeitet werden." @@ -2546,8 +2684,8 @@ msgstr "Überweisung ist bereits geschlossen." msgid "You can't change the type of the remittance." msgstr "Sie können die Art der Überweisung nicht ändern." -#: apps/treasury/forms.py:125 apps/treasury/models.py:275 -#: apps/treasury/tables.py:97 apps/treasury/tables.py:105 +#: apps/treasury/forms.py:125 apps/treasury/models.py:276 +#: apps/treasury/tables.py:99 apps/treasury/tables.py:108 #: apps/treasury/templates/treasury/invoice_list.html:16 #: apps/treasury/templates/treasury/remittance_list.html:16 #: apps/treasury/templates/treasury/sogecredit_list.html:17 @@ -2562,142 +2700,143 @@ msgstr "Keine beigefügte Überweisung" msgid "Invoice identifier" msgstr "Rechnungskennung" -#: apps/treasury/models.py:42 +#: apps/treasury/models.py:43 apps/wrapped/models.py:28 +#: apps/wrapped/models.py:29 msgid "BDE" msgstr "BDE" -#: apps/treasury/models.py:46 +#: apps/treasury/models.py:47 #, fuzzy #| msgid "location" msgid "Quotation" msgstr "Ort" -#: apps/treasury/models.py:51 +#: apps/treasury/models.py:52 msgid "Object" msgstr "Objekt" -#: apps/treasury/models.py:55 +#: apps/treasury/models.py:56 msgid "Description" msgstr "Beschreibung" -#: apps/treasury/models.py:64 +#: apps/treasury/models.py:65 msgid "Address" msgstr "Adresse" -#: apps/treasury/models.py:69 apps/treasury/models.py:202 +#: apps/treasury/models.py:70 apps/treasury/models.py:203 msgid "Date" msgstr "Datum" -#: apps/treasury/models.py:75 +#: apps/treasury/models.py:76 #, fuzzy #| msgid "end date" msgid "Payment date" msgstr "Abschlussdatum" -#: apps/treasury/models.py:79 +#: apps/treasury/models.py:80 msgid "Acquitted" msgstr "Bezahlt" -#: apps/treasury/models.py:84 +#: apps/treasury/models.py:85 msgid "Locked" msgstr "Gesperrt" -#: apps/treasury/models.py:85 +#: apps/treasury/models.py:86 msgid "An invoice can't be edited when it is locked." msgstr "Eine Rechnung kann nicht bearbeitet werden, wenn sie gesperrt ist." -#: apps/treasury/models.py:91 +#: apps/treasury/models.py:92 msgid "tex source" msgstr "Tex Quelle" -#: apps/treasury/models.py:95 apps/treasury/models.py:140 +#: apps/treasury/models.py:96 apps/treasury/models.py:141 msgid "invoice" msgstr "Rechnung" -#: apps/treasury/models.py:96 +#: apps/treasury/models.py:97 msgid "invoices" msgstr "Rechnungen" -#: apps/treasury/models.py:99 +#: apps/treasury/models.py:100 #, python-brace-format msgid "Invoice #{id}" msgstr "Rechnung #{id}" -#: apps/treasury/models.py:145 +#: apps/treasury/models.py:146 msgid "Designation" msgstr "Bezeichnung" -#: apps/treasury/models.py:151 +#: apps/treasury/models.py:152 msgid "Quantity" msgstr "Qualität" -#: apps/treasury/models.py:156 +#: apps/treasury/models.py:157 msgid "Unit price" msgstr "Einzelpreis" -#: apps/treasury/models.py:160 +#: apps/treasury/models.py:161 msgid "product" msgstr "Produkt" -#: apps/treasury/models.py:161 +#: apps/treasury/models.py:162 msgid "products" msgstr "Produkten" -#: apps/treasury/models.py:189 +#: apps/treasury/models.py:190 msgid "remittance type" msgstr "Überweisungstyp" -#: apps/treasury/models.py:190 +#: apps/treasury/models.py:191 msgid "remittance types" msgstr "Überweisungstypen" -#: apps/treasury/models.py:213 +#: apps/treasury/models.py:214 msgid "Comment" msgstr "Kommentar" -#: apps/treasury/models.py:218 +#: apps/treasury/models.py:219 msgid "Closed" msgstr "Geschlossen" -#: apps/treasury/models.py:222 +#: apps/treasury/models.py:223 msgid "remittance" msgstr "Überweisung" -#: apps/treasury/models.py:223 +#: apps/treasury/models.py:224 msgid "remittances" msgstr "Überweisungen" -#: apps/treasury/models.py:226 +#: apps/treasury/models.py:227 msgid "Remittance #{:d}: {}" msgstr "Überweisung #{:d}:{}" -#: apps/treasury/models.py:279 +#: apps/treasury/models.py:280 msgid "special transaction proxy" msgstr "spezielle Transaktion Proxy" -#: apps/treasury/models.py:280 +#: apps/treasury/models.py:281 msgid "special transaction proxies" msgstr "spezielle Transaktion Proxies" -#: apps/treasury/models.py:306 +#: apps/treasury/models.py:307 msgid "credit transaction" msgstr "Kredit Transaktion" -#: apps/treasury/models.py:311 +#: apps/treasury/models.py:312 #: apps/treasury/templates/treasury/sogecredit_detail.html:10 msgid "Credit from the Société générale" msgstr "Kredit von der Société générale" -#: apps/treasury/models.py:312 +#: apps/treasury/models.py:313 msgid "Credits from the Société générale" msgstr "Krediten von der Société générale" -#: apps/treasury/models.py:315 +#: apps/treasury/models.py:316 #, python-brace-format msgid "Soge credit for {user}" msgstr "Kredit von der Société générale für {user}" -#: apps/treasury/models.py:445 +#: apps/treasury/models.py:446 msgid "" "This user doesn't have enough money to pay the memberships with its note. " "Please ask her/him to credit the note before invalidating this credit." @@ -2716,25 +2855,22 @@ msgstr "Rechnung #{:d}" msgid "Invoice" msgstr "Rechnung" -#: apps/treasury/tables.py:65 +#: apps/treasury/tables.py:66 msgid "Transaction count" msgstr "Transaktionanzahl" -#: apps/treasury/tables.py:70 apps/treasury/tables.py:72 +#: apps/treasury/tables.py:71 apps/treasury/tables.py:73 +#: apps/wei/templates/wei/busteam_detail.html:22 apps/wrapped/tables.py:42 msgid "View" msgstr "Schauen" -#: apps/treasury/tables.py:143 -msgid "Yes" -msgstr "Ja" - #: apps/treasury/templates/treasury/invoice_confirm_delete.html:10 -#: apps/treasury/views.py:173 +#: apps/treasury/views.py:174 msgid "Delete invoice" msgstr "Rechnung löschen" #: apps/treasury/templates/treasury/invoice_confirm_delete.html:15 -#: apps/treasury/views.py:177 +#: apps/treasury/views.py:178 msgid "This invoice is locked and can't be deleted." msgstr "Eine Rechnung kann nicht gelöscht werden, wenn sie gesperrt ist." @@ -2912,63 +3048,63 @@ msgstr "Kredit von der Société générale" msgid "Credit successfully registered" msgstr "Taste erfolgreich gelöscht " -#: apps/treasury/views.py:40 +#: apps/treasury/views.py:41 msgid "Create new invoice" msgstr "Neue Rechnung" -#: apps/treasury/views.py:97 +#: apps/treasury/views.py:98 msgid "Invoices list" msgstr "Rechnunglist" -#: apps/treasury/views.py:105 apps/treasury/views.py:275 -#: apps/treasury/views.py:401 +#: apps/treasury/views.py:106 apps/treasury/views.py:281 +#: apps/treasury/views.py:394 msgid "You are not able to see the treasury interface." msgstr "Sie können die Quaestor-App nicht sehen." -#: apps/treasury/views.py:115 +#: apps/treasury/views.py:116 msgid "Update an invoice" msgstr "Rechnung bearbeiten" -#: apps/treasury/views.py:240 +#: apps/treasury/views.py:241 msgid "Create a new remittance" msgstr "Neue Überweisung" -#: apps/treasury/views.py:267 +#: apps/treasury/views.py:265 msgid "Remittances list" msgstr "Überweisungliste" -#: apps/treasury/views.py:326 +#: apps/treasury/views.py:320 msgid "Update a remittance" msgstr "Überweisung bearbeiten" -#: apps/treasury/views.py:349 +#: apps/treasury/views.py:342 msgid "Attach a transaction to a remittance" msgstr "Fügen Sie einer Überweisung eine Transaktion hinzu" -#: apps/treasury/views.py:393 +#: apps/treasury/views.py:386 msgid "List of credits from the Société générale" msgstr "Kreditliste von Société générale" -#: apps/treasury/views.py:438 +#: apps/treasury/views.py:436 msgid "Manage credits from the Société générale" msgstr "Krediten von der Société générale handeln" -#: apps/wei/apps.py:10 apps/wei/models.py:37 apps/wei/models.py:38 -#: apps/wei/models.py:62 apps/wei/models.py:178 +#: 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 msgid "WEI" msgstr "WEI" -#: apps/wei/forms/registration.py:35 +#: apps/wei/forms/registration.py:37 msgid "The selected user is not validated. Please validate its account first" msgstr "" -#: apps/wei/forms/registration.py:59 apps/wei/models.py:126 -#: apps/wei/models.py:324 +#: apps/wei/forms/registration.py:71 apps/wei/models.py:140 +#: apps/wei/models.py:348 msgid "bus" msgstr "Bus" -#: apps/wei/forms/registration.py:60 +#: apps/wei/forms/registration.py:72 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." @@ -2977,11 +3113,11 @@ msgstr "" "einen Bus und ein Team zuzuweisen, insbesondere wenn Sie ein freies Elektron " "sind." -#: apps/wei/forms/registration.py:67 +#: apps/wei/forms/registration.py:79 msgid "Team" msgstr "Team" -#: apps/wei/forms/registration.py:69 +#: apps/wei/forms/registration.py:81 msgid "" "Leave this field empty if you won't be in a team (staff, bus chief, free " "electron)" @@ -2989,16 +3125,16 @@ msgstr "" "Lassen Sie dieses Feld leer, wenn Sie nicht in einem Team sind (Mitarbeiter, " "Buschef, freies Elektron)" -#: apps/wei/forms/registration.py:75 apps/wei/forms/registration.py:85 -#: apps/wei/models.py:160 +#: apps/wei/forms/registration.py:87 apps/wei/forms/registration.py:97 +#: apps/wei/models.py:174 msgid "WEI Roles" msgstr "WEI Rollen" -#: apps/wei/forms/registration.py:76 +#: apps/wei/forms/registration.py:88 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:122 +#: apps/wei/forms/registration.py:134 msgid "This team doesn't belong to the given bus." msgstr "Dieses Team gehört nicht zum angegebenen Bus." @@ -3011,126 +3147,149 @@ msgid "year" msgstr "Jahr" #: apps/wei/models.py:29 apps/wei/templates/wei/base.html:30 +#: apps/wrapped/models.py:20 msgid "date start" msgstr "Anfangsdatum" #: apps/wei/models.py:33 apps/wei/templates/wei/base.html:33 +#: apps/wrapped/models.py:24 msgid "date end" msgstr "Abschlussdatum" -#: apps/wei/models.py:71 apps/wei/tables.py:305 +#: apps/wei/models.py:37 +#, fuzzy +#| msgid "total amount" +msgid "caution amount" +msgstr "Totalanzahlt" + +#: apps/wei/models.py:76 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:83 +#: apps/wei/models.py:97 msgid "survey information" msgstr "Umfrage Infos" -#: apps/wei/models.py:84 +#: apps/wei/models.py:98 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:88 +#: apps/wei/models.py:102 msgid "Bus" msgstr "Bus" -#: apps/wei/models.py:89 apps/wei/templates/wei/weiclub_detail.html:51 +#: apps/wei/models.py:103 apps/wei/templates/wei/weiclub_detail.html:51 msgid "Buses" msgstr "Buses" -#: apps/wei/models.py:135 +#: apps/wei/models.py:149 msgid "color" msgstr "Farbe" -#: apps/wei/models.py:136 +#: apps/wei/models.py:150 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:147 +#: apps/wei/models.py:161 msgid "Bus team" msgstr "Bus Team" -#: apps/wei/models.py:148 +#: apps/wei/models.py:162 msgid "Bus teams" msgstr "Bus Teams" -#: apps/wei/models.py:159 +#: apps/wei/models.py:173 msgid "WEI Role" msgstr "WEI Rolle" -#: apps/wei/models.py:183 +#: apps/wei/models.py:197 msgid "Credit from Société générale" msgstr "Kredit von der Société générale" -#: apps/wei/models.py:188 +#: apps/wei/models.py:202 apps/wei/views.py:984 msgid "Caution check given" msgstr "Caution check given" -#: apps/wei/models.py:192 apps/wei/templates/wei/weimembership_form.html:64 +#: apps/wei/models.py:208 +msgid "Check" +msgstr "" + +#: apps/wei/models.py:209 +#, fuzzy +#| msgid "transactions" +msgid "Note transaction" +msgstr "Transaktionen" + +#: apps/wei/models.py:212 +#, fuzzy +#| msgid "created at" +msgid "caution type" +msgstr "erschafft am" + +#: apps/wei/models.py:216 apps/wei/templates/wei/weimembership_form.html:64 msgid "birth date" msgstr "Geburtsdatum" -#: apps/wei/models.py:198 apps/wei/models.py:208 +#: apps/wei/models.py:222 apps/wei/models.py:232 msgid "Male" msgstr "Männlich" -#: apps/wei/models.py:199 apps/wei/models.py:209 +#: apps/wei/models.py:223 apps/wei/models.py:233 msgid "Female" msgstr "Weiblich" -#: apps/wei/models.py:200 +#: apps/wei/models.py:224 msgid "Non binary" msgstr "Nicht binär" -#: apps/wei/models.py:202 apps/wei/templates/wei/attribute_bus_1A.html:22 +#: apps/wei/models.py:226 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:210 +#: apps/wei/models.py:234 msgid "Unisex" msgstr "Unisex" -#: apps/wei/models.py:213 apps/wei/templates/wei/weimembership_form.html:58 +#: apps/wei/models.py:237 apps/wei/templates/wei/weimembership_form.html:58 msgid "clothing cut" msgstr "Kleidung Schnitt" -#: apps/wei/models.py:226 apps/wei/templates/wei/weimembership_form.html:61 +#: apps/wei/models.py:250 apps/wei/templates/wei/weimembership_form.html:61 msgid "clothing size" msgstr "Kleidergröße" -#: apps/wei/models.py:232 apps/wei/templates/wei/attribute_bus_1A.html:28 -#: apps/wei/templates/wei/weimembership_form.html:67 +#: apps/wei/models.py:256 msgid "health issues" msgstr "Gesundheitsprobleme" -#: apps/wei/models.py:237 apps/wei/templates/wei/weimembership_form.html:70 +#: apps/wei/models.py:261 apps/wei/templates/wei/weimembership_form.html:70 msgid "emergency contact name" msgstr "Notfall-Kontakt" -#: apps/wei/models.py:238 +#: apps/wei/models.py:262 msgid "The emergency contact must not be a WEI participant" msgstr "Der Notfallkontakt darf kein WEI-Teilnehmer sein" -#: apps/wei/models.py:243 apps/wei/templates/wei/weimembership_form.html:73 +#: apps/wei/models.py:267 apps/wei/templates/wei/weimembership_form.html:73 msgid "emergency contact phone" msgstr "Notfallkontakttelefon" -#: apps/wei/models.py:248 apps/wei/templates/wei/weimembership_form.html:52 +#: apps/wei/models.py:272 apps/wei/templates/wei/weimembership_form.html:52 msgid "first year" msgstr "Erste Jahr" -#: apps/wei/models.py:249 +#: apps/wei/models.py:273 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:254 +#: apps/wei/models.py:278 msgid "registration information" msgstr "Registrierung Detailen" -#: apps/wei/models.py:255 +#: apps/wei/models.py:279 msgid "" "Information about the registration (buses for old members, survey for the " "new members), encoded in JSON" @@ -3138,27 +3297,27 @@ msgstr "" "Informationen zur Registrierung (Busse für alte Mitglieder, Umfrage für neue " "Mitglieder), verschlüsselt in JSON" -#: apps/wei/models.py:261 +#: apps/wei/models.py:285 msgid "WEI User" msgstr "WEI User" -#: apps/wei/models.py:262 +#: apps/wei/models.py:286 msgid "WEI Users" msgstr "WEI Users" -#: apps/wei/models.py:334 +#: apps/wei/models.py:358 msgid "team" msgstr "Team" -#: apps/wei/models.py:344 +#: apps/wei/models.py:368 msgid "WEI registration" msgstr "WEI Registrierung" -#: apps/wei/models.py:348 +#: apps/wei/models.py:372 msgid "WEI membership" msgstr "WEI Mitgliedschaft" -#: apps/wei/models.py:349 +#: apps/wei/models.py:373 msgid "WEI memberships" msgstr "WEI Mitgliedschaften" @@ -3190,8 +3349,8 @@ msgstr "Jahr" msgid "preferred bus" msgstr "bevorzugter Bus" -#: apps/wei/tables.py:210 apps/wei/templates/wei/bus_detail.html:32 -#: apps/wei/templates/wei/busteam_detail.html:50 +#: apps/wei/tables.py:210 apps/wei/templates/wei/bus_detail.html:36 +#: apps/wei/templates/wei/busteam_detail.html:52 msgid "Teams" msgstr "Teams" @@ -3230,13 +3389,20 @@ msgid "Attribute first year members into buses" msgstr "" #: apps/wei/templates/wei/1A_list.html:15 -msgid "Start attribution!" +msgid "Start attribution !" msgstr "" #: apps/wei/templates/wei/attribute_bus_1A.html:8 msgid "Bus attribution" msgstr "" +#: apps/wei/templates/wei/attribute_bus_1A.html:28 +#: apps/wei/templates/wei/weimembership_form.html:67 +#, fuzzy +#| msgid "health issues" +msgid "health issues or specific diet" +msgstr "Gesundheitsprobleme" + #: apps/wei/templates/wei/attribute_bus_1A.html:31 msgid "suggested bus" msgstr "" @@ -3257,53 +3423,61 @@ msgstr "Tastenliste" msgid "WEI fee (paid students)" msgstr "WEI Preis (bezahlte Studenten)" -#: apps/wei/templates/wei/base.html:47 apps/wei/templates/wei/base.html:54 -msgid "The BDE membership is included in the WEI registration." -msgstr "Die BDE-Mitgliedschaft ist in der WEI-Registrierung enthalten." - -#: apps/wei/templates/wei/base.html:51 +#: apps/wei/templates/wei/base.html:47 msgid "WEI fee (unpaid students)" msgstr "WEI Preis (unbezahlte Studenten)" -#: apps/wei/templates/wei/base.html:76 +#: apps/wei/templates/wei/base.html:53 +#, fuzzy +#| msgid "total amount" +msgid "Caution amount" +msgstr "Totalanzahlt" + +#: apps/wei/templates/wei/base.html:74 msgid "WEI list" msgstr "WEI Liste" -#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:528 +#: apps/wei/templates/wei/base.html:79 apps/wei/views.py:550 msgid "Register 1A" msgstr "1A Registrieren" -#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:614 +#: apps/wei/templates/wei/base.html:83 apps/wei/views.py:644 msgid "Register 2A+" msgstr "2A+ Registrieren" -#: apps/wei/templates/wei/base.html:93 +#: apps/wei/templates/wei/base.html:91 msgid "Add bus" msgstr "Neue Bus" -#: apps/wei/templates/wei/base.html:97 +#: apps/wei/templates/wei/base.html:95 msgid "View WEI" msgstr "WEI schauen" -#: apps/wei/templates/wei/bus_detail.html:22 -#: apps/wei/templates/wei/busteam_detail.html:22 +#: apps/wei/templates/wei/bus_detail.html:21 +#, fuzzy +#| msgid "club" +msgid "View club" +msgstr "Club" + +#: apps/wei/templates/wei/bus_detail.html:26 +#: apps/wei/templates/wei/busteam_detail.html:24 msgid "Add team" msgstr "Neue Team" -#: apps/wei/templates/wei/bus_detail.html:45 +#: apps/wei/templates/wei/bus_detail.html:49 msgid "Members" msgstr "Mitglied" -#: apps/wei/templates/wei/bus_detail.html:54 -#: apps/wei/templates/wei/busteam_detail.html:60 +#: apps/wei/templates/wei/bus_detail.html:58 +#: apps/wei/templates/wei/busteam_detail.html:62 #: apps/wei/templates/wei/weimembership_list.html:31 msgid "View as PDF" 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:1028 -#: apps/wei/views.py:1083 apps/wei/views.py:1130 +#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:1159 +#: apps/wei/views.py:1214 apps/wei/views.py:1261 msgid "Survey WEI" msgstr "WEI Umfrage" @@ -3347,7 +3521,7 @@ msgstr "Unvalidierte Registrierungen" msgid "Attribute buses" msgstr "" -#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:79 +#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:82 msgid "Create WEI" msgstr "Neue WEI" @@ -3431,29 +3605,42 @@ msgstr "" "validieren, sobald die Bank die Erstellung des Kontos validiert hat, oder " "die Zahlungsmethode ändern." +#: apps/wei/templates/wei/weimembership_form.html:147 +msgid "Required payments:" +msgstr "" + #: apps/wei/templates/wei/weimembership_form.html:149 -#, python-format -msgid "" -"The note don't have enough money (%(balance)s, %(pretty_fee)s required). The " -"registration may fail if you don't credit the note now." -msgstr "" -"Die Note hat nicht genug Geld (%(balance)s,%(pretty_fee)s erforderlich). Die " -"Registrierung kann fehlschlagen, wenn Sie die Note jetzt nicht gutschreiben." +#, fuzzy, python-format +#| msgid "membership fee (paid students)" +msgid "Membership fees: %(amount)s" +msgstr "Mitgliedschaftpreis (bezahlte Studenten)" -#: apps/wei/templates/wei/weimembership_form.html:157 +#: apps/wei/templates/wei/weimembership_form.html:153 #, python-format -msgid "" -"The note has enough money (%(pretty_fee)s required), the registration is " -"possible." +msgid "Deposit (by Note transaction): %(amount)s" msgstr "" -"Die Note hat genug Geld (%(pretty_fee)s erforderlich), die Registrierung ist " -"möglich." -#: apps/wei/templates/wei/weimembership_form.html:166 +#: 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 +#, python-format +msgid "Deposit (by check): %(amount)s" +msgstr "" + +#: apps/wei/templates/wei/weimembership_form.html:168 +#, python-format +msgid "Current balance: %(balance)s" +msgstr "" + +#: apps/wei/templates/wei/weimembership_form.html:176 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:174 +#: apps/wei/templates/wei/weimembership_form.html:184 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 " @@ -3489,67 +3676,67 @@ msgstr "Bei diesem Muster wurde keine Vorregistrierung gefunden." msgid "View validated memberships..." msgstr "Validierte Mitgliedschaften anzeigen ..." -#: apps/wei/views.py:58 +#: apps/wei/views.py:61 msgid "Search WEI" msgstr "WEI finden" -#: apps/wei/views.py:109 +#: apps/wei/views.py:112 msgid "WEI Detail" msgstr "WEI Infos" -#: apps/wei/views.py:208 +#: apps/wei/views.py:212 msgid "View members of the WEI" msgstr "Mitglied der WEI schauen" -#: apps/wei/views.py:236 +#: apps/wei/views.py:245 msgid "Find WEI Membership" msgstr "WEI Mitgliedschaft finden" -#: apps/wei/views.py:246 +#: apps/wei/views.py:255 msgid "View registrations to the WEI" msgstr "Mitglied der WEI schauen" -#: apps/wei/views.py:270 +#: apps/wei/views.py:284 msgid "Find WEI Registration" msgstr "WEI Registrierung finden" -#: apps/wei/views.py:281 +#: apps/wei/views.py:295 msgid "Update the WEI" msgstr "WEI bearbeiten" -#: apps/wei/views.py:302 +#: apps/wei/views.py:316 msgid "Create new bus" msgstr "Neue Bus" -#: apps/wei/views.py:340 +#: apps/wei/views.py:354 msgid "Update bus" msgstr "Bus bearbeiten" -#: apps/wei/views.py:372 +#: apps/wei/views.py:386 msgid "Manage bus" msgstr "Bus ändern" -#: apps/wei/views.py:399 +#: apps/wei/views.py:413 msgid "Create new team" msgstr "Neue Bus Team" -#: apps/wei/views.py:439 +#: apps/wei/views.py:457 msgid "Update team" msgstr "Team bearbeiten" -#: apps/wei/views.py:470 +#: apps/wei/views.py:492 msgid "Manage WEI team" msgstr "WEI Team bearbeiten" -#: apps/wei/views.py:492 +#: apps/wei/views.py:514 msgid "Register first year student to the WEI" msgstr "Registrieren Sie den Erstsemester beim WEI" -#: apps/wei/views.py:550 apps/wei/views.py:649 +#: apps/wei/views.py:580 apps/wei/views.py:689 msgid "This user is already registered to this WEI." msgstr "Dieser Benutzer ist bereits bei dieser WEI registriert." -#: apps/wei/views.py:555 +#: apps/wei/views.py:585 msgid "" "This user can't be in her/his first year since he/she has already " "participated to a WEI." @@ -3557,51 +3744,1819 @@ msgstr "" "Dieser Benutzer kann nicht in seinem ersten Jahr sein, da er bereits an " "einer WEI teilgenommen hat." -#: apps/wei/views.py:578 +#: apps/wei/views.py:608 msgid "Register old student to the WEI" msgstr "Registrieren Sie einen alten Studenten beim WEI" -#: apps/wei/views.py:633 apps/wei/views.py:721 +#: apps/wei/views.py:663 apps/wei/views.py:768 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:685 +#: apps/wei/views.py:676 apps/wei/views.py:785 +msgid "Choose how you want to pay the deposit" +msgstr "" + +#: apps/wei/views.py:728 msgid "Update WEI Registration" msgstr "WEI Registrierung aktualisieren" -#: apps/wei/views.py:795 +#: apps/wei/views.py:810 +#, 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 +#, fuzzy +#| msgid "" +#| "You don't have the permission to add an instance of model {app_label}." +#| "{model_name}." +msgid "You don't have the permission to update memberships" +msgstr "" +"Sie haben nicht die Berechtigung, eine Instanz von model {app_label}. " +"{model_name} hinzufügen." + +#: apps/wei/views.py:825 +#, fuzzy, 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 "" +"Sie haben nicht die Berechtigung, eine Instanz von model {app_label}. " +"{model_name} zulöschen." + +#: apps/wei/views.py:870 msgid "Delete WEI registration" msgstr "WEI Registrierung löschen" -#: apps/wei/views.py:806 +#: apps/wei/views.py:881 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:824 +#: apps/wei/views.py:899 msgid "Validate WEI registration" msgstr "Überprüfen Sie die WEI-Registrierung" -#: apps/wei/views.py:1223 +#: apps/wei/views.py:985 +#, 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" +msgstr "" +"Bitte bitten Sie den Benutzer, seine Note gutzuschreiben, bevor Sie diese " +"Kredit löschen." + +#: apps/wei/views.py:991 +#, fuzzy +#| msgid "credit transaction" +msgid "Create deposit transaction" +msgstr "Kredit Transaktion" + +#: apps/wei/views.py:992 +#, python-format +msgid "" +"A transaction of %(amount).2f€ will be created from the user's Note account" +msgstr "" + +#: apps/wei/views.py:1087 +#, fuzzy, python-format +#| msgid "" +#| "This user don't have enough money to join this club, and can't have a " +#| "negative balance." +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 "" +"Diese User hat nicht genug Geld um Mitglied zu werden, und darf nich im Rot " +"sein." + +#: apps/wei/views.py:1140 +#, fuzzy, python-format +#| msgid "created at" +msgid "Caution %(name)s" +msgstr "erschafft am" + +#: apps/wei/views.py:1354 msgid "Attribute buses to first year members" msgstr "" -#: apps/wei/views.py:1248 +#: apps/wei/views.py:1379 msgid "Attribute bus" msgstr "" -#: note_kfet/settings/base.py:173 +#: apps/wei/views.py:1419 +msgid "" +"No first year student without a bus found. Either all of them have a bus, or " +"none has filled the survey yet." +msgstr "" + +#: apps/wrapped/apps.py:10 +msgid "wrapped" +msgstr "" + +#: apps/wrapped/models.py:40 +#, fuzzy +#| msgid "Regenerate token" +msgid "generated" +msgstr "Token erneuern" + +#: apps/wrapped/models.py:45 +msgid "public" +msgstr "" + +#: apps/wrapped/models.py:53 +msgid "bde" +msgstr "" + +#: apps/wrapped/models.py:65 +msgid "data json" +msgstr "" + +#: apps/wrapped/models.py:66 +msgid "data in the wrapped and generated by the script generate_wrapped" +msgstr "" + +#: apps/wrapped/models.py:70 note_kfet/templates/base.html:114 +msgid "Wrapped" +msgstr "" + +#: apps/wrapped/models.py:71 +msgid "Wrappeds" +msgstr "" + +#: apps/wrapped/tables.py:40 +msgid "view the wrapped" +msgstr "" + +#: apps/wrapped/tables.py:55 +msgid "Click to make this wrapped private" +msgstr "" + +#: apps/wrapped/tables.py:56 +msgid "Click to make this wrapped public" +msgstr "" + +#: apps/wrapped/tables.py:67 +msgid "Share" +msgstr "" + +#: apps/wrapped/tables.py:73 +msgid "Click to copy the link in the press paper" +msgstr "" + +#: apps/wrapped/tables.py:81 +msgid "Copy link" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:16 +#: note_kfet/templates/base.html:14 +msgid "The ENS Paris-Saclay BDE note." +msgstr "Die BDE ENS-Paris-Saclay Note." + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:58 +#, fuzzy +#| msgid "The Note Kfet team." +msgid "The NoteKfet this year it's also" +msgstr "Die NoteKfet Team." + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:60 +#, fuzzy +#| msgid "transactions" +msgid " transactions" +msgstr "Transaktionen" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:61 +msgid " parties" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:62 +#, fuzzy +#| msgid "entries" +msgid " Pot entries" +msgstr "Eintritte" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:72 +msgid " old dickhead behind the bar" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:9 +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:9 +msgid "NoteKfet Wrapped" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:11 +msgid "Your best consumer:" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:13 +msgid "Your worst creditor:" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:16 +msgid "party·ies organised" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:17 +#, fuzzy +#| msgid "Add member" +msgid "distinct members" +msgstr "Neue Mitglied" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:26 +msgid "Infortunately, you doesn't have consumer this year" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:28 +msgid "Congratulations you are a real rat !" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:13 +msgid "You participate to the wei: " +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:13 +#, fuzzy +#| msgid "in the team" +msgid "in the" +msgstr "In der Team" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:18 +msgid "pots !" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:27 +msgid "Your first conso of the year: " +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:28 +msgid "Your prefered consumtion category: " +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:41 +msgid ": it's the number of time your reload your note" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:44 +msgid "Your overall expenses: " +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:47 +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:60 +msgid "with" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:57 +msgid "Your expenses to BDE: " +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:13 +msgid "My wrapped" +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:22 +msgid "Public wrapped" +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:33 +msgid "" +"Do not forget to ask permission to people who are in your wrapped before to " +"make them public" +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:40 +msgid "Link copied" +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:65 +msgid "Wrapped is private" +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:66 +msgid "Wrapped is public" +msgstr "" + +#: apps/wrapped/views.py:28 +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" -#: note_kfet/settings/base.py:174 +#: note_kfet/settings/base.py:178 msgid "English" msgstr "English" -#: note_kfet/settings/base.py:175 +#: note_kfet/settings/base.py:179 msgid "Spanish" msgstr "Spanisch" -#: note_kfet/settings/base.py:176 +#: note_kfet/settings/base.py:180 msgid "French" msgstr "Französich" @@ -3661,14 +5616,6 @@ msgstr "" msgid "Reset" msgstr "Reset" -#: note_kfet/templates/base.html:14 -msgid "The ENS Paris-Saclay BDE note." -msgstr "Die BDE ENS-Paris-Saclay Note." - -#: note_kfet/templates/base.html:72 -msgid "Food" -msgstr "" - #: note_kfet/templates/base.html:84 msgid "Users" msgstr "Users" @@ -3677,26 +5624,26 @@ msgstr "Users" msgid "Clubs" msgstr "Clubs" -#: note_kfet/templates/base.html:119 +#: note_kfet/templates/base.html:125 msgid "Admin" msgstr "Admin" -#: note_kfet/templates/base.html:133 +#: note_kfet/templates/base.html:139 msgid "My account" msgstr "Mein Konto" -#: note_kfet/templates/base.html:136 +#: note_kfet/templates/base.html:142 msgid "Log out" msgstr "Abmelden" -#: note_kfet/templates/base.html:144 +#: note_kfet/templates/base.html:150 #: note_kfet/templates/registration/signup.html:6 #: note_kfet/templates/registration/signup.html:11 #: note_kfet/templates/registration/signup.html:28 msgid "Sign up" msgstr "Registrieren" -#: note_kfet/templates/base.html:151 +#: note_kfet/templates/base.html:157 #: note_kfet/templates/registration/login.html:6 #: note_kfet/templates/registration/login.html:15 #: note_kfet/templates/registration/login.html:38 @@ -3704,13 +5651,13 @@ msgstr "Registrieren" msgid "Log in" msgstr "Anmelden" -#: note_kfet/templates/base.html:165 +#: note_kfet/templates/base.html:171 msgid "" "You are not a BDE member anymore. Please renew your membership if you want " "to use the note." msgstr "" -#: note_kfet/templates/base.html:171 +#: note_kfet/templates/base.html:177 msgid "" "Your e-mail address is not validated. Please check your mail inbox and click " "on the validation link." @@ -3718,7 +5665,7 @@ msgstr "" "Ihre E-Mail-Adresse ist nicht validiert. Bitte überprüfen Sie Ihren " "Posteingang und klicken Sie auf den Validierungslink." -#: note_kfet/templates/base.html:177 +#: note_kfet/templates/base.html:183 msgid "" "You declared that you opened a bank account in the Société générale. The " "bank did not validate the creation of the account to the BDE, so the " @@ -3727,19 +5674,19 @@ msgid "" "creation." msgstr "" -#: note_kfet/templates/base.html:200 +#: note_kfet/templates/base.html:206 msgid "Contact us" msgstr "Kontakt" -#: note_kfet/templates/base.html:202 +#: note_kfet/templates/base.html:208 msgid "Technical Support" msgstr "" -#: note_kfet/templates/base.html:204 +#: note_kfet/templates/base.html:210 msgid "Charte Info (FR)" msgstr "" -#: note_kfet/templates/base.html:206 +#: note_kfet/templates/base.html:212 msgid "FAQ (FR)" msgstr "FAQ (FR)" @@ -3751,44 +5698,6 @@ 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 "" @@ -3797,48 +5706,16 @@ 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 "" @@ -3856,27 +5733,6 @@ 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 "" @@ -3990,293 +5846,76 @@ msgstr "" "müssen Ihre E-Mail-Adresse auch überprüfen, indem Sie dem Link folgen, den " "Sie erhalten haben." +#~ msgid "The BDE membership is included in the WEI registration." +#~ msgstr "Die BDE-Mitgliedschaft ist in der WEI-Registrierung enthalten." + +#, python-format +#~ msgid "" +#~ "The note don't have enough money (%(balance)s, %(pretty_fee)s required). " +#~ "The registration may fail if you don't credit the note now." +#~ msgstr "" +#~ "Die Note hat nicht genug Geld (%(balance)s,%(pretty_fee)s erforderlich). " +#~ "Die Registrierung kann fehlschlagen, wenn Sie die Note jetzt nicht " +#~ "gutschreiben." + +#, python-format +#~ msgid "" +#~ "The note has enough money (%(pretty_fee)s required), the registration is " +#~ "possible." +#~ msgstr "" +#~ "Die Note hat genug Geld (%(pretty_fee)s erforderlich), die Registrierung " +#~ "ist möglich." + +#, fuzzy +#~| msgid "You don't have the right to delete this WEI registration." +#~ msgid "You don't have the permission to validate registrations" +#~ msgstr "Sie haben nicht das Recht, diese WEI-Registrierung zu löschen." + +#, fuzzy +#~| msgid "active" +#~ msgid "is active" +#~ msgstr "Aktiv" + +#, fuzzy +#~| msgid "start date" +#~ msgid "Arrival date" +#~ msgstr "Anfangsdatum" + +#, fuzzy +#~| msgid "active" +#~ msgid "Active" +#~ msgstr "Aktiv" + +#, fuzzy +#~| msgid "phone number" +#~ msgid "number" +#~ msgstr "Telefonnummer" + +#, fuzzy +#~| msgid "Profile detail" +#~ msgid "View details" +#~ msgstr "Profile detail" + +#, fuzzy +#~| msgid "There is no results." +#~ msgid "There is no meal." +#~ msgstr "Es gibt keine Ergebnisse." + +#, fuzzy +#~| msgid "This credit is already validated." +#~ msgid "The product is already prepared" +#~ msgstr "Dieser Kredit ist bereits validiert." + +#, fuzzy +#~| msgid "Update team" +#~ msgid "Update a meal" +#~ msgstr "Team bearbeiten" + #, fuzzy #~| msgid "Email validation" #~ msgid "Enter a valid color." #~ msgstr "Email validierung" -#, fuzzy -#~| msgid "Email validation" -#~ msgid "Enter a valid value." -#~ msgstr "Email validierung" - -#, 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 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 -#~| msgid "add" -#~ msgid "and" -#~ msgstr "hinzufügen" - -#, 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 -#~| 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 -#~| msgid "Invoice identifier" -#~ msgid "Universally unique identifier" -#~ msgstr "Rechnungskennung" - -#, 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 "phone number" -#~ msgid "Enter a complete value." -#~ msgstr "Telefonnummer" - -#, fuzzy -#~| msgid "Email validation" -#~ msgid "Enter a valid UUID." -#~ 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 "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 "%d year" -#~ msgid_plural "%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." - #, fuzzy #~| msgid "WEI registration" #~ msgid "In preparation" diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index 6dcf73a1..3baa260d 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: 2024-08-17 11:57+0200\n" +"POT-Creation-Date: 2025-06-20 14:02+0200\n" "PO-Revision-Date: 2022-04-11 23:12+0200\n" "Last-Translator: bleizi \n" "Language-Team: \n" @@ -18,50 +18,56 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" +#: apps/activity/api/serializers.py:77 +#, fuzzy +#| msgid "This credit is already validated." +msgid "This opener already exists" +msgstr "Este crédito ya fue validado." + #: apps/activity/apps.py:10 apps/activity/models.py:129 -#: apps/activity/models.py:169 +#: apps/activity/models.py:169 apps/activity/models.py:329 msgid "activity" msgstr "actividad" -#: apps/activity/forms.py:34 +#: apps/activity/forms.py:35 msgid "The note of this club is inactive." msgstr "La note del club está inactiva." -#: apps/activity/forms.py:41 apps/activity/models.py:142 +#: apps/activity/forms.py:42 apps/activity/models.py:142 msgid "The end date must be after the start date." msgstr "La fecha final tiene que ser después de la fecha de inicio." -#: apps/activity/forms.py:82 apps/activity/models.py:271 +#: apps/activity/forms.py:83 apps/activity/models.py:277 msgid "You can't invite someone once the activity is started." msgstr "No se puede invitar a alguien una vez que arrancó la actividad." -#: apps/activity/forms.py:85 apps/activity/models.py:274 +#: apps/activity/forms.py:86 apps/activity/models.py:280 msgid "This activity is not validated yet." msgstr "Esta actividad no fue validada por ahora." -#: apps/activity/forms.py:95 apps/activity/models.py:282 +#: apps/activity/forms.py:96 apps/activity/models.py:288 msgid "This person has been already invited 5 times this year." msgstr "Esta persona ya fue invitada 5 veces este año." -#: apps/activity/forms.py:99 apps/activity/models.py:286 +#: apps/activity/forms.py:100 apps/activity/models.py:292 msgid "This person is already invited." msgstr "Esta persona ya está invitada." -#: apps/activity/forms.py:103 apps/activity/models.py:290 +#: apps/activity/forms.py:104 apps/activity/models.py:296 msgid "You can't invite more than 3 people to this activity." msgstr "Usted no puede invitar más de 3 persona a esta actividad." -#: apps/activity/models.py:28 apps/activity/models.py:63 apps/food/models.py:42 -#: apps/food/models.py:56 apps/member/models.py:203 +#: apps/activity/models.py:28 apps/activity/models.py:63 apps/food/models.py:18 +#: apps/food/models.py:35 apps/member/models.py:203 #: apps/member/templates/member/includes/club_info.html:4 #: apps/member/templates/member/includes/profile_info.html:4 #: apps/note/models/notes.py:263 apps/note/models/transactions.py:26 #: 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:67 apps/wei/models.py:131 apps/wei/tables.py:282 +#: apps/wei/models.py:72 apps/wei/models.py:145 apps/wei/tables.py:282 #: apps/wei/templates/wei/base.html:26 -#: apps/wei/templates/wei/weimembership_form.html:14 +#: apps/wei/templates/wei/weimembership_form.html:14 apps/wrapped/models.py:16 msgid "name" msgstr "nombre" @@ -94,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:78 apps/wei/models.py:142 +#: apps/permission/models.py:188 apps/wei/models.py:92 apps/wei/models.py:156 msgid "description" msgstr "descripción" @@ -113,9 +119,9 @@ msgstr "Lugar donde se organiza la actividad, por ejemplo la Kfet." msgid "type" msgstr "tipo" -#: apps/activity/models.py:91 apps/logs/models.py:22 apps/member/models.py:318 -#: apps/note/models/notes.py:148 apps/treasury/models.py:293 -#: apps/wei/models.py:171 apps/wei/templates/wei/attribute_bus_1A.html:13 +#: apps/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/templates/wei/survey.html:15 msgid "user" msgstr "usuario" @@ -170,7 +176,7 @@ msgid "entry time" msgstr "hora de entrada" #: apps/activity/models.py:180 apps/note/apps.py:14 -#: apps/note/models/notes.py:77 +#: apps/note/models/notes.py:77 apps/wrapped/models.py:60 msgid "note" msgstr "note" @@ -198,21 +204,21 @@ msgstr "Entrada para {note} en la actividad {activity}" msgid "Already entered on " msgstr "Entrado ya el " -#: apps/activity/models.py:204 apps/activity/tables.py:56 +#: apps/activity/models.py:205 apps/activity/tables.py:58 msgid "{:%Y-%m-%d %H:%M:%S}" msgstr "{:%d/%m/%Y %H:%M:%S}" -#: apps/activity/models.py:212 +#: apps/activity/models.py:213 msgid "The balance is negative." msgstr "El saldo es negativo." -#: apps/activity/models.py:242 +#: apps/activity/models.py:243 #: apps/treasury/templates/treasury/sogecredit_detail.html:14 #: apps/wei/templates/wei/attribute_bus_1A.html:16 msgid "last name" msgstr "apellido" -#: apps/activity/models.py:247 +#: apps/activity/models.py:248 #: apps/member/templates/member/includes/profile_info.html:4 #: apps/registration/templates/registration/future_profile_detail.html:16 #: apps/treasury/templates/treasury/sogecredit_detail.html:17 @@ -221,77 +227,135 @@ msgstr "apellido" msgid "first name" msgstr "nombre" -#: apps/activity/models.py:254 +#: apps/activity/models.py:253 +msgid "school" +msgstr "" + +#: apps/activity/models.py:260 msgid "inviter" msgstr "huésped" -#: apps/activity/models.py:258 +#: apps/activity/models.py:264 msgid "guest" msgstr "invitado" -#: apps/activity/models.py:259 +#: apps/activity/models.py:265 msgid "guests" msgstr "invitados" -#: apps/activity/models.py:312 +#: apps/activity/models.py:318 msgid "Invitation" msgstr "Invitación" -#: apps/activity/tables.py:27 +#: apps/activity/models.py:336 apps/activity/models.py:340 +#, fuzzy +#| msgid "opened" +msgid "Opener" +msgstr "abierto" + +#: apps/activity/models.py:341 +#: apps/activity/templates/activity/activity_detail.html:16 +#, fuzzy +#| msgid "opened" +msgid "Openers" +msgstr "abierto" + +#: apps/activity/models.py:345 +#, fuzzy, python-brace-format +#| msgid "Entry for {note} to the activity {activity}" +msgid "{opener} is opener of activity {acivity}" +msgstr "Entrada para {note} en la actividad {activity}" + +#: apps/activity/tables.py:29 msgid "The activity is currently open." msgstr "La actividad está actualmente abierta." -#: apps/activity/tables.py:28 +#: apps/activity/tables.py:30 msgid "The validation of the activity is pending." msgstr "La validación de esta actividad es pendiente." -#: apps/activity/tables.py:43 +#: apps/activity/tables.py:45 #: apps/member/templates/member/picture_update.html:18 -#: apps/treasury/tables.py:107 +#: apps/treasury/tables.py:110 msgid "Remove" msgstr "Quitar" -#: apps/activity/tables.py:56 +#: apps/activity/tables.py:58 msgid "Entered on " msgstr "Entrado el " -#: apps/activity/tables.py:58 +#: apps/activity/tables.py:60 msgid "remove" msgstr "quitar" -#: apps/activity/tables.py:82 apps/note/forms.py:68 apps/treasury/models.py:208 +#: apps/activity/tables.py:84 apps/note/forms.py:69 apps/treasury/models.py:209 msgid "Type" msgstr "Tipo" -#: apps/activity/tables.py:84 apps/member/forms.py:196 +#: apps/activity/tables.py:86 apps/member/forms.py:199 #: apps/registration/forms.py:91 apps/treasury/forms.py:131 -#: apps/wei/forms/registration.py:104 +#: apps/wei/forms/registration.py:129 msgid "Last name" msgstr "Apellido" -#: apps/activity/tables.py:86 apps/member/forms.py:201 +#: apps/activity/tables.py:88 apps/member/forms.py:204 #: apps/note/templates/note/transaction_form.html:138 #: apps/registration/forms.py:96 apps/treasury/forms.py:133 -#: apps/wei/forms/registration.py:109 +#: apps/wei/forms/registration.py:134 msgid "First name" msgstr "Nombre" -#: apps/activity/tables.py:88 apps/note/models/notes.py:86 +#: apps/activity/tables.py:90 apps/note/models/notes.py:86 msgid "Note" msgstr "Note" -#: apps/activity/tables.py:90 apps/member/tables.py:50 +#: apps/activity/tables.py:92 apps/member/tables.py:50 msgid "Balance" msgstr "Saldo de la cuenta" -#: apps/activity/templates/activity/activity_detail.html:15 +#: apps/activity/tables.py:141 apps/activity/tables.py:148 +#: apps/note/tables.py:166 apps/note/tables.py:173 apps/note/tables.py:234 +#: apps/note/tables.py:281 apps/treasury/tables.py:39 +#: apps/treasury/templates/treasury/invoice_confirm_delete.html:30 +#: apps/treasury/templates/treasury/sogecredit_detail.html:65 +#: apps/wei/tables.py:75 apps/wei/tables.py:118 +#: apps/wei/templates/wei/weiregistration_confirm_delete.html:31 +#: note_kfet/templates/oauth2_provider/application_confirm_delete.html:18 +#: note_kfet/templates/oauth2_provider/application_detail.html:39 +#: note_kfet/templates/oauth2_provider/authorized-token-delete.html:12 +msgid "Delete" +msgstr "Suprimir" + +#: apps/activity/templates/activity/activity_detail.html:24 +#: apps/member/templates/member/club_alias.html:20 +#: apps/member/templates/member/profile_alias.html:19 +#: apps/member/templates/member/profile_trust.html:19 +#: apps/treasury/tables.py:101 +#: apps/treasury/templates/treasury/sogecredit_list.html:34 +#: apps/treasury/templates/treasury/sogecredit_list.html:73 +msgid "Add" +msgstr "Añadir" + +#: apps/activity/templates/activity/activity_detail.html:35 msgid "Guests list" msgstr "Lista de los invitados" -#: apps/activity/templates/activity/activity_detail.html:33 +#: apps/activity/templates/activity/activity_detail.html:55 msgid "Guest deleted" msgstr "Invitados suprimidos" +#: apps/activity/templates/activity/activity_detail.html:99 +#, fuzzy +#| msgid "Are you sure you want to delete this token?" +msgid "Are you sure you want to delete this activity?" +msgstr "¿ Usted está seguro de querer suprimir este token ?" + +#: apps/activity/templates/activity/activity_detail.html:110 +#, fuzzy +#| msgid "Activity detail" +msgid "Activity deleted" +msgstr "Detalles de la actividad" + #: apps/activity/templates/activity/activity_entry.html:14 #: apps/note/models/transactions.py:261 #: apps/note/templates/note/transaction_form.html:17 @@ -331,17 +395,17 @@ msgid "Entry done!" msgstr "Entrada echa !" #: apps/activity/templates/activity/activity_form.html:16 -#: apps/food/templates/food/add_ingredient_form.html:16 -#: apps/food/templates/food/basicfood_form.html:16 -#: apps/food/templates/food/create_qrcode_form.html:19 -#: apps/food/templates/food/transformedfood_form.html:16 +#: apps/food/templates/food/food_update.html:17 +#: apps/food/templates/food/manage_ingredients.html:48 +#: apps/food/templates/food/qrcode.html:18 +#: apps/food/templates/food/transformedfood_update.html:45 #: apps/member/templates/member/add_members.html:46 #: apps/member/templates/member/club_form.html:16 #: apps/note/templates/note/transactiontemplate_form.html:18 #: apps/treasury/forms.py:89 apps/treasury/forms.py:143 #: apps/treasury/templates/treasury/invoice_form.html:74 #: apps/wei/templates/wei/bus_form.html:17 -#: apps/wei/templates/wei/busteam_form.html:17 +#: apps/wei/templates/wei/busteam_form.html:18 #: apps/wei/templates/wei/weiclub_form.html:17 #: apps/wei/templates/wei/weiregistration_form.html:18 msgid "Submit" @@ -397,44 +461,66 @@ msgid "edit" msgstr "modificar" #: apps/activity/templates/activity/includes/activity_info.html:74 +#: apps/logs/models.py:65 apps/note/tables.py:230 apps/note/tables.py:279 +#: apps/permission/models.py:126 apps/treasury/tables.py:38 +#: apps/wei/tables.py:74 +msgid "delete" +msgstr "suprimir" + +#: apps/activity/templates/activity/includes/activity_info.html:77 msgid "Invite" msgstr "Invitar" -#: apps/activity/views.py:37 +#: apps/activity/views.py:38 msgid "Create new activity" msgstr "Crear una nueva actividad" -#: apps/activity/views.py:67 note_kfet/templates/base.html:96 +#: apps/activity/views.py:71 note_kfet/templates/base.html:96 msgid "Activities" msgstr "Actividades" -#: apps/activity/views.py:108 +#: apps/activity/views.py:105 msgid "Activity detail" msgstr "Detalles de la actividad" -#: apps/activity/views.py:128 +#: apps/activity/views.py:150 msgid "Update activity" msgstr "Modificar la actividad" -#: apps/activity/views.py:155 +#: apps/activity/views.py:177 +#, fuzzy +#| msgid "" +#| "You are not allowed to display the entry interface for this activity." +msgid "You are not allowed to delete this activity." +msgstr "" +"Usted no tiene derecho a mostrar la interfaz de las entradas para esta " +"actividad." + +#: apps/activity/views.py:180 +#, fuzzy +#| msgid "This activity is closed." +msgid "This activity is valid." +msgstr "Esta actividad esta cerrada." + +#: apps/activity/views.py:206 msgid "Invite guest to the activity \"{}\"" msgstr "Invitar alguien para la actividad \"{}\"" -#: apps/activity/views.py:193 +#: apps/activity/views.py:246 msgid "You are not allowed to display the entry interface for this activity." msgstr "" "Usted no tiene derecho a mostrar la interfaz de las entradas para esta " "actividad." -#: apps/activity/views.py:196 +#: apps/activity/views.py:249 msgid "This activity does not support activity entries." msgstr "Esta actividad no necesita entradas." -#: apps/activity/views.py:199 +#: apps/activity/views.py:252 msgid "This activity is closed." msgstr "Esta actividad esta cerrada." -#: apps/activity/views.py:295 +#: apps/activity/views.py:357 msgid "Entry for activity \"{}\"" msgstr "Entradas para la actividad \"{}\"" @@ -442,297 +528,363 @@ msgstr "Entradas para la actividad \"{}\"" msgid "API" msgstr "API" -#: apps/food/apps.py:11 apps/food/models.py:105 +#: apps/food/apps.py:11 msgid "food" msgstr "" -#: apps/food/forms.py:32 -msgid "Fully used" -msgstr "" - -#: apps/food/forms.py:50 +#: apps/food/forms.py:49 msgid "Pasta METRO 5kg" msgstr "" -#: apps/food/forms.py:96 +#: apps/food/forms.py:53 apps/food/forms.py:81 +msgid "Specific order given to GCKs" +msgstr "" + +#: apps/food/forms.py:77 msgid "Lasagna" msgstr "" -#: apps/food/models.py:18 +#: apps/food/forms.py:116 +msgid "Shelf life (in hours)" +msgstr "" + +#: apps/food/forms.py:138 apps/food/forms.py:162 +#: apps/food/templates/food/transformedfood_update.html:25 +msgid "Fully used" +msgstr "" + +#: apps/food/forms.py:171 apps/food/templates/food/qrcode.html:29 +#: apps/food/templates/food/transformedfood_update.html:23 +#: apps/note/templates/note/transaction_form.html:132 +#: apps/treasury/models.py:61 +msgid "Name" +msgstr "Nombre" + +#: apps/food/forms.py:181 #, fuzzy #| msgid "phone number" -msgid "QR-code number" +msgid "QR code number" msgstr "número de teléfono" -#: apps/food/models.py:26 -msgid "food container" -msgstr "" - -#: apps/food/models.py:30 -msgid "QR-code" -msgstr "" - -#: apps/food/models.py:31 -msgid "QR-codes" -msgstr "" - -#: apps/food/models.py:34 -#, python-brace-format -msgid "QR-code number {qr_code_number}" -msgstr "" - -#: apps/food/models.py:47 +#: apps/food/models.py:23 msgid "Allergen" msgstr "" -#: apps/food/models.py:48 apps/food/templates/food/basicfood_detail.html:17 -#: apps/food/templates/food/transformedfood_detail.html:20 +#: apps/food/models.py:24 msgid "Allergens" msgstr "" -#: apps/food/models.py:64 +#: apps/food/models.py:43 msgid "owner" msgstr "" -#: apps/food/models.py:70 -msgid "allergen" +#: apps/food/models.py:49 +msgid "allergens" msgstr "" -#: apps/food/models.py:74 +#: apps/food/models.py:53 #, fuzzy #| msgid "birth date" msgid "expiry date" msgstr "fecha de nacimiento" -#: apps/food/models.py:80 -msgid "was eaten" +#: apps/food/models.py:59 +msgid "end of life" msgstr "" -#: apps/food/models.py:89 +#: apps/food/models.py:64 msgid "is ready" msgstr "" -#: apps/food/models.py:94 -#, fuzzy -#| msgid "active" -msgid "is active" -msgstr "activo" - -#: apps/food/models.py:106 -msgid "foods" +#: apps/food/models.py:70 +msgid "order" msgstr "" -#: apps/food/models.py:122 +#: apps/food/models.py:107 apps/food/views.py:34 +#: note_kfet/templates/base.html:72 +msgid "Food" +msgstr "" + +#: apps/food/models.py:108 +msgid "Foods" +msgstr "" + +#: apps/food/models.py:117 #, fuzzy #| msgid "invalidate" msgid "arrival date" msgstr "invalidar" -#: apps/food/models.py:152 +#: apps/food/models.py:169 msgid "Basic food" msgstr "" -#: apps/food/models.py:153 +#: apps/food/models.py:170 msgid "Basic foods" msgstr "" -#: apps/food/models.py:161 +#: apps/food/models.py:182 #, fuzzy #| msgid "created at" msgid "creation date" msgstr "creada el" -#: apps/food/models.py:169 -msgid "transformed ingredient" -msgstr "" - -#: apps/food/models.py:174 +#: apps/food/models.py:188 msgid "shelf life" msgstr "" -#: apps/food/models.py:225 apps/food/views.py:365 +#: apps/food/models.py:196 +msgid "transformed ingredient" +msgstr "" + +#: apps/food/models.py:258 #, fuzzy #| msgid "Transfer money" msgid "Transformed food" msgstr "Transferir dinero" -#: apps/food/models.py:226 +#: apps/food/models.py:259 msgid "Transformed foods" msgstr "" -#: apps/food/templates/food/basicfood_detail.html:14 -#: apps/food/templates/food/qrcode_detail.html:15 -#: apps/food/templates/food/transformedfood_detail.html:14 +#: apps/food/models.py:271 #, fuzzy -#| msgid "Owned" -msgid "Owner" -msgstr "Tenido" +#| msgid "phone number" +msgid "qr code number" +msgstr "número de teléfono" -#: apps/food/templates/food/basicfood_detail.html:15 -#, fuzzy -#| msgid "invalidate" -msgid "Arrival date" -msgstr "invalidar" - -#: apps/food/templates/food/basicfood_detail.html:16 -#: apps/food/templates/food/qrcode_detail.html:16 -#: apps/food/templates/food/transformedfood_detail.html:19 -#, fuzzy -#| msgid "birth date" -msgid "Expiry date" -msgstr "fecha de nacimiento" - -#: apps/food/templates/food/basicfood_detail.html:24 -#: apps/food/templates/food/transformedfood_detail.html:36 -#, fuzzy -#| msgid "active" -msgid "Active" -msgstr "activo" - -#: apps/food/templates/food/basicfood_detail.html:25 -#: apps/food/templates/food/transformedfood_detail.html:37 -msgid "Eaten" +#: apps/food/models.py:278 +msgid "food container" msgstr "" -#: apps/food/templates/food/basicfood_detail.html:28 -#: apps/food/templates/food/qrcode_detail.html:20 -#: apps/food/templates/food/qrcode_detail.html:24 -#: apps/food/templates/food/transformedfood_detail.html:41 +#: apps/food/models.py:282 +msgid "QR-code" +msgstr "" + +#: apps/food/models.py:283 +msgid "QR-codes" +msgstr "" + +#: apps/food/models.py:286 +#: apps/food/templates/food/transformedfood_update.html:24 +#, fuzzy +#| msgid "phone number" +msgid "QR-code number" +msgstr "número de teléfono" + +#: apps/food/templates/food/food_detail.html:19 +msgid "Contained in" +msgstr "" + +#: apps/food/templates/food/food_detail.html:26 +msgid "Contain" +msgstr "" + +#: apps/food/templates/food/food_detail.html:35 #, fuzzy #| msgid "Update bus" msgid "Update" msgstr "Modificar el bus" -#: apps/food/templates/food/basicfood_detail.html:32 -#: apps/food/templates/food/qrcode_detail.html:34 -#: apps/food/templates/food/transformedfood_detail.html:46 +#: apps/food/templates/food/food_detail.html:40 #, fuzzy #| msgid "Add team" msgid "Add to a meal" msgstr "Añadir un equipo" -#: apps/food/templates/food/create_qrcode_form.html:14 +#: apps/food/templates/food/food_detail.html:45 #, fuzzy -#| msgid "Transfer money" -msgid "New basic food" -msgstr "Transferir dinero" +#| msgid "manage entries" +msgid "Manage ingredients" +msgstr "gestionar las entradas" -#: apps/food/templates/food/qrcode_detail.html:10 +#: apps/food/templates/food/food_detail.html:49 #, fuzzy -#| msgid "phone number" -msgid "number" -msgstr "número de teléfono" +#| msgid "Return to credit list" +msgid "Return to the food list" +msgstr "Regresar a la lista de los créditos" -#: apps/food/templates/food/qrcode_detail.html:14 -#: apps/note/templates/note/transaction_form.html:132 -#: apps/treasury/models.py:60 -msgid "Name" -msgstr "Nombre" - -#: apps/food/templates/food/qrcode_detail.html:29 -#, fuzzy -#| msgid "Profile detail" -msgid "View details" -msgstr "Detalles del usuario" - -#: apps/food/templates/food/transformedfood_detail.html:16 -#: apps/food/templates/food/transformedfood_detail.html:35 -msgid "Ready" -msgstr "" - -#: apps/food/templates/food/transformedfood_detail.html:18 -#, fuzzy -#| msgid "created at" -msgid "Creation date" -msgstr "creada el" - -#: apps/food/templates/food/transformedfood_detail.html:27 -msgid "Ingredients" -msgstr "" - -#: apps/food/templates/food/transformedfood_detail.html:34 -msgid "Shelf life" -msgstr "" - -#: apps/food/templates/food/transformedfood_list.html:11 +#: apps/food/templates/food/food_list.html:14 msgid "Meal served" msgstr "" -#: apps/food/templates/food/transformedfood_list.html:16 +#: apps/food/templates/food/food_list.html:19 #, fuzzy #| msgid "New user" msgid "New meal" msgstr "Nuevo usuario" -#: apps/food/templates/food/transformedfood_list.html:25 +#: apps/food/templates/food/food_list.html:28 #, fuzzy #| msgid "There is no results." msgid "There is no meal served." msgstr "No hay resultado." -#: apps/food/templates/food/transformedfood_list.html:33 -msgid "Open" +#: apps/food/templates/food/food_list.html:35 +msgid "Free food" msgstr "" -#: apps/food/templates/food/transformedfood_list.html:40 +#: apps/food/templates/food/food_list.html:42 #, fuzzy #| msgid "There is no results." -msgid "There is no free meal." +msgid "There is no free food." msgstr "No hay resultado." -#: apps/food/templates/food/transformedfood_list.html:48 -msgid "All meals" +#: apps/food/templates/food/food_list.html:50 +#, fuzzy +#| msgid "for club" +msgid "Food of your clubs" +msgstr "interesa el club" + +#: apps/food/templates/food/food_list.html:56 +#, fuzzy +#| msgid "for club" +msgid "Food of club" +msgstr "interesa el club" + +#: apps/food/templates/food/food_list.html:63 +msgid "Yours club has not food yet." msgstr "" -#: apps/food/templates/food/transformedfood_list.html:55 +#: apps/food/templates/food/manage_ingredients.html:45 +#: apps/food/templates/food/transformedfood_update.html:42 #, fuzzy -#| msgid "There is no results." -msgid "There is no meal." -msgstr "No hay resultado." +#| msgid "Add friends" +msgid "Add ingredient" +msgstr "Añadir amig@s" -#: apps/food/views.py:28 -msgid "Add the ingredient" +#: apps/food/templates/food/manage_ingredients.html:46 +#: apps/food/templates/food/transformedfood_update.html:43 +#, fuzzy +#| msgid "Remove product" +msgid "Remove ingredient" +msgstr "Quitar un producto" + +#: apps/food/templates/food/qrcode.html:22 +msgid "Copy constructor" msgstr "" -#: apps/food/views.py:42 +#: apps/food/templates/food/qrcode.html:23 #, fuzzy -#| msgid "This credit is already validated." -msgid "The product is already prepared" -msgstr "Este crédito ya fue validado." +#| msgid "Transfer money" +msgid "New food" +msgstr "Transferir dinero" -#: apps/food/views.py:70 +#: apps/food/templates/food/qrcode.html:32 +#, fuzzy +#| msgid "Owned" +msgid "Owner" +msgstr "Tenido" + +#: apps/food/templates/food/qrcode.html:35 +#, fuzzy +#| msgid "birth date" +msgid "Expiry date" +msgstr "fecha de nacimiento" + +#: apps/food/utils.py:6 +msgid "second" +msgstr "" + +#: apps/food/utils.py:6 +msgid "seconds" +msgstr "" + +#: apps/food/utils.py:7 +msgid "minute" +msgstr "" + +#: apps/food/utils.py:7 +msgid "minutes" +msgstr "" + +#: apps/food/utils.py:8 +msgid "hour" +msgstr "" + +#: apps/food/utils.py:8 +msgid "hours" +msgstr "" + +#: apps/food/utils.py:9 +#, fuzzy +#| msgid "days" +msgid "day" +msgstr "días" + +#: apps/food/utils.py:9 apps/member/templates/member/includes/club_info.html:27 +msgid "days" +msgstr "días" + +#: apps/food/utils.py:10 +msgid "week" +msgstr "" + +#: apps/food/utils.py:10 +msgid "weeks" +msgstr "" + +#: apps/food/utils.py:53 +#, fuzzy +#| msgid "add" +msgid "and" +msgstr "añadir" + +#: apps/food/views.py:118 +msgid "Add a new QRCode" +msgstr "" + +#: apps/food/views.py:167 +#, fuzzy +#| msgid "Update an invoice" +msgid "Add an aliment" +msgstr "Modificar una factura" + +#: apps/food/views.py:235 +#, fuzzy +#| msgid "Add team" +msgid "Add a meal" +msgstr "Añadir un equipo" + +#: apps/food/views.py:275 +#, fuzzy +#| msgid "manage entries" +msgid "Manage ingredients of:" +msgstr "gestionar las entradas" + +#: apps/food/views.py:289 apps/food/views.py:297 +#, python-brace-format +msgid "Fully used in {meal}" +msgstr "" + +#: apps/food/views.py:344 +msgid "Add the ingredient:" +msgstr "" + +#: apps/food/views.py:370 +#, python-brace-format +msgid "Food fully used in : {meal.name}" +msgstr "" + +#: apps/food/views.py:389 #, fuzzy #| msgid "Update an invoice" msgid "Update an aliment" msgstr "Modificar una factura" -#: apps/food/views.py:97 +#: apps/food/views.py:437 #, fuzzy #| msgid "WEI Detail" msgid "Details of:" msgstr "Detalles del WEI" -#: apps/food/views.py:121 -msgid "Add a new basic food with QRCode" -msgstr "" +#: apps/food/views.py:447 apps/treasury/tables.py:149 +msgid "Yes" +msgstr "Sí" -#: apps/food/views.py:185 -msgid "Add a new QRCode" -msgstr "" - -#: apps/food/views.py:235 -msgid "QRCode" -msgstr "" - -#: apps/food/views.py:271 -msgid "Add a new meal" -msgstr "" - -#: apps/food/views.py:337 -#, fuzzy -#| msgid "Update team" -msgid "Update a meal" -msgstr "Modificar el equipo" +#: apps/food/views.py:449 apps/member/models.py:99 apps/treasury/tables.py:149 +msgid "No" +msgstr "No" #: apps/logs/apps.py:11 msgid "Logs" @@ -762,12 +914,6 @@ msgstr "nuevos datos" msgid "create" msgstr "crear" -#: apps/logs/models.py:65 apps/note/tables.py:230 apps/note/tables.py:277 -#: apps/permission/models.py:126 apps/treasury/tables.py:38 -#: apps/wei/tables.py:74 -msgid "delete" -msgstr "suprimir" - #: apps/logs/models.py:68 msgid "action" msgstr "acción" @@ -803,11 +949,11 @@ msgstr "pago de afiliación (estudiantes pagados)" msgid "membership fee (unpaid students)" msgstr "pago de afiliación (estudiantes no pagados)" -#: apps/member/admin.py:65 apps/member/models.py:330 +#: apps/member/admin.py:65 apps/member/models.py:337 msgid "roles" msgstr "papel" -#: apps/member/admin.py:66 apps/member/models.py:344 +#: apps/member/admin.py:66 apps/member/models.py:351 msgid "fee" msgstr "pago" @@ -815,25 +961,25 @@ msgstr "pago" msgid "member" msgstr "miembro" -#: apps/member/forms.py:24 +#: apps/member/forms.py:25 msgid "Permission mask" msgstr "Antifaz de permisos" -#: apps/member/forms.py:46 +#: apps/member/forms.py:48 msgid "Report frequency" msgstr "Frecuencia de los informes (en días)" -#: apps/member/forms.py:48 +#: apps/member/forms.py:50 msgid "Last report date" msgstr "Fecha del último informe" -#: apps/member/forms.py:52 +#: apps/member/forms.py:54 msgid "" "Anti-VSS (Violences Sexistes et Sexuelles) charter read and approved" msgstr "" "Carta Anti-VSS (Violences Sexistes et Sexuelles) leída y aprobada" -#: apps/member/forms.py:53 +#: apps/member/forms.py:55 msgid "" "Tick after having read and accepted the anti-VSS charter " @@ -843,65 +989,65 @@ msgstr "" "perso.crans.org/club-bde/Charte-anti-VSS.pdf target=_blank> disponible en " "pdf aquí" -#: apps/member/forms.py:60 +#: apps/member/forms.py:62 msgid "You can't register to the note if you come from the future." msgstr "Usted no puede registrar si viene del futuro." -#: apps/member/forms.py:86 +#: apps/member/forms.py:89 msgid "select an image" msgstr "elegir una imagen" -#: apps/member/forms.py:87 +#: apps/member/forms.py:90 msgid "Maximal size: 2MB" msgstr "Tamaño máximo : 2Mo" -#: apps/member/forms.py:112 +#: apps/member/forms.py:115 msgid "This image cannot be loaded." msgstr "Esta imagen no puede ser cargada." -#: apps/member/forms.py:151 apps/member/views.py:102 -#: apps/registration/forms.py:33 apps/registration/views.py:276 +#: apps/member/forms.py:154 apps/member/views.py:117 +#: apps/registration/forms.py:33 apps/registration/views.py:282 msgid "An alias with a similar name already exists." msgstr "Un alias similar ya existe." -#: apps/member/forms.py:175 +#: apps/member/forms.py:178 msgid "Inscription paid by Société Générale" msgstr "Registración pagadas por Société Générale" -#: apps/member/forms.py:177 +#: apps/member/forms.py:180 msgid "Check this case if the Société Générale paid the inscription." msgstr "Marcar esta casilla si Société Générale pagó la registración." -#: apps/member/forms.py:182 apps/registration/forms.py:78 -#: apps/wei/forms/registration.py:91 +#: apps/member/forms.py:185 apps/registration/forms.py:78 +#: apps/wei/forms/registration.py:116 msgid "Credit type" msgstr "Tipo de crédito" -#: apps/member/forms.py:183 apps/registration/forms.py:79 -#: apps/wei/forms/registration.py:92 +#: apps/member/forms.py:186 apps/registration/forms.py:79 +#: apps/wei/forms/registration.py:117 msgid "No credit" msgstr "No crédito" -#: apps/member/forms.py:185 +#: apps/member/forms.py:188 msgid "You can credit the note of the user." msgstr "Usted puede acreditar la note del usuario." -#: apps/member/forms.py:189 apps/registration/forms.py:84 -#: apps/wei/forms/registration.py:97 +#: apps/member/forms.py:192 apps/registration/forms.py:84 +#: apps/wei/forms/registration.py:122 msgid "Credit amount" msgstr "Valor del crédito" -#: apps/member/forms.py:206 apps/note/templates/note/transaction_form.html:144 +#: apps/member/forms.py:209 apps/note/templates/note/transaction_form.html:144 #: apps/registration/forms.py:101 apps/treasury/forms.py:135 -#: apps/wei/forms/registration.py:114 +#: apps/wei/forms/registration.py:139 msgid "Bank" msgstr "Banco" -#: apps/member/forms.py:233 +#: apps/member/forms.py:236 msgid "User" msgstr "Usuario" -#: apps/member/forms.py:247 +#: apps/member/forms.py:250 msgid "Roles" msgstr "Papeles" @@ -1034,10 +1180,6 @@ msgstr "pagado" msgid "Tells if the user receive a salary." msgstr "Indica si el usuario percibe un salario." -#: apps/member/models.py:99 apps/treasury/tables.py:143 -msgid "No" -msgstr "No" - #: apps/member/models.py:100 msgid "Yes (receive them in french)" msgstr "Si (recibirles en francés)" @@ -1102,7 +1244,7 @@ msgstr "Active su cuenta Note Kfet" #: apps/member/templates/member/includes/club_info.html:55 #: apps/member/templates/member/includes/profile_info.html:40 #: apps/registration/templates/registration/future_profile_detail.html:22 -#: apps/wei/templates/wei/base.html:70 +#: apps/wei/templates/wei/base.html:68 #: apps/wei/templates/wei/weimembership_form.html:20 msgid "email" msgstr "correo electrónico" @@ -1154,8 +1296,8 @@ msgstr "" msgid "add to registration form" msgstr "Validar la afiliación" -#: apps/member/models.py:268 apps/member/models.py:324 -#: apps/note/models/notes.py:176 +#: apps/member/models.py:268 apps/member/models.py:331 +#: apps/note/models/notes.py:176 apps/wei/models.py:86 msgid "club" msgstr "club" @@ -1163,37 +1305,37 @@ msgstr "club" msgid "clubs" msgstr "clubs" -#: apps/member/models.py:335 +#: apps/member/models.py:342 msgid "membership starts on" msgstr "afiliación empezá el" -#: apps/member/models.py:339 +#: apps/member/models.py:346 msgid "membership ends on" msgstr "afiliación termina el" -#: apps/member/models.py:348 apps/note/models/transactions.py:385 +#: apps/member/models.py:355 apps/note/models/transactions.py:385 msgid "membership" msgstr "afiliación" -#: apps/member/models.py:349 +#: apps/member/models.py:356 msgid "memberships" msgstr "afiliaciones" -#: apps/member/models.py:353 +#: apps/member/models.py:360 #, python-brace-format msgid "Membership of {user} for the club {club}" msgstr "Afiliación of {user} for the club {club}" -#: apps/member/models.py:372 +#: apps/member/models.py:379 #, python-brace-format msgid "The role {role} does not apply to the club {club}." msgstr "El papel {role} no se encuentra en el club {club}." -#: apps/member/models.py:381 apps/member/views.py:715 +#: apps/member/models.py:388 apps/member/views.py:759 msgid "User is already a member of the club" msgstr "Usuario ya esta un miembro del club" -#: apps/member/models.py:393 apps/member/views.py:724 +#: apps/member/models.py:400 apps/member/views.py:768 msgid "User is not a member of the parent club" msgstr "Usuario no es un miembro del club pariente" @@ -1245,7 +1387,7 @@ msgid "Account #" msgstr "Cuenta n°" #: apps/member/templates/member/base.html:48 -#: apps/member/templates/member/base.html:62 apps/member/views.py:59 +#: apps/member/templates/member/base.html:62 apps/member/views.py:61 #: apps/registration/templates/registration/future_profile_detail.html:48 #: apps/wei/templates/wei/weimembership_form.html:117 msgid "Update Profile" @@ -1306,20 +1448,11 @@ msgstr "" "nuevo posibles." #: apps/member/templates/member/club_alias.html:10 -#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:287 -#: apps/member/views.py:520 +#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:318 +#: apps/member/views.py:559 msgid "Note aliases" msgstr "Alias de la note" -#: apps/member/templates/member/club_alias.html:20 -#: apps/member/templates/member/profile_alias.html:19 -#: apps/member/templates/member/profile_trust.html:19 -#: apps/treasury/tables.py:99 -#: apps/treasury/templates/treasury/sogecredit_list.html:34 -#: apps/treasury/templates/treasury/sogecredit_list.html:73 -msgid "Add" -msgstr "Añadir" - #: apps/member/templates/member/club_detail.html:13 #: apps/permission/templates/permission/all_rights.html:32 msgid "Club managers" @@ -1356,10 +1489,6 @@ msgstr "No hay afiliación encontrada con esta entrada." msgid "Club Parent" msgstr "Club pariente" -#: apps/member/templates/member/includes/club_info.html:27 -msgid "days" -msgstr "días" - #: apps/member/templates/member/includes/club_info.html:31 #: apps/wei/templates/wei/base.html:40 msgid "membership fee" @@ -1368,13 +1497,13 @@ msgstr "pago de afiliación" #: apps/member/templates/member/includes/club_info.html:43 #: apps/member/templates/member/includes/profile_info.html:55 #: apps/treasury/templates/treasury/sogecredit_detail.html:24 -#: apps/wei/templates/wei/base.html:60 +#: apps/wei/templates/wei/base.html:58 msgid "balance" msgstr "saldo de la cuenta" #: apps/member/templates/member/includes/club_info.html:47 #: apps/member/templates/member/includes/profile_info.html:20 -#: apps/note/models/notes.py:287 apps/wei/templates/wei/base.html:66 +#: apps/note/models/notes.py:287 apps/wei/templates/wei/base.html:64 msgid "aliases" msgstr "alias" @@ -1455,11 +1584,11 @@ msgstr "Introspección :" msgid "Show my applications" msgstr "Mostrar mis aplicaciones" -#: apps/member/templates/member/picture_update.html:38 +#: apps/member/templates/member/picture_update.html:40 msgid "Nevermind" msgstr "No importa" -#: apps/member/templates/member/picture_update.html:39 +#: apps/member/templates/member/picture_update.html:41 msgid "Crop and upload" msgstr "Podar y subir" @@ -1508,51 +1637,51 @@ msgstr "Guardar cambios" msgid "Registrations" msgstr "Registraciones" -#: apps/member/views.py:72 apps/registration/forms.py:23 +#: apps/member/views.py:74 apps/registration/forms.py:23 msgid "This address must be valid." msgstr "Este correo tiene que ser valido." -#: apps/member/views.py:139 +#: apps/member/views.py:154 msgid "Profile detail" msgstr "Detalles del usuario" -#: apps/member/views.py:205 +#: apps/member/views.py:220 msgid "Search user" msgstr "Buscar un usuario" -#: apps/member/views.py:253 +#: apps/member/views.py:272 msgid "Note friendships" msgstr "Amistades de note" -#: apps/member/views.py:308 +#: apps/member/views.py:342 msgid "Update note picture" msgstr "Modificar la imagen de la note" -#: apps/member/views.py:357 +#: apps/member/views.py:391 msgid "Manage auth token" msgstr "Gestionar los token de autentificación" -#: apps/member/views.py:384 +#: apps/member/views.py:418 msgid "Create new club" msgstr "Crear un nuevo club" -#: apps/member/views.py:403 +#: apps/member/views.py:437 msgid "Search club" msgstr "Buscar un club" -#: apps/member/views.py:436 +#: apps/member/views.py:475 msgid "Club detail" msgstr "Detalles del club" -#: apps/member/views.py:543 +#: apps/member/views.py:587 msgid "Update club" msgstr "Modificar el club" -#: apps/member/views.py:577 +#: apps/member/views.py:621 msgid "Add new member to the club" msgstr "Añadir un nuevo miembro al club" -#: apps/member/views.py:706 apps/wei/views.py:973 +#: apps/member/views.py:750 msgid "" "This user don't have enough money to join this club, and can't have a " "negative balance." @@ -1560,19 +1689,19 @@ msgstr "" "Este usuario no tiene suficiente dinero para unirse a este club, y no puede " "tener un saldo negativo." -#: apps/member/views.py:728 +#: apps/member/views.py:772 msgid "The membership must start after {:%m-%d-%Y}." msgstr "La afiliación tiene que empezar después del {:%d-%m-%Y}." -#: apps/member/views.py:733 +#: apps/member/views.py:777 msgid "The membership must begin before {:%m-%d-%Y}." msgstr "La afiliación tiene que empezar antes del {:%d-%m-%Y}." -#: apps/member/views.py:883 +#: apps/member/views.py:927 msgid "Manage roles of an user in the club" msgstr "Gestionar los papeles de un usuario en el club" -#: apps/member/views.py:908 +#: apps/member/views.py:952 msgid "Members of the club" msgstr "Miembros del club" @@ -1605,35 +1734,35 @@ msgstr "" "La transacción no puede ser guardada puesto que la note fuente o la note " "destino no esta activa." -#: apps/note/forms.py:39 +#: apps/note/forms.py:40 msgid "Source" msgstr "Fuente" -#: apps/note/forms.py:53 +#: apps/note/forms.py:54 msgid "Destination" msgstr "Destino" -#: apps/note/forms.py:74 apps/note/templates/note/transaction_form.html:123 +#: apps/note/forms.py:75 apps/note/templates/note/transaction_form.html:123 msgid "Reason" msgstr "Motivo" -#: apps/note/forms.py:79 apps/treasury/tables.py:136 +#: apps/note/forms.py:80 apps/treasury/tables.py:141 msgid "Valid" msgstr "Valido" -#: apps/note/forms.py:85 +#: apps/note/forms.py:86 msgid "Total amount greater than" msgstr "Monto total mayor que" -#: apps/note/forms.py:93 +#: apps/note/forms.py:94 msgid "Total amount less than" msgstr "Monto total menor que" -#: apps/note/forms.py:99 +#: apps/note/forms.py:100 msgid "Created after" msgstr "Creado después" -#: apps/note/forms.py:106 +#: apps/note/forms.py:107 msgid "Created before" msgstr "Creado antes" @@ -1739,7 +1868,7 @@ msgstr "amigo" #: apps/note/models/notes.py:243 #, fuzzy #| msgid "friendships" -msgid "friendship" +msgid "frienship" msgstr "amistades" #: apps/note/models/notes.py:248 @@ -1888,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:978 -#: apps/wei/views.py:982 +#: apps/note/models/transactions.py:363 apps/wei/views.py:1097 +#: apps/wei/views.py:1101 msgid "This field is required." msgstr "Este campo es obligatorio." @@ -1897,7 +2026,7 @@ msgstr "Este campo es obligatorio." msgid "membership transaction" msgstr "transacción de afiliación" -#: apps/note/models/transactions.py:381 apps/treasury/models.py:300 +#: apps/note/models/transactions.py:381 apps/treasury/models.py:301 msgid "membership transactions" msgstr "transacciones de afiliación" @@ -1913,18 +2042,6 @@ msgstr "Hacer clic para validar" msgid "No reason specified" msgstr "Ningún motivo dado" -#: apps/note/tables.py:166 apps/note/tables.py:173 apps/note/tables.py:234 -#: apps/note/tables.py:279 apps/treasury/tables.py:39 -#: apps/treasury/templates/treasury/invoice_confirm_delete.html:30 -#: apps/treasury/templates/treasury/sogecredit_detail.html:65 -#: apps/wei/tables.py:75 apps/wei/tables.py:118 -#: apps/wei/templates/wei/weiregistration_confirm_delete.html:31 -#: note_kfet/templates/oauth2_provider/application_confirm_delete.html:18 -#: note_kfet/templates/oauth2_provider/application_detail.html:39 -#: note_kfet/templates/oauth2_provider/authorized-token-delete.html:12 -msgid "Delete" -msgstr "Suprimir" - #: apps/note/tables.py:191 msgid "Trust back" msgstr "Añadir como amig@" @@ -1935,15 +2052,15 @@ msgstr "Añadir en retorno" #: apps/note/tables.py:262 apps/note/templates/note/conso_form.html:151 #: apps/wei/tables.py:49 apps/wei/tables.py:50 -#: apps/wei/templates/wei/base.html:89 -#: apps/wei/templates/wei/bus_detail.html:20 +#: apps/wei/templates/wei/base.html:87 +#: apps/wei/templates/wei/bus_detail.html:24 #: apps/wei/templates/wei/busteam_detail.html:20 -#: apps/wei/templates/wei/busteam_detail.html:40 +#: apps/wei/templates/wei/busteam_detail.html:42 #: note_kfet/templates/oauth2_provider/application_detail.html:38 msgid "Edit" msgstr "Editar" -#: apps/note/tables.py:266 apps/note/tables.py:293 +#: apps/note/tables.py:267 apps/note/tables.py:296 msgid "Hide/Show" msgstr "Ocultar/Mostrar" @@ -2029,8 +2146,8 @@ msgid "Action" msgstr "Acción" #: apps/note/templates/note/transaction_form.html:116 -#: apps/treasury/forms.py:137 apps/treasury/tables.py:67 -#: apps/treasury/tables.py:132 +#: apps/treasury/forms.py:137 apps/treasury/tables.py:68 +#: apps/treasury/tables.py:136 #: apps/treasury/templates/treasury/remittance_form.html:23 msgid "Amount" msgstr "Monto" @@ -2092,34 +2209,35 @@ msgid "Button displayed" msgstr "Botón mostrado" #: apps/note/templates/note/transactiontemplate_list.html:100 +#: apps/wrapped/templates/wrapped/wrapped_list.html:70 msgid "An error occured" msgstr "Un error ocurrió" -#: apps/note/views.py:36 +#: apps/note/views.py:37 msgid "Transfer money" msgstr "Transferir dinero" -#: apps/note/views.py:74 +#: apps/note/views.py:75 msgid "Create new button" msgstr "Crear un nuevo botón" -#: apps/note/views.py:83 +#: apps/note/views.py:84 msgid "Search button" msgstr "Buscar un botón" -#: apps/note/views.py:111 +#: apps/note/views.py:116 msgid "Update button" msgstr "Modificar el botón" -#: apps/note/views.py:151 note_kfet/templates/base.html:66 +#: apps/note/views.py:156 note_kfet/templates/base.html:66 msgid "Consumptions" msgstr "Consumiciones" -#: apps/note/views.py:165 +#: apps/note/views.py:170 msgid "You can't see any button." msgstr "Usted no puede ver ningún botón." -#: apps/note/views.py:204 +#: apps/note/views.py:209 msgid "Search transactions" msgstr "Buscar transacciones" @@ -2213,7 +2331,7 @@ msgstr "" "Usted no tiene permiso a cambiar el campo {field} on this instance of model " "{app_label}.{model_name}." -#: apps/permission/signals.py:83 apps/permission/views.py:105 +#: apps/permission/signals.py:83 apps/permission/views.py:104 #, python-brace-format msgid "" "You don't have the permission to add an instance of model {app_label}." @@ -2292,25 +2410,25 @@ msgstr "Pulsar aquí" msgid "if you want to register a new one" msgstr "si quiere crear una nueva" -#: apps/permission/views.py:72 +#: apps/permission/views.py:71 #, python-brace-format msgid "" "You don't have the permission to update this instance of the model " "\"{model}\" with these parameters. Please correct your data and retry." msgstr "" -#: apps/permission/views.py:76 +#: apps/permission/views.py:75 #, python-brace-format msgid "" "You don't have the permission to create an instance of the model \"{model}\" " "with these parameters. Please correct your data and retry." msgstr "" -#: apps/permission/views.py:112 note_kfet/templates/base.html:114 +#: apps/permission/views.py:111 note_kfet/templates/base.html:120 msgid "Rights" msgstr "Permisos" -#: apps/permission/views.py:117 +#: apps/permission/views.py:137 msgid "All rights" msgstr "Todos los permisos" @@ -2397,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:186 +#: apps/wei/templates/wei/weimembership_form.html:196 msgid "Validate registration" msgstr "Validar la afiliación" @@ -2447,60 +2565,68 @@ msgstr "Gracias" msgid "The Note Kfet team." msgstr "El equipo Note Kfet." -#: apps/registration/views.py:42 +#: apps/registration/views.py:43 msgid "Register new user" msgstr "Registrar un nuevo usuario" -#: apps/registration/views.py:100 +#: apps/registration/views.py:101 msgid "Email validation" msgstr "Validación del correo electrónico" -#: apps/registration/views.py:102 +#: apps/registration/views.py:103 msgid "Validate email" msgstr "Validar el correo electrónico" -#: apps/registration/views.py:146 +#: apps/registration/views.py:147 msgid "Email validation unsuccessful" msgstr "La validación del correo electrónico fracasó" -#: apps/registration/views.py:157 +#: apps/registration/views.py:158 msgid "Email validation email sent" msgstr "Correo de validación enviado" -#: apps/registration/views.py:165 +#: apps/registration/views.py:166 msgid "Resend email validation link" msgstr "Reenviar el enlace de validación" -#: apps/registration/views.py:183 +#: apps/registration/views.py:184 msgid "Pre-registered users list" msgstr "Lista de los usuarios con afiliación pendiente" -#: apps/registration/views.py:207 +#: apps/registration/views.py:213 msgid "Unregistered users" msgstr "Usuarios con afiliación pendiente" -#: apps/registration/views.py:220 +#: apps/registration/views.py:226 msgid "Registration detail" msgstr "Detalles de la afiliación" -#: apps/registration/views.py:256 +#: apps/registration/views.py:262 #, fuzzy, python-format #| msgid "Note of %(club)s club" msgid "Join %(club)s Club" msgstr "Note del club %(club)s" -#: apps/registration/views.py:299 -msgid "You must join the BDE." +#: apps/registration/views.py:305 +#, fuzzy +#| msgid "You must join the BDE." +msgid "You must join a club." msgstr "Usted tiene que afiliarse al BDE." -#: apps/registration/views.py:330 +#: apps/registration/views.py:309 +#, fuzzy +#| msgid "You must join the BDE." +msgid "You must also join the parent club BDE." +msgstr "Usted tiene que afiliarse al BDE." + +#: apps/registration/views.py:340 msgid "" "The entered amount is not enough for the memberships, should be at least {}" msgstr "" "El monto dado no es suficiente para las afiliaciones, tiene que ser al menos " "{}" -#: apps/registration/views.py:425 +#: apps/registration/views.py:435 msgid "Invalidate pre-registration" msgstr "Invalidar la afiliación" @@ -2508,7 +2634,7 @@ msgstr "Invalidar la afiliación" msgid "Treasury" msgstr "Tesorería" -#: apps/treasury/forms.py:26 apps/treasury/models.py:112 +#: apps/treasury/forms.py:26 apps/treasury/models.py:113 #: apps/treasury/templates/treasury/invoice_form.html:22 msgid "This invoice is locked and can no longer be edited." msgstr "Esta factura esta bloqueada y no puede ser modificada." @@ -2521,8 +2647,8 @@ msgstr "El descuento ya esta cerrado." msgid "You can't change the type of the remittance." msgstr "No puede cambiar el tipo de descuento." -#: apps/treasury/forms.py:125 apps/treasury/models.py:275 -#: apps/treasury/tables.py:97 apps/treasury/tables.py:105 +#: apps/treasury/forms.py:125 apps/treasury/models.py:276 +#: apps/treasury/tables.py:99 apps/treasury/tables.py:108 #: apps/treasury/templates/treasury/invoice_list.html:16 #: apps/treasury/templates/treasury/remittance_list.html:16 #: apps/treasury/templates/treasury/sogecredit_list.html:17 @@ -2537,142 +2663,143 @@ msgstr "No hay descuento relacionado" msgid "Invoice identifier" msgstr "Numero de factura" -#: apps/treasury/models.py:42 +#: apps/treasury/models.py:43 apps/wrapped/models.py:28 +#: apps/wrapped/models.py:29 msgid "BDE" msgstr "BDE" -#: apps/treasury/models.py:46 +#: apps/treasury/models.py:47 #, fuzzy #| msgid "location" msgid "Quotation" msgstr "ubicación" -#: apps/treasury/models.py:51 +#: apps/treasury/models.py:52 msgid "Object" msgstr "Asunto" -#: apps/treasury/models.py:55 +#: apps/treasury/models.py:56 msgid "Description" msgstr "Descripción" -#: apps/treasury/models.py:64 +#: apps/treasury/models.py:65 msgid "Address" msgstr "Dirección" -#: apps/treasury/models.py:69 apps/treasury/models.py:202 +#: apps/treasury/models.py:70 apps/treasury/models.py:203 msgid "Date" msgstr "Fecha" -#: apps/treasury/models.py:75 +#: apps/treasury/models.py:76 #, fuzzy #| msgid "end date" msgid "Payment date" msgstr "fecha de fin" -#: apps/treasury/models.py:79 +#: apps/treasury/models.py:80 msgid "Acquitted" msgstr "Pagada" -#: apps/treasury/models.py:84 +#: apps/treasury/models.py:85 msgid "Locked" msgstr "Bloqueada" -#: apps/treasury/models.py:85 +#: apps/treasury/models.py:86 msgid "An invoice can't be edited when it is locked." msgstr "Une factura no puede ser modificada cuando esta bloqueada." -#: apps/treasury/models.py:91 +#: apps/treasury/models.py:92 msgid "tex source" msgstr "código fuente TeX" -#: apps/treasury/models.py:95 apps/treasury/models.py:140 +#: apps/treasury/models.py:96 apps/treasury/models.py:141 msgid "invoice" msgstr "factura" -#: apps/treasury/models.py:96 +#: apps/treasury/models.py:97 msgid "invoices" msgstr "facturas" -#: apps/treasury/models.py:99 +#: apps/treasury/models.py:100 #, python-brace-format msgid "Invoice #{id}" msgstr "Factura n°{id}" -#: apps/treasury/models.py:145 +#: apps/treasury/models.py:146 msgid "Designation" msgstr "Designación" -#: apps/treasury/models.py:151 +#: apps/treasury/models.py:152 msgid "Quantity" msgstr "Cantidad" -#: apps/treasury/models.py:156 +#: apps/treasury/models.py:157 msgid "Unit price" msgstr "Precio unitario" -#: apps/treasury/models.py:160 +#: apps/treasury/models.py:161 msgid "product" msgstr "producto" -#: apps/treasury/models.py:161 +#: apps/treasury/models.py:162 msgid "products" msgstr "productos" -#: apps/treasury/models.py:189 +#: apps/treasury/models.py:190 msgid "remittance type" msgstr "tipo de descuento" -#: apps/treasury/models.py:190 +#: apps/treasury/models.py:191 msgid "remittance types" msgstr "tipos de descuentos" -#: apps/treasury/models.py:213 +#: apps/treasury/models.py:214 msgid "Comment" msgstr "Comentario" -#: apps/treasury/models.py:218 +#: apps/treasury/models.py:219 msgid "Closed" msgstr "Cerrada" -#: apps/treasury/models.py:222 +#: apps/treasury/models.py:223 msgid "remittance" msgstr "descuento" -#: apps/treasury/models.py:223 +#: apps/treasury/models.py:224 msgid "remittances" msgstr "descuentos" -#: apps/treasury/models.py:226 +#: apps/treasury/models.py:227 msgid "Remittance #{:d}: {}" msgstr "Descuento n°{:d} : {}" -#: apps/treasury/models.py:279 +#: apps/treasury/models.py:280 msgid "special transaction proxy" msgstr "proxy de transacción especial" -#: apps/treasury/models.py:280 +#: apps/treasury/models.py:281 msgid "special transaction proxies" msgstr "proxys de transacciones especiales" -#: apps/treasury/models.py:306 +#: apps/treasury/models.py:307 msgid "credit transaction" msgstr "transacción de crédito" -#: apps/treasury/models.py:311 +#: apps/treasury/models.py:312 #: apps/treasury/templates/treasury/sogecredit_detail.html:10 msgid "Credit from the Société générale" msgstr "Crédito de la Société Générale" -#: apps/treasury/models.py:312 +#: apps/treasury/models.py:313 msgid "Credits from the Société générale" msgstr "Créditos de la Société Générale" -#: apps/treasury/models.py:315 +#: apps/treasury/models.py:316 #, python-brace-format msgid "Soge credit for {user}" msgstr "Crédito de la Société Générale para {user}" -#: apps/treasury/models.py:445 +#: apps/treasury/models.py:446 msgid "" "This user doesn't have enough money to pay the memberships with its note. " "Please ask her/him to credit the note before invalidating this credit." @@ -2692,25 +2819,22 @@ msgstr "Factura n°{:d}" msgid "Invoice" msgstr "Factura" -#: apps/treasury/tables.py:65 +#: apps/treasury/tables.py:66 msgid "Transaction count" msgstr "Cantidad de transacciones" -#: apps/treasury/tables.py:70 apps/treasury/tables.py:72 +#: apps/treasury/tables.py:71 apps/treasury/tables.py:73 +#: apps/wei/templates/wei/busteam_detail.html:22 apps/wrapped/tables.py:42 msgid "View" msgstr "Ver" -#: apps/treasury/tables.py:143 -msgid "Yes" -msgstr "Sí" - #: apps/treasury/templates/treasury/invoice_confirm_delete.html:10 -#: apps/treasury/views.py:173 +#: apps/treasury/views.py:174 msgid "Delete invoice" msgstr "Suprimir la factura" #: apps/treasury/templates/treasury/invoice_confirm_delete.html:15 -#: apps/treasury/views.py:177 +#: apps/treasury/views.py:178 msgid "This invoice is locked and can't be deleted." msgstr "Esta factura esta bloqueada y no puede ser suprimida." @@ -2878,64 +3002,64 @@ msgstr "Anãdir un crédito de la Société Générale" msgid "Credit successfully registered" msgstr "Crédito creado con éxito" -#: apps/treasury/views.py:40 +#: apps/treasury/views.py:41 msgid "Create new invoice" msgstr "Crear una nueva factura" -#: apps/treasury/views.py:97 +#: apps/treasury/views.py:98 msgid "Invoices list" msgstr "Lista de las facturas" -#: apps/treasury/views.py:105 apps/treasury/views.py:275 -#: apps/treasury/views.py:401 +#: apps/treasury/views.py:106 apps/treasury/views.py:281 +#: apps/treasury/views.py:394 msgid "You are not able to see the treasury interface." msgstr "Usted no tiene derecho a ver la interfaz de tesorería." -#: apps/treasury/views.py:115 +#: apps/treasury/views.py:116 msgid "Update an invoice" msgstr "Modificar una factura" -#: apps/treasury/views.py:240 +#: apps/treasury/views.py:241 msgid "Create a new remittance" msgstr "Crear un nuevo descuento" -#: apps/treasury/views.py:267 +#: apps/treasury/views.py:265 msgid "Remittances list" msgstr "Lista de los descuentos" -#: apps/treasury/views.py:326 +#: apps/treasury/views.py:320 msgid "Update a remittance" msgstr "Modificar un descuento" -#: apps/treasury/views.py:349 +#: apps/treasury/views.py:342 msgid "Attach a transaction to a remittance" msgstr "Unir una transacción con un descuento" -#: apps/treasury/views.py:393 +#: apps/treasury/views.py:386 msgid "List of credits from the Société générale" msgstr "Lista de los créditos de la Société Générale" -#: apps/treasury/views.py:438 +#: apps/treasury/views.py:436 msgid "Manage credits from the Société générale" msgstr "Gestionar los créditos de la Société Générale" -#: apps/wei/apps.py:10 apps/wei/models.py:37 apps/wei/models.py:38 -#: apps/wei/models.py:62 apps/wei/models.py:178 +#: 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 msgid "WEI" msgstr "WEI" -#: apps/wei/forms/registration.py:35 +#: apps/wei/forms/registration.py:37 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:59 apps/wei/models.py:126 -#: apps/wei/models.py:324 +#: apps/wei/forms/registration.py:84 apps/wei/models.py:140 +#: apps/wei/models.py:348 msgid "bus" msgstr "bus" -#: apps/wei/forms/registration.py:60 +#: 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." @@ -2944,11 +3068,11 @@ msgstr "" "derecho de imponer su bus y su equipo, en particular para los electrones " "libres." -#: apps/wei/forms/registration.py:67 +#: apps/wei/forms/registration.py:92 msgid "Team" msgstr "Equipo" -#: apps/wei/forms/registration.py:69 +#: apps/wei/forms/registration.py:94 msgid "" "Leave this field empty if you won't be in a team (staff, bus chief, free " "electron)" @@ -2956,16 +3080,16 @@ msgstr "" "Deje este campo vacío si no quiere estar en un equipo (staff, jefe de bus, " "electrón libre)" -#: apps/wei/forms/registration.py:75 apps/wei/forms/registration.py:85 -#: apps/wei/models.py:160 +#: apps/wei/forms/registration.py:100 apps/wei/forms/registration.py:110 +#: apps/wei/models.py:174 msgid "WEI Roles" msgstr "Papeles en el WEI" -#: apps/wei/forms/registration.py:76 +#: apps/wei/forms/registration.py:101 msgid "Select the roles that you are interested in." msgstr "Elegir los papeles que le interesa." -#: apps/wei/forms/registration.py:122 +#: apps/wei/forms/registration.py:147 msgid "This team doesn't belong to the given bus." msgstr "Este equipo no pertenece al bus dado." @@ -2978,126 +3102,149 @@ msgid "year" msgstr "año" #: apps/wei/models.py:29 apps/wei/templates/wei/base.html:30 +#: apps/wrapped/models.py:20 msgid "date start" msgstr "fecha de inicio" #: apps/wei/models.py:33 apps/wei/templates/wei/base.html:33 +#: apps/wrapped/models.py:24 msgid "date end" msgstr "fecha de fin" -#: apps/wei/models.py:71 apps/wei/tables.py:305 +#: apps/wei/models.py:37 +#, fuzzy +#| msgid "total amount" +msgid "caution amount" +msgstr "monto total" + +#: apps/wei/models.py:76 apps/wei/tables.py:305 msgid "seat count in the bus" msgstr "cantidad de asientos en el bus" -#: apps/wei/models.py:83 +#: apps/wei/models.py:97 msgid "survey information" msgstr "informaciones sobre el cuestionario" -#: apps/wei/models.py:84 +#: apps/wei/models.py:98 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:88 +#: apps/wei/models.py:102 msgid "Bus" msgstr "Bus" -#: apps/wei/models.py:89 apps/wei/templates/wei/weiclub_detail.html:51 +#: apps/wei/models.py:103 apps/wei/templates/wei/weiclub_detail.html:51 msgid "Buses" msgstr "Bus" -#: apps/wei/models.py:135 +#: apps/wei/models.py:149 msgid "color" msgstr "color" -#: apps/wei/models.py:136 +#: apps/wei/models.py:150 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:147 +#: apps/wei/models.py:161 msgid "Bus team" msgstr "Equipo de bus" -#: apps/wei/models.py:148 +#: apps/wei/models.py:162 msgid "Bus teams" msgstr "Equipos de bus" -#: apps/wei/models.py:159 +#: apps/wei/models.py:173 msgid "WEI Role" msgstr "Papeles en el WEI" -#: apps/wei/models.py:183 +#: apps/wei/models.py:197 msgid "Credit from Société générale" msgstr "Crédito de la Société Générale" -#: apps/wei/models.py:188 +#: apps/wei/models.py:202 apps/wei/views.py:984 msgid "Caution check given" msgstr "Cheque de garantía dado" -#: apps/wei/models.py:192 apps/wei/templates/wei/weimembership_form.html:64 +#: apps/wei/models.py:208 +msgid "Check" +msgstr "" + +#: apps/wei/models.py:209 +#, fuzzy +#| msgid "transactions" +msgid "Note transaction" +msgstr "Transacción" + +#: apps/wei/models.py:212 +#, fuzzy +#| msgid "created at" +msgid "caution type" +msgstr "tipo de fianza" + +#: apps/wei/models.py:216 apps/wei/templates/wei/weimembership_form.html:64 msgid "birth date" msgstr "fecha de nacimiento" -#: apps/wei/models.py:198 apps/wei/models.py:208 +#: apps/wei/models.py:222 apps/wei/models.py:232 msgid "Male" msgstr "Hombre" -#: apps/wei/models.py:199 apps/wei/models.py:209 +#: apps/wei/models.py:223 apps/wei/models.py:233 msgid "Female" msgstr "Mujer" -#: apps/wei/models.py:200 +#: apps/wei/models.py:224 msgid "Non binary" msgstr "No binari@" -#: apps/wei/models.py:202 apps/wei/templates/wei/attribute_bus_1A.html:22 +#: apps/wei/models.py:226 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:210 +#: apps/wei/models.py:234 msgid "Unisex" msgstr "Unisex" -#: apps/wei/models.py:213 apps/wei/templates/wei/weimembership_form.html:58 +#: apps/wei/models.py:237 apps/wei/templates/wei/weimembership_form.html:58 msgid "clothing cut" msgstr "forma de ropa" -#: apps/wei/models.py:226 apps/wei/templates/wei/weimembership_form.html:61 +#: apps/wei/models.py:250 apps/wei/templates/wei/weimembership_form.html:61 msgid "clothing size" msgstr "medida de ropa" -#: apps/wei/models.py:232 apps/wei/templates/wei/attribute_bus_1A.html:28 -#: apps/wei/templates/wei/weimembership_form.html:67 +#: apps/wei/models.py:256 msgid "health issues" msgstr "problemas de salud" -#: apps/wei/models.py:237 apps/wei/templates/wei/weimembership_form.html:70 +#: apps/wei/models.py:261 apps/wei/templates/wei/weimembership_form.html:70 msgid "emergency contact name" msgstr "nombre del contacto de emergencia" -#: apps/wei/models.py:238 +#: apps/wei/models.py:262 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:243 apps/wei/templates/wei/weimembership_form.html:73 +#: apps/wei/models.py:267 apps/wei/templates/wei/weimembership_form.html:73 msgid "emergency contact phone" msgstr "teléfono del contacto de emergencia" -#: apps/wei/models.py:248 apps/wei/templates/wei/weimembership_form.html:52 +#: apps/wei/models.py:272 apps/wei/templates/wei/weimembership_form.html:52 msgid "first year" msgstr "primer año" -#: apps/wei/models.py:249 +#: apps/wei/models.py:273 msgid "Tells if the user is new in the school." msgstr "Indica si el usuario es nuevo en la escuela." -#: apps/wei/models.py:254 +#: apps/wei/models.py:278 msgid "registration information" msgstr "informaciones sobre la afiliación" -#: apps/wei/models.py:255 +#: apps/wei/models.py:279 msgid "" "Information about the registration (buses for old members, survey for the " "new members), encoded in JSON" @@ -3105,27 +3252,27 @@ msgstr "" "Informaciones sobre la afiliacion (bus para miembros ancianos, cuestionario " "para los nuevos miembros), registrado en JSON" -#: apps/wei/models.py:261 +#: apps/wei/models.py:285 msgid "WEI User" msgstr "Participante WEI" -#: apps/wei/models.py:262 +#: apps/wei/models.py:286 msgid "WEI Users" msgstr "Participantes WEI" -#: apps/wei/models.py:334 +#: apps/wei/models.py:358 msgid "team" msgstr "equipo" -#: apps/wei/models.py:344 +#: apps/wei/models.py:368 msgid "WEI registration" msgstr "Apuntación al WEI" -#: apps/wei/models.py:348 +#: apps/wei/models.py:372 msgid "WEI membership" msgstr "Afiliación al WEI" -#: apps/wei/models.py:349 +#: apps/wei/models.py:373 msgid "WEI memberships" msgstr "Afiliaciones al WEI" @@ -3153,8 +3300,8 @@ msgstr "Año" msgid "preferred bus" msgstr "bus preferido" -#: apps/wei/tables.py:210 apps/wei/templates/wei/bus_detail.html:32 -#: apps/wei/templates/wei/busteam_detail.html:50 +#: apps/wei/tables.py:210 apps/wei/templates/wei/bus_detail.html:36 +#: apps/wei/templates/wei/busteam_detail.html:52 msgid "Teams" msgstr "Equipos" @@ -3187,13 +3334,22 @@ msgid "Attribute first year members into buses" msgstr "Repartir los primer años en los buses" #: apps/wei/templates/wei/1A_list.html:15 -msgid "Start attribution!" +#, fuzzy +#| msgid "Start attribution!" +msgid "Start attribution !" msgstr "Empezar repartición !" #: apps/wei/templates/wei/attribute_bus_1A.html:8 msgid "Bus attribution" msgstr "Repartición de los buses" +#: apps/wei/templates/wei/attribute_bus_1A.html:28 +#: apps/wei/templates/wei/weimembership_form.html:67 +#, fuzzy +#| msgid "health issues" +msgid "health issues or specific diet" +msgstr "problemas de salud" + #: apps/wei/templates/wei/attribute_bus_1A.html:31 msgid "suggested bus" msgstr "bus sugerido" @@ -3210,53 +3366,59 @@ msgstr "Volver a la lista principal" msgid "WEI fee (paid students)" msgstr "Pago de entrada del WEI (estudiantes pagados)" -#: apps/wei/templates/wei/base.html:47 apps/wei/templates/wei/base.html:54 -msgid "The BDE membership is included in the WEI registration." -msgstr "La afiliación al BDE esta incluida en la afiliación WEI." - -#: apps/wei/templates/wei/base.html:51 +#: apps/wei/templates/wei/base.html:47 msgid "WEI fee (unpaid students)" msgstr "Pago de entrada del WEI (estudiantes no pagados)" -#: apps/wei/templates/wei/base.html:76 +#: apps/wei/templates/wei/base.html:53 +#, fuzzy +#| msgid "total amount" +msgid "Caution amount" +msgstr "monto total" + +#: apps/wei/templates/wei/base.html:74 msgid "WEI list" msgstr "Lista de los WEI" -#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:528 +#: apps/wei/templates/wei/base.html:79 apps/wei/views.py:550 msgid "Register 1A" msgstr "Apuntar un 1A" -#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:614 +#: apps/wei/templates/wei/base.html:83 apps/wei/views.py:644 msgid "Register 2A+" msgstr "Apuntar un 2A+" -#: apps/wei/templates/wei/base.html:93 +#: apps/wei/templates/wei/base.html:91 msgid "Add bus" msgstr "Añadir un bus" -#: apps/wei/templates/wei/base.html:97 +#: apps/wei/templates/wei/base.html:95 msgid "View WEI" msgstr "Ver un WEI" -#: apps/wei/templates/wei/bus_detail.html:22 -#: apps/wei/templates/wei/busteam_detail.html:22 +#: apps/wei/templates/wei/bus_detail.html:21 +msgid "View club" +msgstr "Ver club" + +#: apps/wei/templates/wei/bus_detail.html:26 +#: apps/wei/templates/wei/busteam_detail.html:24 msgid "Add team" msgstr "Añadir un equipo" -#: apps/wei/templates/wei/bus_detail.html:45 +#: apps/wei/templates/wei/bus_detail.html:49 msgid "Members" msgstr "Miembros" -#: apps/wei/templates/wei/bus_detail.html:54 -#: apps/wei/templates/wei/busteam_detail.html:60 +#: apps/wei/templates/wei/bus_detail.html:58 +#: apps/wei/templates/wei/busteam_detail.html:62 #: apps/wei/templates/wei/weimembership_list.html:31 msgid "View as PDF" 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:1028 -#: apps/wei/views.py:1083 apps/wei/views.py:1130 +#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:1159 +#: apps/wei/views.py:1214 apps/wei/views.py:1261 msgid "Survey WEI" msgstr "Cuestionario WEI" @@ -3300,7 +3462,7 @@ msgstr "Inscripciones sin validación" msgid "Attribute buses" msgstr "Repartición en los buses" -#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:79 +#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:82 msgid "Create WEI" msgstr "Crear un WEI" @@ -3381,29 +3543,42 @@ msgstr "" "resultará invalida. Tendrá que validarla una vez que el banco confirmará la " "creación de la cuenta, o cambiará el método de pago." +#: apps/wei/templates/wei/weimembership_form.html:147 +msgid "Required payments:" +msgstr "" + #: apps/wei/templates/wei/weimembership_form.html:149 -#, python-format -msgid "" -"The note don't have enough money (%(balance)s, %(pretty_fee)s required). The " -"registration may fail if you don't credit the note now." -msgstr "" -"La note no tiene suficiente dinero (%(balance)s, %(pretty_fee)s pedidos). La " -"afiliación puede fallar si usted no acredita la note ahora." +#, fuzzy, python-format +#| msgid "membership fee (paid students)" +msgid "Membership fees: %(amount)s" +msgstr "Pagos de afiliación (estudiantes pagados)" -#: apps/wei/templates/wei/weimembership_form.html:157 +#: apps/wei/templates/wei/weimembership_form.html:153 #, python-format -msgid "" -"The note has enough money (%(pretty_fee)s required), the registration is " -"possible." -msgstr "" -"La note tiene suficiente dinero (%(pretty_fee)s pedidos), la afiliación es " -"posible." +msgid "Deposit (by Note transaction): %(amount)s" +msgstr "Fianza (transacción) : %(amount)s" -#: apps/wei/templates/wei/weimembership_form.html:166 +#: 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 +#, python-format +msgid "Deposit (by check): %(amount)s" +msgstr "Fianza (cheque) : %(amount)s" + +#: apps/wei/templates/wei/weimembership_form.html:168 +#, python-format +msgid "Current balance: %(balance)s" +msgstr "Saldo actual : %(balance)s" + +#: apps/wei/templates/wei/weimembership_form.html:176 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:174 +#: apps/wei/templates/wei/weimembership_form.html:184 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 " @@ -3437,117 +3612,373 @@ msgstr "No hay pre-inscripción encontrada con esta entrada." msgid "View validated memberships..." msgstr "Ver las inscripciones validadas..." -#: apps/wei/views.py:58 +#: apps/wei/views.py:61 msgid "Search WEI" msgstr "Buscar un WEI" -#: apps/wei/views.py:109 +#: apps/wei/views.py:112 msgid "WEI Detail" msgstr "Detalles del WEI" -#: apps/wei/views.py:208 +#: apps/wei/views.py:212 msgid "View members of the WEI" msgstr "Ver los miembros del WEI" -#: apps/wei/views.py:236 +#: apps/wei/views.py:245 msgid "Find WEI Membership" msgstr "Buscar una afiliación al WEI" -#: apps/wei/views.py:246 +#: apps/wei/views.py:255 msgid "View registrations to the WEI" msgstr "Ver las inscripciones al WEI" -#: apps/wei/views.py:270 +#: apps/wei/views.py:284 msgid "Find WEI Registration" msgstr "Buscar una inscripción al WEI" -#: apps/wei/views.py:281 +#: apps/wei/views.py:295 msgid "Update the WEI" msgstr "Modificar el WEI" -#: apps/wei/views.py:302 +#: apps/wei/views.py:316 msgid "Create new bus" msgstr "Añadir un bus" -#: apps/wei/views.py:340 +#: apps/wei/views.py:354 msgid "Update bus" msgstr "Modificar el bus" -#: apps/wei/views.py:372 +#: apps/wei/views.py:386 msgid "Manage bus" msgstr "Gestionar el bus" -#: apps/wei/views.py:399 +#: apps/wei/views.py:413 msgid "Create new team" msgstr "Añadir un equipo" -#: apps/wei/views.py:439 +#: apps/wei/views.py:457 msgid "Update team" msgstr "Modificar el equipo" -#: apps/wei/views.py:470 +#: apps/wei/views.py:492 msgid "Manage WEI team" msgstr "Gestionar el equipo" -#: apps/wei/views.py:492 +#: apps/wei/views.py:514 msgid "Register first year student to the WEI" msgstr "Registrar un 1A al WEI" -#: apps/wei/views.py:550 apps/wei/views.py:649 +#: apps/wei/views.py:580 apps/wei/views.py:689 msgid "This user is already registered to this WEI." msgstr "Este usuario ya afilió a este WEI." -#: apps/wei/views.py:555 +#: apps/wei/views.py:585 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:578 +#: apps/wei/views.py:608 msgid "Register old student to the WEI" msgstr "Registrar un 2A+ al WEI" -#: apps/wei/views.py:633 apps/wei/views.py:721 +#: apps/wei/views.py:663 apps/wei/views.py:768 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:685 +#: apps/wei/views.py:676 apps/wei/views.py:785 +msgid "Choose how you want to pay the deposit" +msgstr "" + +#: apps/wei/views.py:728 msgid "Update WEI Registration" msgstr "Modificar la inscripción WEI" -#: apps/wei/views.py:795 +#: apps/wei/views.py:810 +#, 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}." +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 +#, 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 msgid "Delete WEI registration" msgstr "Suprimir la inscripción WEI" -#: apps/wei/views.py:806 +#: apps/wei/views.py:881 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:824 +#: apps/wei/views.py:899 msgid "Validate WEI registration" msgstr "Validar la inscripción WEI" -#: apps/wei/views.py:1223 +#: apps/wei/views.py:985 +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" +msgid "Create deposit transaction" +msgstr "Crear transacción de crédito" + +#: apps/wei/views.py:992 +#, 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 +#| msgid "" +#| "This user don't have enough money to join this club, and can't have a " +#| "negative balance." +msgid "" +"This user doesn't have enough money. " +"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€" + +#: apps/wei/views.py:1140 +#, python-format +#| msgid "created at" +msgid "Caution %(name)s" +msgstr "Fianza %(name)s" + +#: apps/wei/views.py:1354 msgid "Attribute buses to first year members" msgstr "Repartir los primer años en los buses" -#: apps/wei/views.py:1248 +#: apps/wei/views.py:1379 msgid "Attribute bus" msgstr "Repartir en un bus" -#: note_kfet/settings/base.py:173 +#: apps/wei/views.py:1419 +msgid "" +"No first year student without a bus found. Either all of them have a bus, or " +"none has filled the survey yet." +msgstr "" + +#: apps/wrapped/apps.py:10 +msgid "wrapped" +msgstr "" + +#: apps/wrapped/models.py:40 +#, fuzzy +#| msgid "Regenerate token" +msgid "generated" +msgstr "Regenerar token" + +#: apps/wrapped/models.py:45 +msgid "public" +msgstr "" + +#: apps/wrapped/models.py:53 +msgid "bde" +msgstr "" + +#: apps/wrapped/models.py:65 +msgid "data json" +msgstr "" + +#: apps/wrapped/models.py:66 +msgid "data in the wrapped and generated by the script generate_wrapped" +msgstr "" + +#: apps/wrapped/models.py:70 note_kfet/templates/base.html:114 +msgid "Wrapped" +msgstr "" + +#: apps/wrapped/models.py:71 +msgid "Wrappeds" +msgstr "" + +#: apps/wrapped/tables.py:40 +msgid "view the wrapped" +msgstr "" + +#: apps/wrapped/tables.py:55 +msgid "Click to make this wrapped private" +msgstr "" + +#: apps/wrapped/tables.py:56 +msgid "Click to make this wrapped public" +msgstr "" + +#: apps/wrapped/tables.py:67 +msgid "Share" +msgstr "" + +#: apps/wrapped/tables.py:73 +msgid "Click to copy the link in the press paper" +msgstr "" + +#: apps/wrapped/tables.py:81 +msgid "Copy link" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:16 +#: note_kfet/templates/base.html:14 +msgid "The ENS Paris-Saclay BDE note." +msgstr "La note del BDE de la ENS Paris-Saclay." + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:58 +#, fuzzy +#| msgid "The Note Kfet team." +msgid "The NoteKfet this year it's also" +msgstr "El equipo Note Kfet." + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:60 +#, fuzzy +#| msgid "transactions" +msgid " transactions" +msgstr "transacciones" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:61 +msgid " parties" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:62 +#, fuzzy +#| msgid "entries" +msgid " Pot entries" +msgstr "entradas" + +#: apps/wrapped/templates/wrapped/1/wrapped_base.html:72 +msgid " old dickhead behind the bar" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:9 +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:9 +msgid "NoteKfet Wrapped" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:11 +msgid "Your best consumer:" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:13 +msgid "Your worst creditor:" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:16 +msgid "party·ies organised" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:17 +#, fuzzy +#| msgid "Add member" +msgid "distinct members" +msgstr "Añadir un miembro" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:26 +msgid "Infortunately, you doesn't have consumer this year" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:28 +msgid "Congratulations you are a real rat !" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:13 +msgid "You participate to the wei: " +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:13 +#, fuzzy +#| msgid "in the team" +msgid "in the" +msgstr "en el equipo" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:18 +msgid "pots !" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:27 +msgid "Your first conso of the year: " +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:28 +msgid "Your prefered consumtion category: " +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:41 +msgid ": it's the number of time your reload your note" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:44 +msgid "Your overall expenses: " +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:47 +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:60 +msgid "with" +msgstr "" + +#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:57 +msgid "Your expenses to BDE: " +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:13 +msgid "My wrapped" +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:22 +msgid "Public wrapped" +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:33 +msgid "" +"Do not forget to ask permission to people who are in your wrapped before to " +"make them public" +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:40 +msgid "Link copied" +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:65 +msgid "Wrapped is private" +msgstr "" + +#: apps/wrapped/templates/wrapped/wrapped_list.html:66 +msgid "Wrapped is public" +msgstr "" + +#: apps/wrapped/views.py:28 +msgid "List of wrapped" +msgstr "" + +#: note_kfet/settings/base.py:177 msgid "German" msgstr "Alemán" -#: note_kfet/settings/base.py:174 +#: note_kfet/settings/base.py:178 msgid "English" msgstr "Ingles" -#: note_kfet/settings/base.py:175 +#: note_kfet/settings/base.py:179 msgid "Spanish" msgstr "Español" -#: note_kfet/settings/base.py:176 +#: note_kfet/settings/base.py:180 msgid "French" msgstr "Francés" @@ -3605,14 +4036,6 @@ msgstr "" msgid "Reset" msgstr "Reiniciar" -#: note_kfet/templates/base.html:14 -msgid "The ENS Paris-Saclay BDE note." -msgstr "La note del BDE de la ENS Paris-Saclay." - -#: note_kfet/templates/base.html:72 -msgid "Food" -msgstr "" - #: note_kfet/templates/base.html:84 msgid "Users" msgstr "Usuarios" @@ -3621,26 +4044,26 @@ msgstr "Usuarios" msgid "Clubs" msgstr "Clubs" -#: note_kfet/templates/base.html:119 +#: note_kfet/templates/base.html:125 msgid "Admin" msgstr "" -#: note_kfet/templates/base.html:133 +#: note_kfet/templates/base.html:139 msgid "My account" msgstr "Mi cuenta" -#: note_kfet/templates/base.html:136 +#: note_kfet/templates/base.html:142 msgid "Log out" msgstr "Desconectarse" -#: note_kfet/templates/base.html:144 +#: note_kfet/templates/base.html:150 #: note_kfet/templates/registration/signup.html:6 #: note_kfet/templates/registration/signup.html:11 #: note_kfet/templates/registration/signup.html:28 msgid "Sign up" msgstr "Registrar" -#: note_kfet/templates/base.html:151 +#: note_kfet/templates/base.html:157 #: note_kfet/templates/registration/login.html:6 #: note_kfet/templates/registration/login.html:15 #: note_kfet/templates/registration/login.html:38 @@ -3648,7 +4071,7 @@ msgstr "Registrar" msgid "Log in" msgstr "Conectarse" -#: note_kfet/templates/base.html:165 +#: note_kfet/templates/base.html:171 msgid "" "You are not a BDE member anymore. Please renew your membership if you want " "to use the note." @@ -3656,7 +4079,7 @@ msgstr "" "Usted ya no está miembro del BDE. Por favor renueva su afiliación si quiere " "usar la note." -#: note_kfet/templates/base.html:171 +#: note_kfet/templates/base.html:177 msgid "" "Your e-mail address is not validated. Please check your mail inbox and click " "on the validation link." @@ -3664,7 +4087,7 @@ msgstr "" "Su correo electrónico no fue validado. Por favor mire en sus correos y haga " "clic en el enlace de validación." -#: note_kfet/templates/base.html:177 +#: note_kfet/templates/base.html:183 msgid "" "You declared that you opened a bank account in the Société générale. The " "bank did not validate the creation of the account to the BDE, so the " @@ -3677,19 +4100,19 @@ msgstr "" "pagados. El proceso de convalidación puede durar unos días. Por favor " "comprueba que fue hasta el final de la creación de la cuenta." -#: note_kfet/templates/base.html:200 +#: note_kfet/templates/base.html:206 msgid "Contact us" msgstr "Contactarnos" -#: note_kfet/templates/base.html:202 +#: note_kfet/templates/base.html:208 msgid "Technical Support" msgstr "Soporte técnico" -#: note_kfet/templates/base.html:204 +#: note_kfet/templates/base.html:210 msgid "Charte Info (FR)" msgstr "" -#: note_kfet/templates/base.html:206 +#: note_kfet/templates/base.html:212 msgid "FAQ (FR)" msgstr "FAQ (FR)" @@ -3914,16 +4337,6 @@ msgstr "" "pagar su afiliación. Tambien tiene que validar su correo electronico con el " "enlace que recibió." -#, fuzzy -#~| msgid "invalidate" -#~ msgid "Enter a valid color." -#~ msgstr "invalidar" - -#, fuzzy -#~| msgid "invalidate" -#~ msgid "Enter a valid value." -#~ msgstr "invalidar" - #, fuzzy #~| msgid "Invitation" #~ msgid "Syndication" @@ -3934,6 +4347,11 @@ msgstr "" #~ msgid "That page contains no results" #~ msgstr "No hay resultado." +#, fuzzy +#~| msgid "invalidate" +#~ msgid "Enter a valid value." +#~ msgstr "invalidar" + #, fuzzy #~| msgid "invalidate" #~ msgid "Enter a valid URL." @@ -3969,16 +4387,16 @@ msgstr "" #~ msgid "Enter a number." #~ msgstr "número de teléfono" -#, fuzzy -#~| msgid "add" -#~ msgid "and" -#~ msgstr "añadir" - #, fuzzy, python-format #~| msgid "A template with this name already exist" #~ msgid "%(model_name)s with this %(field_labels)s already exists." #~ msgstr "Un plantilla de transacción con un nombre similar ya existe" +#, fuzzy, python-format +#~| msgid "This activity is not validated yet." +#~ msgid "Value %(value)r is not a valid choice." +#~ msgstr "Esta actividad no fue validada por ahora." + #, fuzzy #~| msgid "This image cannot be loaded." #~ msgid "This field cannot be null." @@ -4024,11 +4442,26 @@ msgstr "" #~ msgid "IP address" #~ msgstr "Dirección IP" +#, fuzzy, python-format +#~| msgid "This activity is not validated yet." +#~ msgid "“%(value)s” is not a valid UUID." +#~ msgstr "Esta actividad no fue validada por ahora." + #, fuzzy #~| msgid "Invoice identifier" #~ msgid "Universally unique identifier" #~ msgstr "Numero de factura" +#, fuzzy +#~| msgid "Object" +#~ msgid "A JSON object" +#~ msgstr "Asunto" + +#, fuzzy +#~| msgid "This address must be valid." +#~ msgid "Value must be valid JSON." +#~ msgstr "Este correo tiene que ser valido." + #, fuzzy, python-format #~| msgid "A template with this name already exist" #~ msgid "%(model)s instance with %(field)s %(value)r does not exist." @@ -4074,9 +4507,14 @@ msgstr "" #~ msgid "Enter a valid UUID." #~ msgstr "invalidar" +#, fuzzy +#~| msgid "invalidate" +#~ msgid "Enter a valid JSON." +#~ msgstr "invalidar" + #, fuzzy, python-format #~| msgid "This activity is not validated yet." -#~ msgid "\"%(pk)s\" is not a valid value." +#~ msgid "“%(pk)s” is not a valid value." #~ msgstr "Esta actividad no fue validada por ahora." #, fuzzy @@ -4119,6 +4557,11 @@ msgstr "" #~ msgid "feb" #~ msgstr "pago" +#, fuzzy +#~| msgid "add" +#~ msgid "jun" +#~ msgstr "añadir" + #, fuzzy #~| msgid "product" #~ msgid "oct" @@ -4161,8 +4604,8 @@ msgstr "" #, fuzzy, python-format #~| msgid "year" -#~ msgid "%d year" -#~ msgid_plural "%d years" +#~ msgid "%(num)d year" +#~ msgid_plural "%(num)d years" #~ msgstr[0] "año" #~ msgstr[1] "año" @@ -4223,9 +4666,78 @@ msgstr "" #, fuzzy #~| msgid "Application requires following permissions:" -#~ msgid "Application requires following permissions" +#~ msgid "Application requires the following permissions" #~ msgstr "La aplicación necesita los derechos siguientes :" +#~ msgid "The BDE membership is included in the WEI registration." +#~ msgstr "La afiliación al BDE esta incluida en la afiliación WEI." + +#, python-format +#~ msgid "" +#~ "The note don't have enough money (%(balance)s, %(pretty_fee)s required). " +#~ "The registration may fail if you don't credit the note now." +#~ msgstr "" +#~ "La note no tiene suficiente dinero (%(balance)s, %(pretty_fee)s pedidos). " +#~ "La afiliación puede fallar si usted no acredita la note ahora." + +#, python-format +#~ msgid "" +#~ "The note has enough money (%(pretty_fee)s required), the registration is " +#~ "possible." +#~ msgstr "" +#~ "La note tiene suficiente dinero (%(pretty_fee)s pedidos), la afiliación " +#~ "es posible." + +#, fuzzy +#~| msgid "You don't have the right to delete this WEI registration." +#~ msgid "You don't have the permission to validate registrations" +#~ msgstr "Usted no tiene derecho a suprimir esta inscripción WEI." + +#, fuzzy +#~| msgid "active" +#~ msgid "is active" +#~ msgstr "activo" + +#, fuzzy +#~| msgid "invalidate" +#~ msgid "Arrival date" +#~ msgstr "invalidar" + +#, fuzzy +#~| msgid "active" +#~ msgid "Active" +#~ msgstr "activo" + +#, fuzzy +#~| msgid "phone number" +#~ msgid "number" +#~ msgstr "número de teléfono" + +#, fuzzy +#~| msgid "Profile detail" +#~ msgid "View details" +#~ msgstr "Detalles del usuario" + +#, fuzzy +#~| msgid "There is no results." +#~ msgid "There is no meal." +#~ msgstr "No hay resultado." + +#, fuzzy +#~| msgid "This credit is already validated." +#~ msgid "The product is already prepared" +#~ msgstr "Este crédito ya fue validado." + +#, fuzzy +#~| msgid "Update team" +#~ msgid "Update a meal" +#~ msgstr "Modificar el equipo" + +#, fuzzy +#~| msgid "invalidate" +#~ msgid "Enter a valid color." +#~ msgstr "invalidar" + #, fuzzy #~| msgid "WEI registration" #~ msgid "In preparation" diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 23ba06dd..9832c986 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-06-27 19:15+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:67 apps/wei/models.py:131 apps/wei/tables.py:282 +#: apps/wei/models.py:72 apps/wei/models.py:145 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:78 apps/wei/models.py:142 +#: apps/permission/models.py:188 apps/wei/models.py:92 apps/wei/models.py:156 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:171 apps/wei/templates/wei/attribute_bus_1A.html:13 +#: apps/wei/models.py:185 apps/wei/templates/wei/attribute_bus_1A.html:13 #: apps/wei/templates/wei/survey.html:15 msgid "user" msgstr "utilisateur⋅rice" @@ -291,14 +291,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:110 +#: apps/wei/forms/registration.py:129 msgid "Last name" msgstr "Nom de famille" #: 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:115 +#: apps/wei/forms/registration.py:134 msgid "First name" msgstr "Prénom" @@ -341,6 +341,18 @@ msgstr "Liste des invité·e·s" msgid "Guest deleted" msgstr "Invité·e supprimé·e" +#: apps/activity/templates/activity/activity_detail.html:99 +#, fuzzy +#| msgid "Are you sure you want to delete this token?" +msgid "Are you sure you want to delete this activity?" +msgstr "Êtes-vous sûr⋅e de vouloir supprimer ce jeton ?" + +#: apps/activity/templates/activity/activity_detail.html:110 +#, fuzzy +#| msgid "Activity detail" +msgid "Activity deleted" +msgstr "Détails de l'activité" + #: apps/activity/templates/activity/activity_entry.html:14 #: apps/note/models/transactions.py:261 #: apps/note/templates/note/transaction_form.html:17 @@ -392,7 +404,7 @@ msgstr "Entrée effectuée !" #: apps/treasury/forms.py:89 apps/treasury/forms.py:143 #: apps/treasury/templates/treasury/invoice_form.html:74 #: apps/wei/templates/wei/bus_form.html:17 -#: apps/wei/templates/wei/busteam_form.html:17 +#: apps/wei/templates/wei/busteam_form.html:18 #: apps/wei/templates/wei/weiclub_form.html:17 #: apps/wei/templates/wei/weiregistration_form.html:18 msgid "Submit" @@ -448,6 +460,13 @@ msgid "edit" msgstr "modifier" #: apps/activity/templates/activity/includes/activity_info.html:74 +#: apps/logs/models.py:65 apps/note/tables.py:230 apps/note/tables.py:279 +#: apps/permission/models.py:126 apps/treasury/tables.py:38 +#: apps/wei/tables.py:74 +msgid "delete" +msgstr "supprimer" + +#: apps/activity/templates/activity/includes/activity_info.html:77 msgid "Invite" msgstr "Inviter" @@ -467,25 +486,40 @@ msgstr "Détails de l'activité" msgid "Update activity" msgstr "Modifier l'activité" -#: apps/activity/views.py:178 +#: apps/activity/views.py:177 +#, fuzzy +#| msgid "" +#| "You are not allowed to display the entry interface for this activity." +msgid "You are not allowed to delete this activity." +msgstr "" +"Vous n'êtes pas autorisé·e à afficher l'interface des entrées pour cette " +"activité." + +#: apps/activity/views.py:180 +#, fuzzy +#| msgid "This activity is closed." +msgid "This activity is valid." +msgstr "Cette activité est fermée." + +#: apps/activity/views.py:206 msgid "Invite guest to the activity \"{}\"" msgstr "Invitation pour l'activité « {} »" -#: apps/activity/views.py:218 +#: apps/activity/views.py:246 msgid "You are not allowed to display the entry interface for this activity." msgstr "" "Vous n'êtes pas autorisé·e à afficher l'interface des entrées pour cette " "activité." -#: apps/activity/views.py:221 +#: apps/activity/views.py:249 msgid "This activity does not support activity entries." msgstr "Cette activité ne requiert pas d'entrées." -#: apps/activity/views.py:224 +#: apps/activity/views.py:252 msgid "This activity is closed." msgstr "Cette activité est fermée." -#: apps/activity/views.py:329 +#: apps/activity/views.py:357 msgid "Entry for activity \"{}\"" msgstr "Entrées pour l'activité « {} »" @@ -759,41 +793,41 @@ msgstr "Ajouter un nouveau QR-code" msgid "Add an aliment" msgstr "Ajouter un nouvel aliment" -#: apps/food/views.py:226 +#: apps/food/views.py:235 msgid "Add a meal" msgstr "Ajouter un plat" -#: apps/food/views.py:262 +#: apps/food/views.py:275 msgid "Manage ingredients of:" msgstr "Gestion des ingrédienrs de :" -#: apps/food/views.py:276 apps/food/views.py:284 +#: apps/food/views.py:289 apps/food/views.py:297 #, python-brace-format msgid "Fully used in {meal}" msgstr "Aliment entièrement utilisé dans : {meal}" -#: apps/food/views.py:323 +#: apps/food/views.py:344 msgid "Add the ingredient:" msgstr "Ajouter l'ingrédient" -#: apps/food/views.py:349 +#: apps/food/views.py:370 #, 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:389 msgid "Update an aliment" msgstr "Modifier un aliment" -#: apps/food/views.py:416 +#: apps/food/views.py:437 msgid "Details of:" msgstr "Détails de :" -#: apps/food/views.py:426 apps/treasury/tables.py:149 +#: apps/food/views.py:447 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:449 apps/member/models.py:99 apps/treasury/tables.py:149 msgid "No" msgstr "Non" @@ -825,12 +859,6 @@ msgstr "nouvelles données" msgid "create" msgstr "créer" -#: apps/logs/models.py:65 apps/note/tables.py:230 apps/note/tables.py:279 -#: apps/permission/models.py:126 apps/treasury/tables.py:38 -#: apps/wei/tables.py:74 -msgid "delete" -msgstr "supprimer" - #: apps/logs/models.py:68 msgid "action" msgstr "action" @@ -935,12 +963,12 @@ msgid "Check this case if the Société Générale paid the inscription." msgstr "Cochez cette case si la Société Générale a payé l'inscription." #: apps/member/forms.py:185 apps/registration/forms.py:78 -#: apps/wei/forms/registration.py:97 +#: apps/wei/forms/registration.py:116 msgid "Credit type" msgstr "Type de rechargement" #: apps/member/forms.py:186 apps/registration/forms.py:79 -#: apps/wei/forms/registration.py:98 +#: apps/wei/forms/registration.py:117 msgid "No credit" msgstr "Pas de rechargement" @@ -949,13 +977,13 @@ msgid "You can credit the note of the user." msgstr "Vous pouvez créditer la note de l'utilisateur⋅rice avant l'adhésion." #: apps/member/forms.py:192 apps/registration/forms.py:84 -#: apps/wei/forms/registration.py:103 +#: apps/wei/forms/registration.py:122 msgid "Credit amount" msgstr "Montant à créditer" #: 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:120 +#: apps/wei/forms/registration.py:139 msgid "Bank" msgstr "Banque" @@ -1160,7 +1188,7 @@ msgstr "Activez votre compte Note Kfet" #: apps/member/templates/member/includes/club_info.html:55 #: apps/member/templates/member/includes/profile_info.html:40 #: apps/registration/templates/registration/future_profile_detail.html:22 -#: apps/wei/templates/wei/base.html:70 +#: apps/wei/templates/wei/base.html:68 #: apps/wei/templates/wei/weimembership_form.html:20 msgid "email" msgstr "courriel" @@ -1212,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/note/models/notes.py:176 apps/wei/models.py:86 msgid "club" msgstr "club" @@ -1413,13 +1441,13 @@ msgstr "cotisation pour adhérer" #: apps/member/templates/member/includes/club_info.html:43 #: apps/member/templates/member/includes/profile_info.html:55 #: apps/treasury/templates/treasury/sogecredit_detail.html:24 -#: apps/wei/templates/wei/base.html:60 +#: apps/wei/templates/wei/base.html:58 msgid "balance" msgstr "solde du compte" #: apps/member/templates/member/includes/club_info.html:47 #: apps/member/templates/member/includes/profile_info.html:20 -#: apps/note/models/notes.py:287 apps/wei/templates/wei/base.html:66 +#: apps/note/models/notes.py:287 apps/wei/templates/wei/base.html:64 msgid "aliases" msgstr "alias" @@ -1597,7 +1625,7 @@ msgstr "Modifier le club" msgid "Add new member to the club" msgstr "Ajouter un·e nouvelleau membre au club" -#: apps/member/views.py:750 apps/wei/views.py:991 +#: apps/member/views.py:750 msgid "" "This user don't have enough money to join this club, and can't have a " "negative balance." @@ -1934,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:996 -#: apps/wei/views.py:1000 +#: apps/note/models/transactions.py:363 apps/wei/views.py:1097 +#: apps/wei/views.py:1101 msgid "This field is required." msgstr "Ce champ est requis." @@ -1969,10 +1997,10 @@ msgstr "Ajouter" #: apps/note/tables.py:262 apps/note/templates/note/conso_form.html:151 #: apps/wei/tables.py:49 apps/wei/tables.py:50 -#: apps/wei/templates/wei/base.html:89 -#: apps/wei/templates/wei/bus_detail.html:20 +#: apps/wei/templates/wei/base.html:87 +#: apps/wei/templates/wei/bus_detail.html:24 #: apps/wei/templates/wei/busteam_detail.html:20 -#: apps/wei/templates/wei/busteam_detail.html:40 +#: apps/wei/templates/wei/busteam_detail.html:42 #: note_kfet/templates/oauth2_provider/application_detail.html:38 msgid "Edit" msgstr "Éditer" @@ -2440,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:186 +#: apps/wei/templates/wei/weimembership_form.html:196 msgid "Validate registration" msgstr "Valider l'inscription" @@ -2742,7 +2770,7 @@ msgid "Transaction count" msgstr "Nombre de transactions" #: apps/treasury/tables.py:71 apps/treasury/tables.py:73 -#: apps/wrapped/tables.py:42 +#: apps/wei/templates/wei/busteam_detail.html:22 apps/wrapped/tables.py:42 msgid "View" msgstr "Voir" @@ -2966,24 +2994,24 @@ 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:37 apps/wei/models.py:38 -#: apps/wei/models.py:62 apps/wei/models.py:178 +#: 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 msgid "WEI" msgstr "WEI" -#: apps/wei/forms/registration.py:36 +#: apps/wei/forms/registration.py:37 msgid "The selected user is not validated. Please validate its account first" msgstr "" "L'utilisateur·rice sélectionné·e n'est pas validé·e. Merci de d'abord " "valider son compte" -#: apps/wei/forms/registration.py:60 apps/wei/models.py:126 -#: apps/wei/models.py:324 +#: apps/wei/forms/registration.py:84 apps/wei/models.py:140 +#: apps/wei/models.py:348 msgid "bus" msgstr "bus" -#: apps/wei/forms/registration.py:61 +#: 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." @@ -2992,11 +3020,11 @@ msgstr "" "vous attribuer un bus et une équipe, en particulier si vous êtes un·e " "électron libre." -#: apps/wei/forms/registration.py:68 +#: apps/wei/forms/registration.py:92 msgid "Team" msgstr "Équipe" -#: apps/wei/forms/registration.py:70 +#: apps/wei/forms/registration.py:94 msgid "" "Leave this field empty if you won't be in a team (staff, bus chief, free " "electron)" @@ -3004,27 +3032,28 @@ msgstr "" "Laissez ce champ vide si vous ne serez pas dans une équipe (staff, chef de " "bus ou électron libre)" -#: apps/wei/forms/registration.py:76 apps/wei/forms/registration.py:91 -#: apps/wei/models.py:160 +#: apps/wei/forms/registration.py:100 apps/wei/forms/registration.py:110 +#: apps/wei/models.py:174 msgid "WEI Roles" msgstr "Rôles au WEI" -#: apps/wei/forms/registration.py:77 +#: apps/wei/forms/registration.py:101 msgid "Select the roles that you are interested in." msgstr "Sélectionnez les rôles qui vous intéressent." -#: apps/wei/forms/registration.py:86 apps/wei/models.py:188 -msgid "Caution check given" -msgstr "Chèque de caution donné" - -#: apps/wei/forms/registration.py:128 +#: apps/wei/forms/registration.py:147 msgid "This team doesn't belong to the given bus." msgstr "Cette équipe n'appartient pas à ce 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 "Choisissez un mot :" +#: apps/wei/forms/surveys/wei2025.py:123 +msgid "Rate between 0 and 5." +msgstr "Note entre 0 et 5." + #: apps/wei/models.py:25 apps/wei/templates/wei/base.html:36 msgid "year" msgstr "année" @@ -3039,116 +3068,138 @@ msgstr "début" msgid "date end" msgstr "fin" -#: apps/wei/models.py:71 apps/wei/tables.py:305 +#: apps/wei/models.py:37 +#, fuzzy +#| msgid "total amount" +msgid "caution amount" +msgstr "montant total" + +#: apps/wei/models.py:76 apps/wei/tables.py:305 msgid "seat count in the bus" msgstr "nombre de sièges dans le bus" -#: apps/wei/models.py:83 +#: apps/wei/models.py:97 msgid "survey information" msgstr "informations sur le questionnaire" -#: apps/wei/models.py:84 +#: apps/wei/models.py:98 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:88 +#: apps/wei/models.py:102 msgid "Bus" msgstr "Bus" -#: apps/wei/models.py:89 apps/wei/templates/wei/weiclub_detail.html:51 +#: apps/wei/models.py:103 apps/wei/templates/wei/weiclub_detail.html:51 msgid "Buses" msgstr "Bus" -#: apps/wei/models.py:135 +#: apps/wei/models.py:149 msgid "color" msgstr "couleur" -#: apps/wei/models.py:136 +#: apps/wei/models.py:150 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:147 +#: apps/wei/models.py:161 msgid "Bus team" msgstr "Équipe de bus" -#: apps/wei/models.py:148 +#: apps/wei/models.py:162 msgid "Bus teams" msgstr "Équipes de bus" -#: apps/wei/models.py:159 +#: apps/wei/models.py:173 msgid "WEI Role" msgstr "Rôle au WEI" -#: apps/wei/models.py:183 +#: apps/wei/models.py:197 msgid "Credit from Société générale" msgstr "Crédit de la Société générale" -#: apps/wei/models.py:192 apps/wei/templates/wei/weimembership_form.html:64 +#: apps/wei/models.py:202 apps/wei/views.py:984 +msgid "Caution check given" +msgstr "Chèque de caution donné" + +#: apps/wei/models.py:208 +msgid "Check" +msgstr "" + +#: apps/wei/models.py:209 +msgid "Note transaction" +msgstr "Transaction Note" + +#: apps/wei/models.py:212 +msgid "caution type" +msgstr "date de création" + +#: apps/wei/models.py:216 apps/wei/templates/wei/weimembership_form.html:64 msgid "birth date" msgstr "date de naissance" -#: apps/wei/models.py:198 apps/wei/models.py:208 +#: apps/wei/models.py:222 apps/wei/models.py:232 msgid "Male" msgstr "Homme" -#: apps/wei/models.py:199 apps/wei/models.py:209 +#: apps/wei/models.py:223 apps/wei/models.py:233 msgid "Female" msgstr "Femme" -#: apps/wei/models.py:200 +#: apps/wei/models.py:224 msgid "Non binary" msgstr "Non-binaire" -#: apps/wei/models.py:202 apps/wei/templates/wei/attribute_bus_1A.html:22 +#: apps/wei/models.py:226 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:210 +#: apps/wei/models.py:234 msgid "Unisex" msgstr "Unisexe" -#: apps/wei/models.py:213 apps/wei/templates/wei/weimembership_form.html:58 +#: apps/wei/models.py:237 apps/wei/templates/wei/weimembership_form.html:58 msgid "clothing cut" msgstr "coupe de vêtement" -#: apps/wei/models.py:226 apps/wei/templates/wei/weimembership_form.html:61 +#: apps/wei/models.py:250 apps/wei/templates/wei/weimembership_form.html:61 msgid "clothing size" msgstr "taille de vêtement" -#: apps/wei/models.py:232 +#: apps/wei/models.py:256 msgid "health issues" msgstr "problèmes de santé" -#: apps/wei/models.py:237 apps/wei/templates/wei/weimembership_form.html:70 +#: apps/wei/models.py:261 apps/wei/templates/wei/weimembership_form.html:70 msgid "emergency contact name" msgstr "nom du contact en cas d'urgence" -#: apps/wei/models.py:238 +#: apps/wei/models.py:262 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:243 apps/wei/templates/wei/weimembership_form.html:73 +#: apps/wei/models.py:267 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:248 apps/wei/templates/wei/weimembership_form.html:52 +#: apps/wei/models.py:272 apps/wei/templates/wei/weimembership_form.html:52 msgid "first year" msgstr "première année" -#: apps/wei/models.py:249 +#: apps/wei/models.py:273 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:254 +#: apps/wei/models.py:278 msgid "registration information" msgstr "informations sur l'inscription" -#: apps/wei/models.py:255 +#: apps/wei/models.py:279 msgid "" "Information about the registration (buses for old members, survey for the " "new members), encoded in JSON" @@ -3156,27 +3207,27 @@ msgstr "" "Informations sur l'inscription (bus pour les 2A+, questionnaire pour les " "1A), encodées en JSON" -#: apps/wei/models.py:261 +#: apps/wei/models.py:285 msgid "WEI User" msgstr "Participant·e au WEI" -#: apps/wei/models.py:262 +#: apps/wei/models.py:286 msgid "WEI Users" msgstr "Participant·e·s au WEI" -#: apps/wei/models.py:334 +#: apps/wei/models.py:358 msgid "team" msgstr "équipe" -#: apps/wei/models.py:344 +#: apps/wei/models.py:368 msgid "WEI registration" msgstr "Inscription au WEI" -#: apps/wei/models.py:348 +#: apps/wei/models.py:372 msgid "WEI membership" msgstr "Adhésion au WEI" -#: apps/wei/models.py:349 +#: apps/wei/models.py:373 msgid "WEI memberships" msgstr "Adhésions au WEI" @@ -3204,8 +3255,8 @@ msgstr "Année" msgid "preferred bus" msgstr "bus préféré" -#: apps/wei/tables.py:210 apps/wei/templates/wei/bus_detail.html:32 -#: apps/wei/templates/wei/busteam_detail.html:50 +#: apps/wei/tables.py:210 apps/wei/templates/wei/bus_detail.html:38 +#: apps/wei/templates/wei/busteam_detail.html:52 msgid "Teams" msgstr "Équipes" @@ -3238,8 +3289,6 @@ msgid "Attribute first year members into buses" msgstr "Attribuer les 1A dans les bus" #: apps/wei/templates/wei/1A_list.html:15 -#, fuzzy -#| msgid "Start attribution!" msgid "Start attribution !" msgstr "Démarrer l'attribution !" @@ -3249,8 +3298,6 @@ msgstr "Répartition des bus" #: apps/wei/templates/wei/attribute_bus_1A.html:28 #: apps/wei/templates/wei/weimembership_form.html:67 -#, fuzzy -#| msgid "health issues" msgid "health issues or specific diet" msgstr "problèmes de santé" @@ -3270,53 +3317,64 @@ msgstr "Retour à la liste principale" msgid "WEI fee (paid students)" msgstr "Prix du WEI (élèves)" -#: apps/wei/templates/wei/base.html:47 apps/wei/templates/wei/base.html:54 -msgid "The BDE membership is included in the WEI registration." -msgstr "L'adhésion au BDE est offerte avec l'inscription au WEI." - -#: apps/wei/templates/wei/base.html:51 +#: apps/wei/templates/wei/base.html:47 msgid "WEI fee (unpaid students)" msgstr "Prix du WEI (étudiant⋅es)" -#: apps/wei/templates/wei/base.html:76 +#: apps/wei/templates/wei/base.html:53 +#, fuzzy +#| msgid "total amount" +msgid "Caution amount" +msgstr "montant total" + +#: apps/wei/templates/wei/base.html:74 msgid "WEI list" msgstr "Liste des WEI" -#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:540 +#: apps/wei/templates/wei/base.html:79 apps/wei/views.py:550 msgid "Register 1A" msgstr "Inscrire un⋅e 1A" -#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:626 +#: apps/wei/templates/wei/base.html:83 apps/wei/views.py:644 msgid "Register 2A+" msgstr "Inscrire un⋅e 2A+" -#: apps/wei/templates/wei/base.html:93 +#: apps/wei/templates/wei/base.html:91 msgid "Add bus" msgstr "Ajouter un bus" -#: apps/wei/templates/wei/base.html:97 +#: apps/wei/templates/wei/base.html:95 msgid "View WEI" msgstr "Voir le WEI" -#: apps/wei/templates/wei/bus_detail.html:22 -#: apps/wei/templates/wei/busteam_detail.html:22 +#: apps/wei/templates/wei/bus_detail.html:21 +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" + +#: apps/wei/templates/wei/bus_detail.html:28 +#: apps/wei/templates/wei/busteam_detail.html:24 msgid "Add team" msgstr "Ajouter une équipe" -#: apps/wei/templates/wei/bus_detail.html:45 +#: apps/wei/templates/wei/bus_detail.html:51 msgid "Members" msgstr "Membres" -#: apps/wei/templates/wei/bus_detail.html:54 -#: apps/wei/templates/wei/busteam_detail.html:60 +#: 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" 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:1046 -#: apps/wei/views.py:1101 apps/wei/views.py:1148 +#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:1159 +#: apps/wei/views.py:1214 apps/wei/views.py:1261 msgid "Survey WEI" msgstr "Questionnaire WEI" @@ -3361,7 +3419,7 @@ msgstr "Inscriptions non validées" msgid "Attribute buses" msgstr "Répartition dans les bus" -#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:80 +#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:82 msgid "Create WEI" msgstr "Créer un WEI" @@ -3442,28 +3500,42 @@ msgstr "" "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 -#, python-format -msgid "" -"The note don't have enough money (%(balance)s, %(pretty_fee)s required). The " -"registration may fail if you don't credit the note now." -msgstr "" -"La note n'a pas assez d'argent (%(balance)s, %(pretty_fee)s requis). " -"L'inscription peut échouer si vous ne rechargez pas la note dès maintenant." +#, fuzzy, python-format +#| msgid "membership fee (paid students)" +msgid "Membership fees: %(amount)s" +msgstr "cotisation pour adhérer (normalien·ne élève)" -#: apps/wei/templates/wei/weimembership_form.html:157 +#: apps/wei/templates/wei/weimembership_form.html:153 #, python-format -msgid "" -"The note has enough money (%(pretty_fee)s required), the registration is " -"possible." -msgstr "" -"La note a assez d'argent (%(pretty_fee)s requis), l'inscription est possible." +msgid "Deposit (by Note transaction): %(amount)s" +msgstr "Caution (par transaction) : %(amount)s" -#: apps/wei/templates/wei/weimembership_form.html:166 +#: 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 +#, python-format +msgid "Deposit (by check): %(amount)s" +msgstr "Caution (par chèque) : %(amount)s" + +#: apps/wei/templates/wei/weimembership_form.html:168 +#, python-format +msgid "Current balance: %(balance)s" +msgstr "Solde actuel : %(balance)s" + +#: apps/wei/templates/wei/weimembership_form.html:176 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:174 +#: apps/wei/templates/wei/weimembership_form.html:184 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 " @@ -3495,72 +3567,70 @@ msgid "There is no pre-registration found with this pattern." msgstr "Il n'y a pas de pré-inscription en attente avec cette entrée." #: apps/wei/templates/wei/weiregistration_list.html:27 -#, fuzzy -#| msgid "View validated membershipis..." msgid "View validated memberships..." msgstr "Voir les adhésions validées..." -#: apps/wei/views.py:59 +#: apps/wei/views.py:61 msgid "Search WEI" msgstr "Chercher un WEI" -#: apps/wei/views.py:110 +#: apps/wei/views.py:112 msgid "WEI Detail" msgstr "Détails du WEI" -#: apps/wei/views.py:210 +#: apps/wei/views.py:212 msgid "View members of the WEI" msgstr "Voir les membres du WEI" -#: apps/wei/views.py:243 +#: apps/wei/views.py:245 msgid "Find WEI Membership" msgstr "Trouver une adhésion au WEI" -#: apps/wei/views.py:253 +#: apps/wei/views.py:255 msgid "View registrations to the WEI" msgstr "Voir les inscriptions au WEI" -#: apps/wei/views.py:282 +#: apps/wei/views.py:284 msgid "Find WEI Registration" msgstr "Trouver une inscription au WEI" -#: apps/wei/views.py:293 +#: apps/wei/views.py:295 msgid "Update the WEI" msgstr "Modifier le WEI" -#: apps/wei/views.py:314 +#: apps/wei/views.py:316 msgid "Create new bus" msgstr "Ajouter un nouveau bus" -#: apps/wei/views.py:352 +#: apps/wei/views.py:354 msgid "Update bus" msgstr "Modifier le bus" -#: apps/wei/views.py:384 +#: apps/wei/views.py:386 msgid "Manage bus" msgstr "Gérer le bus" -#: apps/wei/views.py:411 +#: apps/wei/views.py:413 msgid "Create new team" msgstr "Créer une nouvelle équipe" -#: apps/wei/views.py:451 +#: apps/wei/views.py:457 msgid "Update team" msgstr "Modifier l'équipe" -#: apps/wei/views.py:482 +#: apps/wei/views.py:492 msgid "Manage WEI team" msgstr "Gérer l'équipe WEI" -#: apps/wei/views.py:504 +#: apps/wei/views.py:514 msgid "Register first year student to the WEI" msgstr "Inscrire un⋅e 1A au WEI" -#: apps/wei/views.py:562 apps/wei/views.py:661 +#: apps/wei/views.py:580 apps/wei/views.py:689 msgid "This user is already registered to this WEI." msgstr "Cette personne est déjà inscrite au WEI." -#: apps/wei/views.py:567 +#: apps/wei/views.py:585 msgid "" "This user can't be in her/his first year since he/she has already " "participated to a WEI." @@ -3568,38 +3638,96 @@ 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:590 +#: apps/wei/views.py:608 msgid "Register old student to the WEI" msgstr "Inscrire un⋅e 2A+ au WEI" -#: apps/wei/views.py:645 apps/wei/views.py:733 +#: apps/wei/views.py:663 apps/wei/views.py:768 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:697 +#: apps/wei/views.py:676 apps/wei/views.py:785 +msgid "Choose how you want to pay the deposit" +msgstr "" + +#: apps/wei/views.py:728 msgid "Update WEI Registration" msgstr "Modifier l'inscription WEI" -#: apps/wei/views.py:807 +#: apps/wei/views.py:810 +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 +#, 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 msgid "Delete WEI registration" msgstr "Supprimer l'inscription WEI" -#: apps/wei/views.py:818 +#: apps/wei/views.py:881 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:836 +#: apps/wei/views.py:899 msgid "Validate WEI registration" msgstr "Valider l'inscription WEI" -#: apps/wei/views.py:1241 +#: apps/wei/views.py:985 +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 +msgid "Create deposit transaction" +msgstr "Créer une transaction de caution" + +#: apps/wei/views.py:992 +#, 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 +#, 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€" + +#: apps/wei/views.py:1140 +#, fuzzy, python-format +#| msgid "total amount" +msgid "Caution %(name)s" +msgstr "montant total" + +#: apps/wei/views.py:1354 msgid "Attribute buses to first year members" msgstr "Répartir les 1A dans les bus" -#: apps/wei/views.py:1266 +#: apps/wei/views.py:1380 msgid "Attribute bus" msgstr "Attribuer un bus" +#: apps/wei/views.py:1420 +msgid "" +"No first year student without a bus found. Either all of them have a bus, or " +"none has filled the survey yet." +msgstr "" + #: apps/wrapped/apps.py:10 msgid "wrapped" msgstr "wrapped" @@ -4161,87 +4289,21 @@ msgstr "" "d'adhésion. Vous devez également valider votre adresse email en suivant le " "lien que vous avez reçu." -#, python-brace-format -#~ msgid "QR-code number {qr_code_number}" -#~ msgstr "numéro du QR-code {qr_code_number}" - -#~ msgid "was eaten" -#~ msgstr "a été mangé" - -#~ msgid "is active" -#~ msgstr "est en cours" - -#~ msgid "foods" -#~ msgstr "bouffes" - -#~ msgid "Arrival date" -#~ msgstr "Date d'arrivée" - -#~ msgid "Active" -#~ msgstr "Actif" - -#~ msgid "Eaten" -#~ msgstr "Mangé" - -#~ msgid "number" -#~ msgstr "numéro" - -#~ msgid "View details" -#~ msgstr "Voir plus" - -#~ msgid "Ready" -#~ msgstr "Prêt" - -#~ msgid "Creation date" -#~ msgstr "Date de création" - -#~ msgid "Ingredients" -#~ msgstr "Ingrédients" - -#~ msgid "Open" -#~ msgstr "Open" - -#~ msgid "All meals" -#~ msgstr "Tout les plats" - -#~ msgid "There is no meal." -#~ msgstr "Il n'y a pas de plat" - -#~ msgid "The product is already prepared" -#~ msgstr "Le produit est déjà prêt" - -#~ msgid "Add a new basic food with QRCode" -#~ msgstr "Ajouter un nouvel ingrédient avec un QR-code" - -#~ msgid "QRCode" -#~ msgstr "QR-code" - -#~ msgid "Add a new meal" -#~ msgstr "Ajouter un nouveau plat" - -#~ msgid "Update a meal" -#~ msgstr "Modifier le plat" - -#, fuzzy -#~| msgid "invalidate" -#~ msgid "Enter a valid color." -#~ msgstr "dévalider" - -#, fuzzy -#~| msgid "invalidate" -#~ msgid "Enter a valid value." -#~ msgstr "dévalider" - -#, fuzzy -#~| msgid "Invitation" -#~ msgid "Syndication" -#~ msgstr "Invitation" +#, fuzzy, python-format +#~| msgid "Creation date" +#~ msgid "Deposit %(name)s" +#~ msgstr "Caution %(name)s" #, fuzzy #~| msgid "There is no results." #~ msgid "That page contains no results" #~ msgstr "Il n'y a pas de résultat." +#, fuzzy +#~| msgid "invalidate" +#~ msgid "Enter a valid value." +#~ msgstr "dévalider" + #, fuzzy #~| msgid "invalidate" #~ msgid "Enter a valid URL." @@ -4282,6 +4344,11 @@ msgstr "" #~ msgid "%(model_name)s with this %(field_labels)s already exists." #~ msgstr "Un modèle de transaction avec un nom similaire existe déjà" +#, fuzzy, python-format +#~| msgid "This activity is not validated yet." +#~ msgid "Value %(value)r is not a valid choice." +#~ msgstr "Cette activité n'est pas encore validée." + #, fuzzy #~| msgid "This image cannot be loaded." #~ msgid "This field cannot be null." @@ -4327,11 +4394,26 @@ msgstr "" #~ msgid "IP address" #~ msgstr "Adresse IP" +#, fuzzy, python-format +#~| msgid "This activity is not validated yet." +#~ msgid "“%(value)s” is not a valid UUID." +#~ msgstr "Cette activité n'est pas encore validée." + #, fuzzy #~| msgid "Invoice identifier" #~ msgid "Universally unique identifier" #~ msgstr "Numéro de facture" +#, fuzzy +#~| msgid "Object" +#~ msgid "A JSON object" +#~ msgstr "Objet" + +#, fuzzy +#~| msgid "This address must be valid." +#~ msgid "Value must be valid JSON." +#~ msgstr "Cette adresse doit être valide." + #, fuzzy, python-format #~| msgid "A template with this name already exist" #~ msgid "%(model)s instance with %(field)s %(value)r does not exist." @@ -4377,9 +4459,19 @@ msgstr "" #~ msgid "Enter a valid UUID." #~ msgstr "dévalider" +#, fuzzy +#~| msgid "invalidate" +#~ msgid "Enter a valid JSON." +#~ msgstr "dévalider" + +#, fuzzy +#~| msgid "order" +#~ msgid "Order" +#~ msgstr "consigne" + #, fuzzy, python-format #~| msgid "This activity is not validated yet." -#~ msgid "\"%(pk)s\" is not a valid value." +#~ msgid "“%(pk)s” is not a valid value." #~ msgstr "Cette activité n'est pas encore validée." #, fuzzy @@ -4392,11 +4484,21 @@ msgstr "" #~ msgid "Change" #~ msgstr "modifier" +#, fuzzy +#~| msgid "Wrapped" +#~ msgid "Wed" +#~ msgstr "Wrapped" + #, fuzzy #~| msgid "Search" #~ msgid "March" #~ msgstr "Recherche" +#, fuzzy +#~| msgid "day" +#~ msgid "May" +#~ msgstr "jour" + #, fuzzy #~| msgid "member" #~ msgid "September" @@ -4422,23 +4524,50 @@ msgstr "" #~ msgid "feb" #~ msgstr "cotisation" +#, fuzzy +#~| msgid "day" +#~ msgid "may" +#~ msgstr "jour" + +#, fuzzy +#~| msgid "add" +#~ msgid "jun" +#~ msgstr "ajouter" + #, fuzzy #~| msgid "product" #~ msgid "oct" #~ msgstr "produit" +#, fuzzy +#~| msgid "bde" +#~ msgid "dec" +#~ msgstr "bde" + #, fuzzy #~| msgid "Search" #~ msgctxt "abbrev. month" #~ msgid "March" #~ msgstr "Recherche" +#, fuzzy +#~| msgid "day" +#~ msgctxt "abbrev. month" +#~ msgid "May" +#~ msgstr "jour" + #, fuzzy #~| msgid "Search" #~ msgctxt "alt. month" #~ msgid "March" #~ msgstr "Recherche" +#, fuzzy +#~| msgid "day" +#~ msgctxt "alt. month" +#~ msgid "May" +#~ msgstr "jour" + #, fuzzy #~| msgid "member" #~ msgctxt "alt. month" @@ -4462,13 +4591,25 @@ msgstr "" #~ msgid "This is not a valid IPv6 address." #~ msgstr "Cette activité n'est pas encore validée." +#, fuzzy +#~| msgid "hour" +#~ msgid "or" +#~ msgstr "heure" + #, fuzzy, python-format #~| msgid "year" -#~ msgid "%d year" -#~ msgid_plural "%d years" +#~ msgid "%(num)d year" +#~ msgid_plural "%(num)d years" #~ msgstr[0] "année" #~ msgstr[1] "année" +#, fuzzy, python-format +#~| msgid "minute" +#~ msgid "%(num)d minute" +#~ msgid_plural "%(num)d minutes" +#~ msgstr[0] "minute" +#~ msgstr[1] "minute" + #, fuzzy #~| msgid "No reason specified" #~ msgid "No year specified" @@ -4494,6 +4635,11 @@ msgstr "" #~ msgid "Confidential" #~ msgstr "Secret client" +#, fuzzy +#~| msgid "public" +#~ msgid "Public" +#~ msgstr "public" + #, fuzzy #~| msgid "Authorization:" #~ msgid "Authorization code" @@ -4526,9 +4672,101 @@ msgstr "" #, fuzzy #~| msgid "Application requires following permissions:" -#~ msgid "Application requires following permissions" +#~ 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." + +#, python-format +#~ msgid "" +#~ "The note don't have enough money (%(balance)s, %(pretty_fee)s required). " +#~ "The registration may fail if you don't credit the note now." +#~ msgstr "" +#~ "La note n'a pas assez d'argent (%(balance)s, %(pretty_fee)s requis). " +#~ "L'inscription peut échouer si vous ne rechargez pas la note dès " +#~ "maintenant." + +#, python-format +#~ msgid "" +#~ "The note has enough money (%(pretty_fee)s required), the registration is " +#~ "possible." +#~ msgstr "" +#~ "La note a assez d'argent (%(pretty_fee)s requis), l'inscription est " +#~ "possible." + +#, fuzzy +#~| msgid "You don't have the right to delete this WEI registration." +#~ msgid "You don't have the permission to validate registrations" +#~ msgstr "" +#~ "Vous n'avez pas la permission de supprimer cette inscription au WEI." + +#, python-brace-format +#~ msgid "QR-code number {qr_code_number}" +#~ msgstr "numéro du QR-code {qr_code_number}" + +#~ msgid "was eaten" +#~ msgstr "a été mangé" + +#~ msgid "is active" +#~ msgstr "est en cours" + +#~ msgid "foods" +#~ msgstr "bouffes" + +#~ msgid "Arrival date" +#~ msgstr "Date d'arrivée" + +#~ msgid "Active" +#~ msgstr "Actif" + +#~ msgid "Eaten" +#~ msgstr "Mangé" + +#~ msgid "number" +#~ msgstr "numéro" + +#~ msgid "View details" +#~ msgstr "Voir plus" + +#~ msgid "Ready" +#~ msgstr "Prêt" + +#~ msgid "Ingredients" +#~ msgstr "Ingrédients" + +#~ msgid "Open" +#~ msgstr "Open" + +#~ msgid "All meals" +#~ msgstr "Tout les plats" + +#~ msgid "There is no meal." +#~ msgstr "Il n'y a pas de plat" + +#~ msgid "The product is already prepared" +#~ msgstr "Le produit est déjà prêt" + +#~ msgid "Add a new basic food with QRCode" +#~ msgstr "Ajouter un nouvel ingrédient avec un QR-code" + +#~ msgid "QRCode" +#~ msgstr "QR-code" + +#~ msgid "Add a new meal" +#~ msgstr "Ajouter un nouveau plat" + +#~ msgid "Update a meal" +#~ msgstr "Modifier le plat" + +#, fuzzy +#~| msgid "invalidate" +#~ msgid "Enter a valid color." +#~ msgstr "dévalider" + #~ msgid "pasta" #~ msgstr "pâtes" diff --git a/note_kfet/inputs.py b/note_kfet/inputs.py index a05b61e4..6de3c7d9 100644 --- a/note_kfet/inputs.py +++ b/note_kfet/inputs.py @@ -63,8 +63,16 @@ class ColorWidget(Widget): def format_value(self, value): if value is None: value = 0xFFFFFF - return "#{:06X}".format(value) + if isinstance(value, str): + return value # Assume it's already a hex string like "#FFAA33" + try: + return "#{:06X}".format(value) + except Exception: + return "#FFFFFF" + def value_from_datadict(self, data, files, name): val = super().value_from_datadict(data, files, name) - return int(val[1:], 16) + if val: + return int(val[1:], 16) + return None \ No newline at end of file diff --git a/note_kfet/templates/colorfield/color.html b/note_kfet/templates/colorfield/color.html new file mode 100644 index 00000000..5c0457c5 --- /dev/null +++ b/note_kfet/templates/colorfield/color.html @@ -0,0 +1,5 @@ + \ No newline at end of file