diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cada9068..2181b4b5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,8 +16,8 @@ py37-django22: apt-get install --no-install-recommends -t buster-backports -y python3-django python3-django-crispy-forms python3-django-extensions python3-django-filters python3-django-polymorphic - python3-djangorestframework python3-django-cas-server python3-psycopg2 python3-pil - python3-babel python3-lockfile python3-pip python3-phonenumbers + python3-djangorestframework python3-django-oauth-toolkit python3-psycopg2 python3-pil + python3-babel python3-lockfile python3-pip python3-phonenumbers python3-memcache python3-bs4 python3-setuptools tox texlive-xetex script: tox -e py37-django22 @@ -33,8 +33,8 @@ py38-django22: apt-get install --no-install-recommends -y python3-django python3-django-crispy-forms python3-django-extensions python3-django-filters python3-django-polymorphic - python3-djangorestframework python3-django-cas-server python3-psycopg2 python3-pil - python3-babel python3-lockfile python3-pip python3-phonenumbers + python3-djangorestframework python3-django-oauth-toolkit python3-psycopg2 python3-pil + python3-babel python3-lockfile python3-pip python3-phonenumbers python3-memcache python3-bs4 python3-setuptools tox texlive-xetex script: tox -e py38-django22 diff --git a/Dockerfile b/Dockerfile index 0dd1ce8b..95a62437 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,8 +8,8 @@ RUN apt-get update && \ apt-get install --no-install-recommends -t buster-backports -y \ python3-django python3-django-crispy-forms \ python3-django-extensions python3-django-filters python3-django-polymorphic \ - python3-djangorestframework python3-django-cas-server python3-psycopg2 python3-pil \ - python3-babel python3-lockfile python3-pip python3-phonenumbers ipython3 \ + python3-djangorestframework python3-django-oauth-toolkit python3-psycopg2 python3-pil \ + python3-babel python3-lockfile python3-pip python3-phonenumbers python3-memcache ipython3 \ python3-bs4 python3-setuptools \ uwsgi uwsgi-plugin-python3 \ texlive-xetex gettext libjs-bootstrap4 fonts-font-awesome && \ diff --git a/README.md b/README.md index f2ada2a8..77166649 100644 --- a/README.md +++ b/README.md @@ -93,10 +93,10 @@ Sinon vous pouvez suivre les étapes décrites ci-dessous. $ sudo apt install --no-install-recommends -t buster-backports -y \ python3-django python3-django-crispy-forms \ python3-django-extensions python3-django-filters python3-django-polymorphic \ - python3-djangorestframework python3-django-cas-server python3-psycopg2 python3-pil \ - python3-babel python3-lockfile python3-pip python3-phonenumbers ipython3 \ + python3-djangorestframework python3-django-oauth-toolkit python3-psycopg2 python3-pil \ + python3-babel python3-lockfile python3-pip python3-phonenumbers python3-memcache ipython3 \ python3-bs4 python3-setuptools \ - uwsgi uwsgi-plugin-python3 \ + memcached uwsgi uwsgi-plugin-python3 \ texlive-xetex gettext libjs-bootstrap4 fonts-font-awesome \ nginx python3-venv git acl ``` diff --git a/ansible/roles/1-apt-basic/tasks/main.yml b/ansible/roles/1-apt-basic/tasks/main.yml index 1ca1b3d6..9c01dd97 100644 --- a/ansible/roles/1-apt-basic/tasks/main.yml +++ b/ansible/roles/1-apt-basic/tasks/main.yml @@ -23,13 +23,14 @@ - python3-babel - python3-bs4 - python3-django - - python3-django-cas-server - python3-django-crispy-forms - python3-django-extensions - python3-django-filters + - python3-django-oauth-toolkit - python3-django-polymorphic - python3-djangorestframework - python3-lockfile + - python3-memcache - python3-phonenumbers - python3-pil - python3-pip @@ -40,6 +41,9 @@ # LaTeX (PDF generation) - texlive-xetex + # Cache server + - memcached + # WSGI server - uwsgi - uwsgi-plugin-python3 diff --git a/apps/activity/views.py b/apps/activity/views.py index 2f5c7e0b..4a152e07 100644 --- a/apps/activity/views.py +++ b/apps/activity/views.py @@ -12,8 +12,10 @@ from django.db.models import F, Q from django.http import HttpResponse from django.urls import reverse_lazy from django.utils import timezone +from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _ from django.views import View +from django.views.decorators.cache import cache_page from django.views.generic import DetailView, TemplateView, UpdateView from django_tables2.views import SingleTableView from note.models import Alias, NoteSpecial, NoteUser @@ -288,6 +290,8 @@ class ActivityEntryView(LoginRequiredMixin, TemplateView): return context +# Cache for 1 hour +@method_decorator(cache_page(60 * 60), name='dispatch') class CalendarView(View): """ Render an ICS calendar with all valid activities. diff --git a/apps/member/templates/member/add_members.html b/apps/member/templates/member/add_members.html index fa0a958c..4fd1a830 100644 --- a/apps/member/templates/member/add_members.html +++ b/apps/member/templates/member/add_members.html @@ -13,15 +13,29 @@ SPDX-License-Identifier: GPL-3.0-or-later {% if additional_fee_renewal %}
{% if renewal %} - {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} - The user is not a member of the club·s {{ clubs }}. An additional fee of {{ pretty_fee }} - will be charged to renew automatically the membership in this/these club·s. - {% endblocktrans %} + {% if club.name == "Kfet" %} {# Auto-renewal #} + {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} + The user is not a member of the club·s {{ clubs }}. An additional fee of {{ pretty_fee }} + will be charged to renew automatically the membership in this/these club·s. + {% endblocktrans %} + {% else %} + {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} + The user is not a member of the club·s {{ clubs }}. Please create the required memberships, + otherwise it will fail. + {% endblocktrans %} + {% endif %} {% else %} - {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} - This club has parents {{ clubs }}. An additional fee of {{ pretty_fee }} - will be charged to adhere automatically to this/these club·s. - {% endblocktrans %} + {% if club.name == "Kfet" %} + {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} + This club has parents {{ clubs }}. An additional fee of {{ pretty_fee }} + will be charged to adhere automatically to this/these club·s. + {% endblocktrans %} + {% else %} + {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} + This club has parents {{ clubs }}. Please make sure that the user is a member of this or these club·s, + otherwise the creation of this membership will fail. + {% endblocktrans %} + {% endif %} {% endif %}
{% endif %} diff --git a/apps/member/views.py b/apps/member/views.py index 3000562c..6c4673fe 100644 --- a/apps/member/views.py +++ b/apps/member/views.py @@ -166,6 +166,8 @@ class UserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): # Check permissions to see if the authenticated user can lock/unlock the note with transaction.atomic(): modified_note = NoteUser.objects.get(pk=user.note.pk) + # Don't log these tests + modified_note._no_signal = True modified_note.is_active = True modified_note.inactivity_reason = 'manual' context["can_lock_note"] = user.note.is_active and PermissionBackend\ @@ -178,6 +180,7 @@ class UserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): context["can_force_lock"] = user.note.is_active and PermissionBackend\ .check_perm(self.request.user, "note.change_note_is_active", modified_note) old_note._force_save = True + old_note._no_signal = True old_note.save() modified_note.refresh_from_db() modified_note.is_active = True @@ -610,6 +613,9 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): bank = form.cleaned_data["bank"] soge = form.cleaned_data["soge"] and not user.profile.soge and (club.name == "BDE" or club.name == "Kfet") + if not credit_type: + credit_amount = 0 + if not soge and user.note.balance + credit_amount < fee and not Membership.objects.filter( club__name="Kfet", user=user, @@ -631,6 +637,16 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): form.add_error('user', _('User is already a member of the club')) error = True + # Must join the parent club before joining this club, except for the Kfet club where it can be at the same time. + if club.name != "Kfet" and club.parent_club and not Membership.objects.filter( + user=form.instance.user, + club=club.parent_club, + date_start__lte=club.parent_club.membership_start, + date_end__gte=club.parent_club.membership_end, + ).exists(): + form.add_error('user', _('User is not a member of the parent club') + ' ' + club.parent_club.name) + error = True + if club.membership_start and form.instance.date_start < club.membership_start: form.add_error('user', _("The membership must start after {:%m-%d-%Y}.") .format(form.instance.club.membership_start)) diff --git a/apps/note/static/note/js/transfer.js b/apps/note/static/note/js/transfer.js index db9cf9ac..f6b23b29 100644 --- a/apps/note/static/note/js/transfer.js +++ b/apps/note/static/note/js/transfer.js @@ -388,7 +388,7 @@ $('#btn_transfer').click(function () { alias = sources_notes_display[0].name source_id = user_note.id dest_id = special_note - reason = 'Retrait ' + $('#credit_type option:selected').text().toLowerCase() + reason = 'Retrait ' + $('#debit_type option:selected').text().toLowerCase() if (given_reason.length > 0) { reason += ' (' + given_reason + ')' } } $.post('/api/note/transaction/transaction/', diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index 64c7db5a..49d595ac 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -2775,6 +2775,22 @@ "description": "Modifier n'importe quel profil non encore inscrit" } }, + { + "model": "permission.permission", + "pk": 178, + "fields": { + "model": [ + "note", + "alias" + ], + "query": "{}", + "type": "view", + "mask": 3, + "field": "", + "permanent": false, + "description": "Voir tous les alias, y compris ceux des non adhérents" + } + }, { "model": "permission.role", "pk": 1, @@ -2986,7 +3002,8 @@ 174, 175, 176, - 177 + 177, + 178 ] } }, @@ -3168,7 +3185,8 @@ 174, 175, 176, - 177 + 177, + 178 ] } }, diff --git a/apps/permission/models.py b/apps/permission/models.py index 48d1b19a..17214894 100644 --- a/apps/permission/models.py +++ b/apps/permission/models.py @@ -43,6 +43,7 @@ class InstancedPermission: obj = copy(obj) obj.pk = 0 with transaction.atomic(): + sid = transaction.savepoint() for o in self.model.model_class().objects.filter(pk=0).all(): o._force_delete = True Model.delete(o) @@ -62,8 +63,10 @@ class InstancedPermission: Model.save(obj, force_insert=True) ret = self.model.model_class().objects.filter(self.query & Q(pk=0)).exists() # Delete testing object + obj._no_signal = True obj._force_delete = True Model.delete(obj) + transaction.savepoint_rollback(sid) return ret diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 4a12dbed..b3e882a2 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: 2020-09-13 12:35+0200\n" +"POT-Creation-Date: 2020-09-19 22:00+0200\n" "PO-Revision-Date: 2020-09-13 12:39+0200\n" "Last-Translator: elkmaennchen \n" "Language-Team: \n" @@ -18,33 +18,33 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.3\n" -#: apps/activity/apps.py:10 apps/activity/models.py:150 -#: apps/activity/models.py:166 +#: apps/activity/apps.py:10 apps/activity/models.py:151 +#: apps/activity/models.py:167 msgid "activity" msgstr "Veranstaltung" -#: apps/activity/forms.py:35 apps/activity/models.py:131 +#: apps/activity/forms.py:35 apps/activity/models.py:132 msgid "The end date must be after the start date." msgstr "Das Abschlussdatum muss nach das Anfangsdatum sein." -#: apps/activity/forms.py:76 apps/activity/models.py:268 +#: apps/activity/forms.py:76 apps/activity/models.py:270 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:79 apps/activity/models.py:271 +#: apps/activity/forms.py:79 apps/activity/models.py:273 msgid "This activity is not validated yet." msgstr "Diese Veranstaltung ist noch nicht bestätigt." -#: apps/activity/forms.py:89 apps/activity/models.py:279 +#: apps/activity/forms.py:89 apps/activity/models.py:281 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:93 apps/activity/models.py:283 +#: apps/activity/forms.py:93 apps/activity/models.py:285 msgid "This person is already invited." msgstr "Diese Person wurde schon eingeladen." -#: apps/activity/forms.py:97 apps/activity/models.py:287 +#: apps/activity/forms.py:97 apps/activity/models.py:289 msgid "You can't invite more than 3 people to this activity." msgstr "Sie dürfen höchstens 3 Leute zu dieser Veranstaltung einladen." @@ -52,9 +52,9 @@ msgstr "Sie dürfen höchstens 3 Leute zu dieser Veranstaltung einladen." #: apps/member/models.py:199 #: apps/member/templates/member/includes/club_info.html:4 #: apps/member/templates/member/includes/profile_info.html:4 -#: apps/note/models/notes.py:253 apps/note/models/transactions.py:26 -#: apps/note/models/transactions.py:46 apps/note/models/transactions.py:296 -#: apps/permission/models.py:329 +#: apps/note/models/notes.py:260 apps/note/models/transactions.py:26 +#: apps/note/models/transactions.py:46 apps/note/models/transactions.py:297 +#: apps/permission/models.py:330 #: apps/registration/templates/registration/future_profile_detail.html:16 #: apps/wei/models.py:66 apps/wei/models.py:118 #: apps/wei/templates/wei/base.html:26 @@ -105,13 +105,13 @@ msgstr "Wo findet die Veranstaltung statt ? (z.B Kfet)" #: apps/activity/models.py:83 #: apps/activity/templates/activity/includes/activity_info.html:22 -#: apps/note/models/notes.py:229 apps/note/models/transactions.py:66 +#: apps/note/models/notes.py:236 apps/note/models/transactions.py:66 #: apps/permission/models.py:164 msgid "type" msgstr "Type" -#: apps/activity/models.py:89 apps/logs/models.py:22 apps/member/models.py:304 -#: apps/note/models/notes.py:144 apps/treasury/models.py:276 +#: apps/activity/models.py:89 apps/logs/models.py:22 apps/member/models.py:305 +#: apps/note/models/notes.py:149 apps/treasury/models.py:278 #: apps/treasury/templates/treasury/sogecredit_detail.html:14 #: apps/wei/models.py:160 apps/wei/templates/wei/survey.html:15 msgid "user" @@ -158,75 +158,75 @@ msgstr "gültig" msgid "open" msgstr "geöffnet" -#: apps/activity/models.py:151 +#: apps/activity/models.py:152 msgid "activities" msgstr "Veranstaltungen" -#: apps/activity/models.py:171 +#: apps/activity/models.py:172 msgid "entry time" msgstr "Eintrittzeit" -#: apps/activity/models.py:177 apps/note/apps.py:14 +#: apps/activity/models.py:178 apps/note/apps.py:14 #: apps/note/models/notes.py:78 msgid "note" msgstr "Note" -#: apps/activity/models.py:188 +#: apps/activity/models.py:189 #: apps/activity/templates/activity/activity_entry.html:46 msgid "entry" msgstr "Eintritt" -#: apps/activity/models.py:189 +#: apps/activity/models.py:190 #: apps/activity/templates/activity/activity_entry.html:46 msgid "entries" msgstr "Eintritte" -#: apps/activity/models.py:192 +#: apps/activity/models.py:193 #, python-brace-format msgid "Entry for {guest}, invited by {note} to the activity {activity}" msgstr "Eintritt für {guest}, von {note} zur Vanstaltung {activity} eingeladen" -#: apps/activity/models.py:194 +#: apps/activity/models.py:195 #, python-brace-format msgid "Entry for {note} to the activity {activity}" msgstr "Eintritt von {note} zur Veranstaltung {activity}" -#: apps/activity/models.py:201 +#: apps/activity/models.py:202 msgid "Already entered on " msgstr "Schon eingetretten " -#: apps/activity/models.py:201 apps/activity/tables.py:54 +#: apps/activity/models.py:202 apps/activity/tables.py:54 msgid "{:%Y-%m-%d %H:%M:%S}" msgstr "{:%Y-%m-%d %H:%M:%S}" -#: apps/activity/models.py:209 +#: apps/activity/models.py:210 msgid "The balance is negative." msgstr "Kontostand ist im Rot." -#: apps/activity/models.py:239 +#: apps/activity/models.py:240 msgid "last name" msgstr "Nachname" -#: apps/activity/models.py:244 +#: apps/activity/models.py:245 #: apps/member/templates/member/includes/profile_info.html:4 #: apps/registration/templates/registration/future_profile_detail.html:16 #: apps/wei/templates/wei/weimembership_form.html:14 msgid "first name" msgstr "Vorname" -#: apps/activity/models.py:251 +#: apps/activity/models.py:252 msgid "inviter" msgstr "Einlader" -#: apps/activity/models.py:295 +#: apps/activity/models.py:297 msgid "guest" msgstr "Gast" -#: apps/activity/models.py:296 +#: apps/activity/models.py:298 msgid "guests" msgstr "Gäste" -#: apps/activity/models.py:308 +#: apps/activity/models.py:310 msgid "Invitation" msgstr "Einladung" @@ -250,19 +250,19 @@ msgstr "Eingetreten um " msgid "remove" msgstr "entfernen" -#: apps/activity/tables.py:80 apps/note/forms.py:68 apps/treasury/models.py:192 +#: apps/activity/tables.py:80 apps/note/forms.py:68 apps/treasury/models.py:193 msgid "Type" msgstr "Type" -#: apps/activity/tables.py:82 apps/member/forms.py:183 -#: apps/registration/forms.py:81 apps/treasury/forms.py:129 +#: apps/activity/tables.py:82 apps/member/forms.py:185 +#: apps/registration/forms.py:81 apps/treasury/forms.py:130 #: apps/wei/forms/registration.py:96 msgid "Last name" msgstr "Nachname" -#: apps/activity/tables.py:84 apps/member/forms.py:188 +#: apps/activity/tables.py:84 apps/member/forms.py:190 #: apps/note/templates/note/transaction_form.html:134 -#: apps/registration/forms.py:86 apps/treasury/forms.py:131 +#: apps/registration/forms.py:86 apps/treasury/forms.py:132 #: apps/wei/forms/registration.py:101 msgid "First name" msgstr "Vorname" @@ -288,13 +288,13 @@ msgid "Transfer" msgstr "Überweisen" #: apps/activity/templates/activity/activity_entry.html:18 -#: apps/note/models/transactions.py:312 +#: apps/note/models/transactions.py:313 #: apps/note/templates/note/transaction_form.html:21 msgid "Credit" msgstr "Kredit" #: apps/activity/templates/activity/activity_entry.html:21 -#: apps/note/models/transactions.py:312 +#: apps/note/models/transactions.py:313 #: apps/note/templates/note/transaction_form.html:25 msgid "Debit" msgstr "Soll" @@ -309,10 +309,10 @@ msgid "Return to activity page" msgstr "Zurück zur Veranstaltungseite" #: apps/activity/templates/activity/activity_form.html:16 -#: apps/member/templates/member/add_members.html:32 +#: 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:87 apps/treasury/forms.py:141 +#: apps/treasury/forms.py:88 apps/treasury/forms.py:142 #: apps/treasury/templates/treasury/invoice_form.html:74 #: apps/wei/templates/wei/bus_form.html:17 #: apps/wei/templates/wei/busteam_form.html:17 @@ -374,39 +374,39 @@ msgstr "bearbeiten" msgid "Invite" msgstr "Einladen" -#: apps/activity/views.py:33 +#: apps/activity/views.py:34 msgid "Create new activity" msgstr "Neue Veranstaltung schaffen" -#: apps/activity/views.py:63 note_kfet/templates/base.html:88 +#: apps/activity/views.py:65 note_kfet/templates/base.html:88 msgid "Activities" msgstr "Veranstaltungen" -#: apps/activity/views.py:91 +#: apps/activity/views.py:93 msgid "Activity detail" msgstr "Veranstaltunginfo" -#: apps/activity/views.py:111 +#: apps/activity/views.py:113 msgid "Update activity" msgstr "Veranstaltung bearbeiten" -#: apps/activity/views.py:138 +#: apps/activity/views.py:140 msgid "Invite guest to the activity \"{}\"" msgstr "Gast zur Veranstaltung \"{}\" einladen" -#: apps/activity/views.py:172 +#: apps/activity/views.py:175 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:175 +#: apps/activity/views.py:178 msgid "This activity does not support activity entries." msgstr "Diese Veranstaltung braucht nicht Eintritt." -#: apps/activity/views.py:178 +#: apps/activity/views.py:181 msgid "This activity is closed." msgstr "Diese Veranstaltung ist geschlossen." -#: apps/activity/views.py:274 +#: apps/activity/views.py:277 msgid "Entry for activity \"{}\"" msgstr "Eintritt zur Veranstaltung \"{}\"" @@ -483,11 +483,11 @@ msgstr "Mitgliedschaftpreis (bezahlte Studenten)" msgid "membership fee (unpaid students)" msgstr "Mitgliedschaftpreis (unbezahlte Studenten)" -#: apps/member/admin.py:65 apps/member/models.py:315 +#: apps/member/admin.py:65 apps/member/models.py:316 msgid "roles" msgstr "Rollen" -#: apps/member/admin.py:66 apps/member/models.py:329 +#: apps/member/admin.py:66 apps/member/models.py:330 msgid "fee" msgstr "Preis" @@ -495,77 +495,77 @@ msgstr "Preis" msgid "member" msgstr "Mitglied" -#: apps/member/forms.py:23 +#: apps/member/forms.py:24 msgid "Permission mask" msgstr "Berechtigungsmaske" -#: apps/member/forms.py:45 +#: apps/member/forms.py:46 msgid "Report frequency" msgstr "Bericht Frequenz" -#: apps/member/forms.py:47 +#: apps/member/forms.py:48 msgid "Last report date" msgstr "Letzen Bericht Datum" -#: apps/member/forms.py:52 +#: apps/member/forms.py:53 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:77 +#: apps/member/forms.py:79 msgid "select an image" msgstr "Wählen sie ein Bild aus" -#: apps/member/forms.py:78 +#: apps/member/forms.py:80 msgid "Maximal size: 2MB" msgstr "Maximal Größe: 2MB" -#: apps/member/forms.py:103 +#: apps/member/forms.py:105 msgid "This image cannot be loaded." msgstr "Dieses Bild kann nicht geladen werden." -#: apps/member/forms.py:139 apps/member/views.py:98 -#: apps/registration/forms.py:33 apps/registration/views.py:241 +#: apps/member/forms.py:141 apps/member/views.py:100 +#: apps/registration/forms.py:33 apps/registration/views.py:244 msgid "An alias with a similar name already exists." msgstr "Ein ähnliches Alias ist schon benutzt." -#: apps/member/forms.py:162 apps/registration/forms.py:61 +#: apps/member/forms.py:164 apps/registration/forms.py:61 msgid "Inscription paid by Société Générale" msgstr "Mitgliedschaft von der Société Générale bezahlt" -#: apps/member/forms.py:164 apps/registration/forms.py:63 +#: apps/member/forms.py:166 apps/registration/forms.py:63 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:169 apps/registration/forms.py:68 +#: apps/member/forms.py:171 apps/registration/forms.py:68 #: apps/wei/forms/registration.py:83 msgid "Credit type" msgstr "Kredittype" -#: apps/member/forms.py:170 apps/registration/forms.py:69 +#: apps/member/forms.py:172 apps/registration/forms.py:69 #: apps/wei/forms/registration.py:84 msgid "No credit" msgstr "Kein Kredit" -#: apps/member/forms.py:172 +#: apps/member/forms.py:174 msgid "You can credit the note of the user." msgstr "Sie dûrfen diese Note kreditieren." -#: apps/member/forms.py:176 apps/registration/forms.py:74 +#: apps/member/forms.py:178 apps/registration/forms.py:74 #: apps/wei/forms/registration.py:89 msgid "Credit amount" msgstr "Kreditanzahl" -#: apps/member/forms.py:193 apps/note/templates/note/transaction_form.html:140 -#: apps/registration/forms.py:91 apps/treasury/forms.py:133 +#: apps/member/forms.py:195 apps/note/templates/note/transaction_form.html:140 +#: apps/registration/forms.py:91 apps/treasury/forms.py:134 #: apps/wei/forms/registration.py:106 msgid "Bank" msgstr "Bank" -#: apps/member/forms.py:220 +#: apps/member/forms.py:222 msgid "User" msgstr "User" -#: apps/member/forms.py:234 +#: apps/member/forms.py:236 msgid "Roles" msgstr "Rollen" @@ -792,46 +792,46 @@ msgid "Maximal date of a membership, after which members must renew it." msgstr "" "Maximales Datum einer Mitgliedschaft, nach dem Mitglieder es erneuern müssen." -#: apps/member/models.py:285 apps/member/models.py:310 -#: apps/note/models/notes.py:185 +#: apps/member/models.py:286 apps/member/models.py:311 +#: apps/note/models/notes.py:191 msgid "club" msgstr "Club" -#: apps/member/models.py:286 +#: apps/member/models.py:287 msgid "clubs" msgstr "Clubs" -#: apps/member/models.py:320 +#: apps/member/models.py:321 msgid "membership starts on" msgstr "Mitgliedschaft fängt an" -#: apps/member/models.py:324 +#: apps/member/models.py:325 msgid "membership ends on" msgstr "Mitgliedschaft endet am" -#: apps/member/models.py:419 +#: apps/member/models.py:421 #, 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:428 apps/member/views.py:628 +#: apps/member/models.py:430 apps/member/views.py:634 msgid "User is already a member of the club" msgstr "User ist schon ein Mitglied dieser club" -#: apps/member/models.py:440 +#: apps/member/models.py:442 apps/member/views.py:644 msgid "User is not a member of the parent club" msgstr "User ist noch nicht Mitglied des Urclubs" -#: apps/member/models.py:488 +#: apps/member/models.py:495 #, python-brace-format msgid "Membership of {user} for the club {club}" msgstr "Mitgliedschaft von {user} für das Club {club}" -#: apps/member/models.py:491 apps/note/models/transactions.py:353 +#: apps/member/models.py:498 apps/note/models/transactions.py:355 msgid "membership" msgstr "Mitgliedschaft" -#: apps/member/models.py:492 +#: apps/member/models.py:499 msgid "memberships" msgstr "Mitgliedschaften" @@ -839,7 +839,7 @@ msgstr "Mitgliedschaften" msgid "Renew" msgstr "Erneuern" -#: apps/member/templates/member/add_members.html:16 +#: apps/member/templates/member/add_members.html:17 #, python-format msgid "" "The user is not a member of the club·s %(clubs)s. An additional fee of " @@ -850,7 +850,21 @@ msgstr "" "Beitrag von %(pretty_fee)s wurde bezahlt um die Mitgliedschaft von dieser/" "diesen Club zu erneuern." -#: apps/member/templates/member/add_members.html:21 +#: apps/member/templates/member/add_members.html:22 +#, fuzzy, python-format +#| msgid "" +#| "The user is not a member of the club·s %(clubs)s. An additional fee of " +#| "%(pretty_fee)s will be charged to renew automatically the membership in " +#| "this/these club·s." +msgid "" +"The user is not a member of the club·s %(clubs)s. Please create the required " +"memberships, otherwise it will fail." +msgstr "" +"Dieser User ist noch nicht Mitglied von den Urclub %(clubs)s. Ein extra " +"Beitrag von %(pretty_fee)s wurde bezahlt um die Mitgliedschaft von dieser/" +"diesen Club zu erneuern." + +#: apps/member/templates/member/add_members.html:29 #, python-format msgid "" "This club has parents %(clubs)s. An additional fee of %(pretty_fee)s will be " @@ -859,13 +873,20 @@ msgstr "" "Dieses Club hat %(clubs)s als Urclub. Eine extra Beitrag von %(pretty_fee)s " "wurde bezahlt um Mitglied von dieser/diesen Club zu werden." +#: apps/member/templates/member/add_members.html:34 +#, python-format +msgid "" +"This club has parents %(clubs)s. Please make sure that the user is a member " +"of this or these club·s, otherwise the creation of this membership will fail." +msgstr "" + #: apps/member/templates/member/base.html:17 #: apps/registration/templates/registration/future_profile_detail.html:12 msgid "Account #" msgstr "Konto #" #: apps/member/templates/member/base.html:48 -#: apps/member/templates/member/base.html:62 apps/member/views.py:57 +#: apps/member/templates/member/base.html:62 apps/member/views.py:58 #: apps/registration/templates/registration/future_profile_detail.html:48 #: apps/wei/templates/wei/weimembership_form.html:117 msgid "Update Profile" @@ -909,7 +930,7 @@ msgstr "" "zu aufschliessen." #: apps/member/templates/member/base.html:110 -#: apps/member/templates/member/base.html:137 apps/treasury/forms.py:89 +#: apps/member/templates/member/base.html:137 apps/treasury/forms.py:90 msgid "Close" msgstr "Schluss" @@ -925,8 +946,8 @@ msgstr "" "erlaubt." #: apps/member/templates/member/club_alias.html:10 -#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:236 -#: apps/member/views.py:433 +#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:238 +#: apps/member/views.py:436 msgid "Note aliases" msgstr "Note Aliases" @@ -990,7 +1011,7 @@ 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:276 apps/wei/templates/wei/base.html:66 +#: apps/note/models/notes.py:283 apps/wei/templates/wei/base.html:66 msgid "aliases" msgstr "Aliases" @@ -1061,47 +1082,47 @@ msgstr "Speichern" msgid "Registrations" msgstr "Anmeldung" -#: apps/member/views.py:70 apps/registration/forms.py:23 +#: apps/member/views.py:71 apps/registration/forms.py:23 msgid "This address must be valid." msgstr "Diese Adresse muss gültig sein." -#: apps/member/views.py:135 +#: apps/member/views.py:137 msgid "Profile detail" msgstr "Profile detail" -#: apps/member/views.py:195 +#: apps/member/views.py:197 msgid "Search user" msgstr "User finden" -#: apps/member/views.py:256 +#: apps/member/views.py:258 msgid "Update note picture" msgstr "Notebild ändern" -#: apps/member/views.py:301 +#: apps/member/views.py:304 msgid "Manage auth token" msgstr "Auth token bearbeiten" -#: apps/member/views.py:328 +#: apps/member/views.py:331 msgid "Create new club" msgstr "Neue Club" -#: apps/member/views.py:347 +#: apps/member/views.py:350 msgid "Search club" msgstr "Club finden" -#: apps/member/views.py:380 +#: apps/member/views.py:383 msgid "Club detail" msgstr "Club Details" -#: apps/member/views.py:456 +#: apps/member/views.py:459 msgid "Update club" msgstr "Club bearbeiten" -#: apps/member/views.py:490 +#: apps/member/views.py:493 msgid "Add new member to the club" msgstr "Neue Mitglieder" -#: apps/member/views.py:619 apps/wei/views.py:922 +#: apps/member/views.py:625 apps/wei/views.py:928 msgid "" "This user don't have enough money to join this club, and can't have a " "negative balance." @@ -1109,25 +1130,25 @@ msgstr "" "Diese User hat nicht genug Geld um Mitglied zu werden, und darf nich im Rot " "sein." -#: apps/member/views.py:632 +#: apps/member/views.py:648 msgid "The membership must start after {:%m-%d-%Y}." msgstr "Die Mitgliedschaft muss nach {:%m-%d-Y} anfängen." -#: apps/member/views.py:637 +#: apps/member/views.py:653 msgid "The membership must begin before {:%m-%d-%Y}." msgstr "Die Mitgliedschaft muss vor {:%m-%d-Y} anfängen." -#: apps/member/views.py:644 apps/member/views.py:646 apps/member/views.py:648 -#: apps/registration/views.py:291 apps/registration/views.py:293 -#: apps/registration/views.py:295 apps/wei/views.py:927 apps/wei/views.py:931 +#: apps/member/views.py:660 apps/member/views.py:662 apps/member/views.py:664 +#: apps/registration/views.py:294 apps/registration/views.py:296 +#: apps/registration/views.py:298 apps/wei/views.py:933 apps/wei/views.py:937 msgid "This field is required." msgstr "Dies ist ein Pflichtfeld." -#: apps/member/views.py:783 +#: apps/member/views.py:800 msgid "Manage roles of an user in the club" msgstr "Rollen in diesen Club bearbeiten" -#: apps/member/views.py:808 +#: apps/member/views.py:825 msgid "Members of the club" msgstr "Mitlglieder dieses Club" @@ -1146,7 +1167,7 @@ msgid "amount" msgstr "Anzahl" #: apps/note/api/serializers.py:183 apps/note/api/serializers.py:189 -#: apps/note/models/transactions.py:226 +#: apps/note/models/transactions.py:224 msgid "" "The transaction can't be saved since the source note or the destination note " "is not active." @@ -1238,68 +1259,68 @@ msgstr "The note is blocked by the the BDE and can't be manually reactivated." msgid "notes" msgstr "Notes" -#: apps/note/models/notes.py:128 +#: apps/note/models/notes.py:133 msgid "This alias is already taken." msgstr "Dieses Alias ist schon benutzt." -#: apps/note/models/notes.py:148 +#: apps/note/models/notes.py:153 msgid "one's note" msgstr "Jemand Note" -#: apps/note/models/notes.py:149 +#: apps/note/models/notes.py:154 msgid "users note" msgstr "User Note" -#: apps/note/models/notes.py:155 +#: apps/note/models/notes.py:160 #, python-format msgid "%(user)s's note" msgstr "%(user)s's note" -#: apps/note/models/notes.py:189 +#: apps/note/models/notes.py:195 msgid "club note" msgstr "Club Note" -#: apps/note/models/notes.py:190 +#: apps/note/models/notes.py:196 msgid "clubs notes" msgstr "Club Notes" -#: apps/note/models/notes.py:196 +#: apps/note/models/notes.py:202 #, python-format msgid "Note of %(club)s club" msgstr "%(club)s Note" -#: apps/note/models/notes.py:235 +#: apps/note/models/notes.py:242 msgid "special note" msgstr "Sondernote" -#: apps/note/models/notes.py:236 +#: apps/note/models/notes.py:243 msgid "special notes" msgstr "Sondernoten" -#: apps/note/models/notes.py:259 +#: apps/note/models/notes.py:266 msgid "Invalid alias" msgstr "Unerlaublt Alias" -#: apps/note/models/notes.py:275 +#: apps/note/models/notes.py:282 msgid "alias" msgstr "Alias" -#: apps/note/models/notes.py:299 +#: apps/note/models/notes.py:306 msgid "Alias is too long." msgstr "Alias ist zu lang." -#: apps/note/models/notes.py:302 +#: apps/note/models/notes.py:309 msgid "" "This alias contains only complex character. Please use a more simple alias." msgstr "" "Dieser Alias enthält nur komplexe Zeichen. Bitte verwenden Sie einen " "einfacheren Alias." -#: apps/note/models/notes.py:306 +#: apps/note/models/notes.py:313 msgid "An alias with a similar name already exists: {} " msgstr "Ein Alias mit einem ähnlichen Namen existiert bereits: {} " -#: apps/note/models/notes.py:319 +#: apps/note/models/notes.py:327 msgid "You can't delete your main alias." msgstr "Sie können Ihren Hauptalias nicht löschen." @@ -1357,7 +1378,7 @@ msgstr "Transaktion" msgid "transactions" msgstr "Transaktionen" -#: apps/note/models/transactions.py:184 +#: apps/note/models/transactions.py:186 #, python-brace-format msgid "" "You can't update the {field} on a Transaction. Please invalidate it and " @@ -1366,7 +1387,7 @@ msgstr "" "Sie können das {field} einer Transaktion nicht aktualisieren. Bitte machen " "Sie es ungültig und erstellen Sie eine andere." -#: apps/note/models/transactions.py:204 +#: apps/note/models/transactions.py:206 msgid "" "The note balances must be between - 92 233 720 368 547 758.08 € and 92 233 " "720 368 547 758.07 €." @@ -1381,27 +1402,27 @@ msgid "" msgstr "" "Der Empfänger dieser Transaktion muss dem Empfänger der Vorlage entsprechen." -#: apps/note/models/transactions.py:282 +#: apps/note/models/transactions.py:283 msgid "Template" msgstr "Vorlage" -#: apps/note/models/transactions.py:285 +#: apps/note/models/transactions.py:286 msgid "recurrent transaction" msgstr "wiederkehrende Transaktion" -#: apps/note/models/transactions.py:286 +#: apps/note/models/transactions.py:287 msgid "recurrent transactions" msgstr "wiederkehrende Transaktionen" -#: apps/note/models/transactions.py:301 +#: apps/note/models/transactions.py:302 msgid "first_name" msgstr "Vorname" -#: apps/note/models/transactions.py:306 +#: apps/note/models/transactions.py:307 msgid "bank" msgstr "Bank" -#: apps/note/models/transactions.py:323 +#: apps/note/models/transactions.py:324 msgid "" "A special transaction is only possible between a Note associated to a " "payment method and a User or a Club" @@ -1409,19 +1430,19 @@ msgstr "" "Eine Sondertransaktion ist nur zwischen einer Note, die einer " "Zahlungsmethode zugeordnet ist, und einem User oder einem Club möglich" -#: apps/note/models/transactions.py:331 +#: apps/note/models/transactions.py:333 msgid "Special transaction" msgstr "Sondertransaktion" -#: apps/note/models/transactions.py:332 +#: apps/note/models/transactions.py:334 msgid "Special transactions" msgstr "Sondertranskationen" -#: apps/note/models/transactions.py:348 +#: apps/note/models/transactions.py:350 msgid "membership transaction" msgstr "Mitgliedschafttransaktion" -#: apps/note/models/transactions.py:349 apps/treasury/models.py:282 +#: apps/note/models/transactions.py:351 apps/treasury/models.py:284 msgid "membership transactions" msgstr "Mitgliedschaftttransaktionen" @@ -1524,7 +1545,7 @@ msgid "Action" msgstr "Aktion" #: apps/note/templates/note/transaction_form.html:112 -#: apps/treasury/forms.py:135 apps/treasury/tables.py:67 +#: apps/treasury/forms.py:136 apps/treasury/tables.py:67 #: apps/treasury/tables.py:135 #: apps/treasury/templates/treasury/remittance_form.html:23 msgid "Amount" @@ -1674,7 +1695,7 @@ msgstr "permanent" msgid "permission" msgstr "Berechtigung" -#: apps/permission/models.py:195 apps/permission/models.py:334 +#: apps/permission/models.py:195 apps/permission/models.py:335 msgid "permissions" msgstr "Berechtigungen" @@ -1682,11 +1703,11 @@ msgstr "Berechtigungen" msgid "Specifying field applies only to view and change permission types." msgstr "Angabefeld gilt nur zum Anzeigen und Ändern von Berechtigungstypen." -#: apps/permission/models.py:339 +#: apps/permission/models.py:340 msgid "for club" msgstr "Für Club" -#: apps/permission/models.py:349 apps/permission/models.py:350 +#: apps/permission/models.py:350 apps/permission/models.py:351 msgid "role permissions" msgstr "Berechtigung Rollen" @@ -1699,7 +1720,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:73 apps/permission/views.py:101 +#: apps/permission/signals.py:73 apps/permission/views.py:103 #, python-brace-format msgid "" "You don't have the permission to add an instance of model {app_label}." @@ -1757,7 +1778,7 @@ msgstr "Abfrage:" msgid "No associated permission" msgstr "Keine zugehörige Berechtigung" -#: apps/permission/views.py:68 +#: apps/permission/views.py:70 #, python-brace-format msgid "" "You don't have the permission to update this instance of the model " @@ -1767,7 +1788,7 @@ msgstr "" "diesen Parametern zu aktualisieren. Bitte korrigieren Sie Ihre Daten und " "versuchen Sie es erneut." -#: apps/permission/views.py:72 +#: apps/permission/views.py:74 #, python-brace-format msgid "" "You don't have the permission to create an instance of the model \"{model}\" " @@ -1777,11 +1798,11 @@ msgstr "" "diesen Parametern zu erstellen. Bitte korrigieren Sie Ihre Daten und " "versuchen Sie es erneut." -#: apps/permission/views.py:108 note_kfet/templates/base.html:106 +#: apps/permission/views.py:110 note_kfet/templates/base.html:106 msgid "Rights" msgstr "Rechten" -#: apps/permission/views.py:113 +#: apps/permission/views.py:115 msgid "All rights" msgstr "Alle Rechten" @@ -1914,54 +1935,54 @@ msgstr "Danke" msgid "The Note Kfet team." msgstr "Die NoteKfet Team." -#: apps/registration/views.py:39 +#: apps/registration/views.py:40 msgid "Register new user" msgstr "Neuen User registrieren" -#: apps/registration/views.py:83 +#: apps/registration/views.py:85 msgid "Email validation" msgstr "Email validierung" -#: apps/registration/views.py:85 +#: apps/registration/views.py:87 msgid "Validate email" msgstr "Email validieren" -#: apps/registration/views.py:127 +#: apps/registration/views.py:129 msgid "Email validation unsuccessful" msgstr "Email validierung unerfolgreich" -#: apps/registration/views.py:138 +#: apps/registration/views.py:140 msgid "Email validation email sent" msgstr "Validierungsemail wurde gesendet" -#: apps/registration/views.py:146 +#: apps/registration/views.py:148 msgid "Resend email validation link" msgstr "E-Mail-Validierungslink erneut senden" -#: apps/registration/views.py:164 +#: apps/registration/views.py:166 msgid "Pre-registered users list" msgstr "Vorregistrierte Userliste" -#: apps/registration/views.py:188 +#: apps/registration/views.py:190 msgid "Unregistered users" msgstr "Unregistrierte Users" -#: apps/registration/views.py:201 +#: apps/registration/views.py:203 msgid "Registration detail" msgstr "Registrierung Detailen" -#: apps/registration/views.py:260 +#: apps/registration/views.py:263 msgid "You must join the BDE." msgstr "Sie müssen die BDE beitreten." -#: apps/registration/views.py:284 +#: apps/registration/views.py:287 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:364 +#: apps/registration/views.py:367 msgid "Invalidate pre-registration" msgstr "Ungültige Vorregistrierung" @@ -1969,20 +1990,20 @@ msgstr "Ungültige Vorregistrierung" msgid "Treasury" msgstr "Quaestor" -#: apps/treasury/forms.py:24 apps/treasury/models.py:89 +#: apps/treasury/forms.py:25 apps/treasury/models.py:90 #: 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." -#: apps/treasury/forms.py:98 +#: apps/treasury/forms.py:99 msgid "Remittance is already closed." msgstr "Überweisung ist bereits geschlossen." -#: apps/treasury/forms.py:103 +#: apps/treasury/forms.py:104 msgid "You can't change the type of the remittance." msgstr "Sie können die Art der Überweisung nicht ändern." -#: apps/treasury/forms.py:123 apps/treasury/models.py:258 +#: apps/treasury/forms.py:124 apps/treasury/models.py:260 #: apps/treasury/tables.py:97 apps/treasury/tables.py:105 #: apps/treasury/templates/treasury/invoice_list.html:16 #: apps/treasury/templates/treasury/remittance_list.html:16 @@ -1990,7 +2011,7 @@ msgstr "Sie können die Art der Überweisung nicht ändern." msgid "Remittance" msgstr "Überweisung" -#: apps/treasury/forms.py:124 +#: apps/treasury/forms.py:125 msgid "No attached remittance" msgstr "Keine beigefügte Überweisung" @@ -2014,7 +2035,7 @@ msgstr "Beschreibung" msgid "Address" msgstr "Adresse" -#: apps/treasury/models.py:60 apps/treasury/models.py:186 +#: apps/treasury/models.py:60 apps/treasury/models.py:187 msgid "Date" msgstr "Datum" @@ -2034,80 +2055,80 @@ msgstr "Eine Rechnung kann nicht bearbeitet werden, wenn sie gesperrt ist." msgid "tex source" msgstr "Tex Quelle" -#: apps/treasury/models.py:109 apps/treasury/models.py:125 +#: apps/treasury/models.py:110 apps/treasury/models.py:126 msgid "invoice" msgstr "Rechnung" -#: apps/treasury/models.py:110 +#: apps/treasury/models.py:111 msgid "invoices" msgstr "Rechnungen" -#: apps/treasury/models.py:113 +#: apps/treasury/models.py:114 #, python-brace-format msgid "Invoice #{id}" msgstr "Rechnung #{id}" -#: apps/treasury/models.py:130 +#: apps/treasury/models.py:131 msgid "Designation" msgstr "Bezeichnung" -#: apps/treasury/models.py:134 +#: apps/treasury/models.py:135 msgid "Quantity" msgstr "Qualität" -#: apps/treasury/models.py:138 +#: apps/treasury/models.py:139 msgid "Unit price" msgstr "Einzelpreis" -#: apps/treasury/models.py:154 +#: apps/treasury/models.py:155 msgid "product" msgstr "Produkt" -#: apps/treasury/models.py:155 +#: apps/treasury/models.py:156 msgid "products" msgstr "Produkten" -#: apps/treasury/models.py:175 +#: apps/treasury/models.py:176 msgid "remittance type" msgstr "Überweisungstyp" -#: apps/treasury/models.py:176 +#: apps/treasury/models.py:177 msgid "remittance types" msgstr "Überweisungstypen" -#: apps/treasury/models.py:197 +#: apps/treasury/models.py:198 msgid "Comment" msgstr "Kommentar" -#: apps/treasury/models.py:202 +#: apps/treasury/models.py:203 msgid "Closed" msgstr "Geschlossen" -#: apps/treasury/models.py:206 +#: apps/treasury/models.py:207 msgid "remittance" msgstr "Überweisung" -#: apps/treasury/models.py:207 +#: apps/treasury/models.py:208 msgid "remittances" msgstr "Überweisungen" -#: apps/treasury/models.py:239 +#: apps/treasury/models.py:241 msgid "Remittance #{:d}: {}" msgstr "Überweisung #{:d}:{}" -#: apps/treasury/models.py:262 +#: apps/treasury/models.py:264 msgid "special transaction proxy" msgstr "spezielle Transaktion Proxy" -#: apps/treasury/models.py:263 +#: apps/treasury/models.py:265 msgid "special transaction proxies" msgstr "spezielle Transaktion Proxies" -#: apps/treasury/models.py:288 +#: apps/treasury/models.py:290 msgid "credit transaction" msgstr "Kredit Transaktion" -#: apps/treasury/models.py:361 +#: apps/treasury/models.py:369 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." @@ -2115,16 +2136,16 @@ msgstr "" "Dieser Benutzer hat nicht genug Geld, um die Mitgliedschaften mit seiner " "Note zu bezahlen." -#: apps/treasury/models.py:376 +#: apps/treasury/models.py:384 #: 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:377 +#: apps/treasury/models.py:385 msgid "Credits from the Société générale" msgstr "Krediten von der Société générale" -#: apps/treasury/models.py:380 +#: apps/treasury/models.py:388 #, python-brace-format msgid "Soge credit for {user}" msgstr "Kredit von der Société générale für {user}" @@ -2153,12 +2174,12 @@ msgid "Yes" msgstr "Ja" #: apps/treasury/templates/treasury/invoice_confirm_delete.html:10 -#: apps/treasury/views.py:176 +#: apps/treasury/views.py:179 msgid "Delete invoice" msgstr "Rechnung löschen" #: apps/treasury/templates/treasury/invoice_confirm_delete.html:15 -#: apps/treasury/views.py:180 +#: apps/treasury/views.py:183 msgid "This invoice is locked and can't be deleted." msgstr "Eine Rechnung kann nicht gelöscht werden, wenn sie gesperrt ist." @@ -2324,44 +2345,44 @@ msgstr "" "Es gibt keinen übereinstimmenden User, der eine Kredit für die Société " "générale beantragt hat." -#: apps/treasury/views.py:38 +#: apps/treasury/views.py:39 msgid "Create new invoice" msgstr "Neue Rechnung" -#: apps/treasury/views.py:94 +#: apps/treasury/views.py:96 msgid "Invoices list" msgstr "Rechnunglist" -#: apps/treasury/views.py:109 apps/treasury/views.py:282 -#: apps/treasury/views.py:408 +#: apps/treasury/views.py:111 apps/treasury/views.py:285 +#: apps/treasury/views.py:411 msgid "You are not able to see the treasury interface." msgstr "Sie können die Quaestor-App nicht sehen." -#: apps/treasury/views.py:119 +#: apps/treasury/views.py:121 msgid "Update an invoice" msgstr "Rechnung bearbeiten" -#: apps/treasury/views.py:243 +#: apps/treasury/views.py:246 msgid "Create a new remittance" msgstr "Neue Überweisung" -#: apps/treasury/views.py:270 +#: apps/treasury/views.py:273 msgid "Remittances list" msgstr "Überweisungliste" -#: apps/treasury/views.py:333 +#: apps/treasury/views.py:336 msgid "Update a remittance" msgstr "Überweisung bearbeiten" -#: apps/treasury/views.py:356 +#: apps/treasury/views.py:359 msgid "Attach a transaction to a remittance" msgstr "Fügen Sie einer Überweisung eine Transaktion hinzu" -#: apps/treasury/views.py:400 +#: apps/treasury/views.py:403 msgid "List of credits from the Société générale" msgstr "Kreditliste von Société générale" -#: apps/treasury/views.py:440 +#: apps/treasury/views.py:443 msgid "Manage credits from the Société générale" msgstr "Krediten von der Société générale handeln" @@ -2410,7 +2431,7 @@ msgstr "Wählen Sie die Rollen aus, an denen Sie interessiert sind." msgid "This team doesn't belong to the given bus." msgstr "Dieses Team gehört nicht zum angegebenen Bus." -#: apps/wei/forms/surveys/wei2020.py:29 +#: apps/wei/forms/surveys/wei2020.py:30 msgid "Choose a word:" msgstr "Wählen Sie ein Wort:" @@ -2587,11 +2608,11 @@ msgstr "WEI Preis (unbezahlte Studenten)" msgid "WEI list" msgstr "WEI Liste" -#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:506 +#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:508 msgid "Register 1A" msgstr "1A Registrieren" -#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:573 +#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:576 msgid "Register 2A+" msgstr "2A+ Registrieren" @@ -2620,8 +2641,8 @@ msgstr "Als PDF schauen" #: apps/wei/templates/wei/survey.html:11 #: apps/wei/templates/wei/survey_closed.html:11 -#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:978 -#: apps/wei/views.py:1032 apps/wei/views.py:1042 +#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:984 +#: apps/wei/views.py:1039 apps/wei/views.py:1049 msgid "Survey WEI" msgstr "WEI Umfrage" @@ -2661,7 +2682,7 @@ msgstr "Mitglied der WEI" msgid "Unvalidated registrations" msgstr "Unvalidierte Registrierungen" -#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:76 +#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:77 msgid "Create WEI" msgstr "Neue WEI" @@ -2807,67 +2828,67 @@ msgstr "Bei diesem Muster wurde keine Vorregistrierung gefunden." msgid "View validated memberships..." msgstr "Validierte Mitgliedschaften anzeigen ..." -#: apps/wei/views.py:55 +#: apps/wei/views.py:56 msgid "Search WEI" msgstr "WEI finden" -#: apps/wei/views.py:105 +#: apps/wei/views.py:107 msgid "WEI Detail" msgstr "WEI Infos" -#: apps/wei/views.py:200 +#: apps/wei/views.py:202 msgid "View members of the WEI" msgstr "Mitglied der WEI schauen" -#: apps/wei/views.py:228 +#: apps/wei/views.py:230 msgid "Find WEI Membership" msgstr "WEI Mitgliedschaft finden" -#: apps/wei/views.py:238 +#: apps/wei/views.py:240 msgid "View registrations to the WEI" msgstr "Mitglied der WEI schauen" -#: apps/wei/views.py:262 +#: apps/wei/views.py:264 msgid "Find WEI Registration" msgstr "WEI Registrierung finden" -#: apps/wei/views.py:273 +#: apps/wei/views.py:275 msgid "Update the WEI" msgstr "WEI bearbeiten" -#: apps/wei/views.py:294 +#: apps/wei/views.py:296 msgid "Create new bus" msgstr "Neue Bus" -#: apps/wei/views.py:332 +#: apps/wei/views.py:334 msgid "Update bus" msgstr "Bus bearbeiten" -#: apps/wei/views.py:362 +#: apps/wei/views.py:364 msgid "Manage bus" msgstr "Bus ändern" -#: apps/wei/views.py:389 +#: apps/wei/views.py:391 msgid "Create new team" msgstr "Neue Bus Team" -#: apps/wei/views.py:429 +#: apps/wei/views.py:431 msgid "Update team" msgstr "Team bearbeiten" -#: apps/wei/views.py:460 +#: apps/wei/views.py:462 msgid "Manage WEI team" msgstr "WEI Team bearbeiten" -#: apps/wei/views.py:482 +#: apps/wei/views.py:484 msgid "Register first year student to the WEI" msgstr "Registrieren Sie den Erstsemester beim WEI" -#: apps/wei/views.py:527 apps/wei/views.py:607 +#: apps/wei/views.py:530 apps/wei/views.py:611 msgid "This user is already registered to this WEI." msgstr "Dieser Benutzer ist bereits bei dieser WEI registriert." -#: apps/wei/views.py:532 +#: apps/wei/views.py:535 msgid "" "This user can't be in her/his first year since he/she has already " "participated to a WEI." @@ -2875,31 +2896,31 @@ msgstr "" "Dieser Benutzer kann nicht in seinem ersten Jahr sein, da er bereits an " "einer WEI teilgenommen hat." -#: apps/wei/views.py:549 +#: apps/wei/views.py:552 msgid "Register old student to the WEI" msgstr "Registrieren Sie einen alten Studenten beim WEI" -#: apps/wei/views.py:592 apps/wei/views.py:680 +#: apps/wei/views.py:595 apps/wei/views.py:684 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:637 +#: apps/wei/views.py:641 msgid "Update WEI Registration" msgstr "WEI Registrierung aktualisieren" -#: apps/wei/views.py:739 +#: apps/wei/views.py:744 msgid "Delete WEI registration" msgstr "WEI Registrierung löschen" -#: apps/wei/views.py:750 +#: apps/wei/views.py:755 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:769 +#: apps/wei/views.py:774 msgid "Validate WEI registration" msgstr "Überprüfen Sie die WEI-Registrierung" -#: apps/wei/views.py:916 +#: apps/wei/views.py:922 msgid "This user didn't give her/his caution check." msgstr "Dieser User hat seine / ihre Vorsicht nicht überprüft." diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index 27c4f7c1..0c2492ce 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-09-13 12:35+0200\n" -"PO-Revision-Date: 2020-09-13 12:38+0200\n" +"POT-Creation-Date: 2020-09-19 22:00+0200\n" +"PO-Revision-Date: 2020-09-19 14:56+0200\n" "Last-Translator: elkmaennchen \n" "Language-Team: \n" "Language: es\n" @@ -18,32 +18,32 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.3\n" -#: apps/activity/apps.py:10 apps/activity/models.py:150 -#: apps/activity/models.py:166 +#: apps/activity/apps.py:10 apps/activity/models.py:151 +#: apps/activity/models.py:167 msgid "activity" msgstr "actividad" -#: apps/activity/forms.py:35 apps/activity/models.py:131 +#: apps/activity/forms.py:35 apps/activity/models.py:132 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:76 apps/activity/models.py:268 +#: apps/activity/forms.py:76 apps/activity/models.py:270 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:79 apps/activity/models.py:271 +#: apps/activity/forms.py:79 apps/activity/models.py:273 msgid "This activity is not validated yet." msgstr "Esta actividad no fue validada por ahora." -#: apps/activity/forms.py:89 apps/activity/models.py:279 +#: apps/activity/forms.py:89 apps/activity/models.py:281 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:93 apps/activity/models.py:283 +#: apps/activity/forms.py:93 apps/activity/models.py:285 msgid "This person is already invited." msgstr "Esta persona ya está invitada." -#: apps/activity/forms.py:97 apps/activity/models.py:287 +#: apps/activity/forms.py:97 apps/activity/models.py:289 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." @@ -51,9 +51,9 @@ msgstr "Usted no puede invitar más de 3 persona a esta actividad." #: apps/member/models.py:199 #: apps/member/templates/member/includes/club_info.html:4 #: apps/member/templates/member/includes/profile_info.html:4 -#: apps/note/models/notes.py:253 apps/note/models/transactions.py:26 -#: apps/note/models/transactions.py:46 apps/note/models/transactions.py:296 -#: apps/permission/models.py:329 +#: apps/note/models/notes.py:260 apps/note/models/transactions.py:26 +#: apps/note/models/transactions.py:46 apps/note/models/transactions.py:297 +#: apps/permission/models.py:330 #: apps/registration/templates/registration/future_profile_detail.html:16 #: apps/wei/models.py:66 apps/wei/models.py:118 #: apps/wei/templates/wei/base.html:26 @@ -104,13 +104,13 @@ msgstr "Lugar donde se organiza la actividad, por ejemplo la Kfet." #: apps/activity/models.py:83 #: apps/activity/templates/activity/includes/activity_info.html:22 -#: apps/note/models/notes.py:229 apps/note/models/transactions.py:66 +#: apps/note/models/notes.py:236 apps/note/models/transactions.py:66 #: apps/permission/models.py:164 msgid "type" msgstr "tipo" -#: apps/activity/models.py:89 apps/logs/models.py:22 apps/member/models.py:304 -#: apps/note/models/notes.py:144 apps/treasury/models.py:276 +#: apps/activity/models.py:89 apps/logs/models.py:22 apps/member/models.py:305 +#: apps/note/models/notes.py:149 apps/treasury/models.py:278 #: apps/treasury/templates/treasury/sogecredit_detail.html:14 #: apps/wei/models.py:160 apps/wei/templates/wei/survey.html:15 msgid "user" @@ -157,75 +157,75 @@ msgstr "válido" msgid "open" msgstr "abierto" -#: apps/activity/models.py:151 +#: apps/activity/models.py:152 msgid "activities" msgstr "actividades" -#: apps/activity/models.py:171 +#: apps/activity/models.py:172 msgid "entry time" msgstr "hora de entrada" -#: apps/activity/models.py:177 apps/note/apps.py:14 +#: apps/activity/models.py:178 apps/note/apps.py:14 #: apps/note/models/notes.py:78 msgid "note" msgstr "note" -#: apps/activity/models.py:188 +#: apps/activity/models.py:189 #: apps/activity/templates/activity/activity_entry.html:46 msgid "entry" msgstr "entrada" -#: apps/activity/models.py:189 +#: apps/activity/models.py:190 #: apps/activity/templates/activity/activity_entry.html:46 msgid "entries" msgstr "entradas" -#: apps/activity/models.py:192 +#: apps/activity/models.py:193 #, python-brace-format msgid "Entry for {guest}, invited by {note} to the activity {activity}" msgstr "Entrada para {guest}, invitado por {note} en la actividad {activity}" -#: apps/activity/models.py:194 +#: apps/activity/models.py:195 #, python-brace-format msgid "Entry for {note} to the activity {activity}" msgstr "Entrada para {note} en la actividad {activity}" -#: apps/activity/models.py:201 +#: apps/activity/models.py:202 msgid "Already entered on " msgstr "Entrado ya el " -#: apps/activity/models.py:201 apps/activity/tables.py:54 +#: apps/activity/models.py:202 apps/activity/tables.py:54 msgid "{:%Y-%m-%d %H:%M:%S}" msgstr "{:%d/%m/%Y %H:%M:%S}" -#: apps/activity/models.py:209 +#: apps/activity/models.py:210 msgid "The balance is negative." msgstr "El saldo es negativo." -#: apps/activity/models.py:239 +#: apps/activity/models.py:240 msgid "last name" msgstr "apellido" -#: apps/activity/models.py:244 +#: apps/activity/models.py:245 #: apps/member/templates/member/includes/profile_info.html:4 #: apps/registration/templates/registration/future_profile_detail.html:16 #: apps/wei/templates/wei/weimembership_form.html:14 msgid "first name" msgstr "nombre" -#: apps/activity/models.py:251 +#: apps/activity/models.py:252 msgid "inviter" msgstr "huésped" -#: apps/activity/models.py:295 +#: apps/activity/models.py:297 msgid "guest" msgstr "invitado" -#: apps/activity/models.py:296 +#: apps/activity/models.py:298 msgid "guests" msgstr "invitados" -#: apps/activity/models.py:308 +#: apps/activity/models.py:310 msgid "Invitation" msgstr "Invitación" @@ -249,19 +249,19 @@ msgstr "Entrado el " msgid "remove" msgstr "quitar" -#: apps/activity/tables.py:80 apps/note/forms.py:68 apps/treasury/models.py:192 +#: apps/activity/tables.py:80 apps/note/forms.py:68 apps/treasury/models.py:193 msgid "Type" msgstr "Tipo" -#: apps/activity/tables.py:82 apps/member/forms.py:183 -#: apps/registration/forms.py:81 apps/treasury/forms.py:129 +#: apps/activity/tables.py:82 apps/member/forms.py:185 +#: apps/registration/forms.py:81 apps/treasury/forms.py:130 #: apps/wei/forms/registration.py:96 msgid "Last name" msgstr "Apellido" -#: apps/activity/tables.py:84 apps/member/forms.py:188 +#: apps/activity/tables.py:84 apps/member/forms.py:190 #: apps/note/templates/note/transaction_form.html:134 -#: apps/registration/forms.py:86 apps/treasury/forms.py:131 +#: apps/registration/forms.py:86 apps/treasury/forms.py:132 #: apps/wei/forms/registration.py:101 msgid "First name" msgstr "Nombre" @@ -287,13 +287,13 @@ msgid "Transfer" msgstr "Transferencia" #: apps/activity/templates/activity/activity_entry.html:18 -#: apps/note/models/transactions.py:312 +#: apps/note/models/transactions.py:313 #: apps/note/templates/note/transaction_form.html:21 msgid "Credit" msgstr "Crédito" #: apps/activity/templates/activity/activity_entry.html:21 -#: apps/note/models/transactions.py:312 +#: apps/note/models/transactions.py:313 #: apps/note/templates/note/transaction_form.html:25 msgid "Debit" msgstr "Débito" @@ -308,10 +308,10 @@ msgid "Return to activity page" msgstr "Regresar a la página de la actividad" #: apps/activity/templates/activity/activity_form.html:16 -#: apps/member/templates/member/add_members.html:32 +#: 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:87 apps/treasury/forms.py:141 +#: apps/treasury/forms.py:88 apps/treasury/forms.py:142 #: apps/treasury/templates/treasury/invoice_form.html:74 #: apps/wei/templates/wei/bus_form.html:17 #: apps/wei/templates/wei/busteam_form.html:17 @@ -373,41 +373,41 @@ msgstr "modificar" msgid "Invite" msgstr "Invitar" -#: apps/activity/views.py:33 +#: apps/activity/views.py:34 msgid "Create new activity" msgstr "Crear una nueva actividad" -#: apps/activity/views.py:63 note_kfet/templates/base.html:88 +#: apps/activity/views.py:65 note_kfet/templates/base.html:88 msgid "Activities" msgstr "Actividades" -#: apps/activity/views.py:91 +#: apps/activity/views.py:93 msgid "Activity detail" msgstr "Detalles de la actividad" -#: apps/activity/views.py:111 +#: apps/activity/views.py:113 msgid "Update activity" msgstr "Modificar la actividad" -#: apps/activity/views.py:138 +#: apps/activity/views.py:140 msgid "Invite guest to the activity \"{}\"" msgstr "Invitar alguien para la actividad \"{}\"" -#: apps/activity/views.py:172 +#: apps/activity/views.py:175 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:175 +#: apps/activity/views.py:178 msgid "This activity does not support activity entries." msgstr "Esta actividad no necesita entradas." -#: apps/activity/views.py:178 +#: apps/activity/views.py:181 msgid "This activity is closed." msgstr "Esta actividad esta cerrada." -#: apps/activity/views.py:274 +#: apps/activity/views.py:277 msgid "Entry for activity \"{}\"" msgstr "Entradas para la actividad \"{}\"" @@ -484,11 +484,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:315 +#: apps/member/admin.py:65 apps/member/models.py:316 msgid "roles" msgstr "papel" -#: apps/member/admin.py:66 apps/member/models.py:329 +#: apps/member/admin.py:66 apps/member/models.py:330 msgid "fee" msgstr "pago" @@ -496,77 +496,77 @@ msgstr "pago" msgid "member" msgstr "miembro" -#: apps/member/forms.py:23 +#: apps/member/forms.py:24 msgid "Permission mask" msgstr "Antifaz de permisos" -#: apps/member/forms.py:45 +#: apps/member/forms.py:46 msgid "Report frequency" msgstr "Frecuencia de los informes (en días)" -#: apps/member/forms.py:47 +#: apps/member/forms.py:48 msgid "Last report date" msgstr "Fecha del último informe" -#: apps/member/forms.py:52 +#: apps/member/forms.py:53 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:77 +#: apps/member/forms.py:79 msgid "select an image" msgstr "elegir una imagen" -#: apps/member/forms.py:78 +#: apps/member/forms.py:80 msgid "Maximal size: 2MB" msgstr "Tamaño máximo : 2Mo" -#: apps/member/forms.py:103 +#: apps/member/forms.py:105 msgid "This image cannot be loaded." msgstr "Esta imagen no puede ser cargada." -#: apps/member/forms.py:139 apps/member/views.py:98 -#: apps/registration/forms.py:33 apps/registration/views.py:241 +#: apps/member/forms.py:141 apps/member/views.py:100 +#: apps/registration/forms.py:33 apps/registration/views.py:244 msgid "An alias with a similar name already exists." msgstr "Un alias similar ya existe." -#: apps/member/forms.py:162 apps/registration/forms.py:61 +#: apps/member/forms.py:164 apps/registration/forms.py:61 msgid "Inscription paid by Société Générale" msgstr "Registración pagadas por Société Générale" -#: apps/member/forms.py:164 apps/registration/forms.py:63 +#: apps/member/forms.py:166 apps/registration/forms.py:63 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:169 apps/registration/forms.py:68 +#: apps/member/forms.py:171 apps/registration/forms.py:68 #: apps/wei/forms/registration.py:83 msgid "Credit type" msgstr "Tipo de crédito" -#: apps/member/forms.py:170 apps/registration/forms.py:69 +#: apps/member/forms.py:172 apps/registration/forms.py:69 #: apps/wei/forms/registration.py:84 msgid "No credit" msgstr "No crédito" -#: apps/member/forms.py:172 +#: apps/member/forms.py:174 msgid "You can credit the note of the user." msgstr "Usted puede acreditar la note del usuario." -#: apps/member/forms.py:176 apps/registration/forms.py:74 +#: apps/member/forms.py:178 apps/registration/forms.py:74 #: apps/wei/forms/registration.py:89 msgid "Credit amount" msgstr "Valor del crédito" -#: apps/member/forms.py:193 apps/note/templates/note/transaction_form.html:140 -#: apps/registration/forms.py:91 apps/treasury/forms.py:133 +#: apps/member/forms.py:195 apps/note/templates/note/transaction_form.html:140 +#: apps/registration/forms.py:91 apps/treasury/forms.py:134 #: apps/wei/forms/registration.py:106 msgid "Bank" msgstr "Banco" -#: apps/member/forms.py:220 +#: apps/member/forms.py:222 msgid "User" msgstr "Usuario" -#: apps/member/forms.py:234 +#: apps/member/forms.py:236 msgid "Roles" msgstr "Papeles" @@ -792,46 +792,46 @@ msgstr "" "Ultima fecha de una afiliación, después de la cual los miembros tienen que " "prorrogarla." -#: apps/member/models.py:285 apps/member/models.py:310 -#: apps/note/models/notes.py:185 +#: apps/member/models.py:286 apps/member/models.py:311 +#: apps/note/models/notes.py:191 msgid "club" msgstr "club" -#: apps/member/models.py:286 +#: apps/member/models.py:287 msgid "clubs" msgstr "clubs" -#: apps/member/models.py:320 +#: apps/member/models.py:321 msgid "membership starts on" msgstr "afiliación empezá el" -#: apps/member/models.py:324 +#: apps/member/models.py:325 msgid "membership ends on" msgstr "afiliación termina el" -#: apps/member/models.py:419 +#: apps/member/models.py:421 #, 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:428 apps/member/views.py:628 +#: apps/member/models.py:430 apps/member/views.py:634 msgid "User is already a member of the club" msgstr "Usuario ya esta un miembro del club" -#: apps/member/models.py:440 +#: apps/member/models.py:442 apps/member/views.py:644 msgid "User is not a member of the parent club" msgstr "Usuario no es un miembro del club pariente" -#: apps/member/models.py:488 +#: apps/member/models.py:495 #, python-brace-format msgid "Membership of {user} for the club {club}" msgstr "Afiliación of {user} for the club {club}" -#: apps/member/models.py:491 apps/note/models/transactions.py:353 +#: apps/member/models.py:498 apps/note/models/transactions.py:355 msgid "membership" msgstr "afiliación" -#: apps/member/models.py:492 +#: apps/member/models.py:499 msgid "memberships" msgstr "afiliaciones" @@ -839,18 +839,27 @@ msgstr "afiliaciones" msgid "Renew" msgstr "Prorrogar" -#: apps/member/templates/member/add_members.html:16 +#: apps/member/templates/member/add_members.html:17 #, python-format msgid "" "The user is not a member of the club·s %(clubs)s. An additional fee of " "%(pretty_fee)s will be charged to renew automatically the membership in this/" "these club·s." msgstr "" -"El usuario no esta miembro del/de los club·s parientes %(clubs)s. Un pago " +"El usuario no está miembro del/de los club·s parientes %(clubs)s. Un pago " "adicional de %(pretty_fee)s sera cargado para prorrogar automáticamente la " "afiliación a este/os club·s." -#: apps/member/templates/member/add_members.html:21 +#: apps/member/templates/member/add_members.html:22 +#, python-format +msgid "" +"The user is not a member of the club·s %(clubs)s. Please create the required " +"memberships, otherwise it will fail." +msgstr "" +"El usuario no está miembro del/de los club·s parientes %(clubs)s. Por favor " +"crear la·s afiliación·es requerida·s, si no la afiliación fallará." + +#: apps/member/templates/member/add_members.html:29 #, python-format msgid "" "This club has parents %(clubs)s. An additional fee of %(pretty_fee)s will be " @@ -859,13 +868,22 @@ msgstr "" "Este club tiene come pariente %(clubs)s. Un pago adicional de %(pretty_fee)s " "sera cargado para registrar automáticamente a este/os club·s." +#: apps/member/templates/member/add_members.html:34 +#, python-format +msgid "" +"This club has parents %(clubs)s. Please make sure that the user is a member " +"of this or these club·s, otherwise the creation of this membership will fail." +msgstr "" +"Este club tiene come pariente %(clubs)s. Por favor compruebe que el usuario " +"está miembro de este·os club·s, si no la afiliación fallará." + #: apps/member/templates/member/base.html:17 #: apps/registration/templates/registration/future_profile_detail.html:12 msgid "Account #" msgstr "Cuenta n°" #: apps/member/templates/member/base.html:48 -#: apps/member/templates/member/base.html:62 apps/member/views.py:57 +#: apps/member/templates/member/base.html:62 apps/member/views.py:58 #: apps/registration/templates/registration/future_profile_detail.html:48 #: apps/wei/templates/wei/weimembership_form.html:117 msgid "Update Profile" @@ -909,7 +927,7 @@ msgstr "" "desbloquearla si mismo." #: apps/member/templates/member/base.html:110 -#: apps/member/templates/member/base.html:137 apps/treasury/forms.py:89 +#: apps/member/templates/member/base.html:137 apps/treasury/forms.py:90 msgid "Close" msgstr "Cerrar" @@ -925,8 +943,8 @@ msgstr "" "nuevo posibles." #: apps/member/templates/member/club_alias.html:10 -#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:236 -#: apps/member/views.py:433 +#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:238 +#: apps/member/views.py:436 msgid "Note aliases" msgstr "Alias de la note" @@ -990,7 +1008,7 @@ 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:276 apps/wei/templates/wei/base.html:66 +#: apps/note/models/notes.py:283 apps/wei/templates/wei/base.html:66 msgid "aliases" msgstr "alias" @@ -1061,47 +1079,47 @@ msgstr "Guardar cambios" msgid "Registrations" msgstr "Registraciones" -#: apps/member/views.py:70 apps/registration/forms.py:23 +#: apps/member/views.py:71 apps/registration/forms.py:23 msgid "This address must be valid." msgstr "Este correo tiene que ser valido." -#: apps/member/views.py:135 +#: apps/member/views.py:137 msgid "Profile detail" msgstr "Detalles del usuario" -#: apps/member/views.py:195 +#: apps/member/views.py:197 msgid "Search user" msgstr "Buscar un usuario" -#: apps/member/views.py:256 +#: apps/member/views.py:258 msgid "Update note picture" msgstr "Modificar la imagen de la note" -#: apps/member/views.py:301 +#: apps/member/views.py:304 msgid "Manage auth token" msgstr "Gestionar los token de autentificación" -#: apps/member/views.py:328 +#: apps/member/views.py:331 msgid "Create new club" msgstr "Crear un nuevo club" -#: apps/member/views.py:347 +#: apps/member/views.py:350 msgid "Search club" msgstr "Buscar un club" -#: apps/member/views.py:380 +#: apps/member/views.py:383 msgid "Club detail" msgstr "Detalles del club" -#: apps/member/views.py:456 +#: apps/member/views.py:459 msgid "Update club" msgstr "Modificar el club" -#: apps/member/views.py:490 +#: apps/member/views.py:493 msgid "Add new member to the club" msgstr "Añadir un nuevo miembro al club" -#: apps/member/views.py:619 apps/wei/views.py:922 +#: apps/member/views.py:625 apps/wei/views.py:928 msgid "" "This user don't have enough money to join this club, and can't have a " "negative balance." @@ -1109,25 +1127,25 @@ msgstr "" "Este usuario no tiene suficiente dinero para unirse a este club, y no puede " "tener un saldo negativo." -#: apps/member/views.py:632 +#: apps/member/views.py:648 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:637 +#: apps/member/views.py:653 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:644 apps/member/views.py:646 apps/member/views.py:648 -#: apps/registration/views.py:291 apps/registration/views.py:293 -#: apps/registration/views.py:295 apps/wei/views.py:927 apps/wei/views.py:931 +#: apps/member/views.py:660 apps/member/views.py:662 apps/member/views.py:664 +#: apps/registration/views.py:294 apps/registration/views.py:296 +#: apps/registration/views.py:298 apps/wei/views.py:933 apps/wei/views.py:937 msgid "This field is required." msgstr "Este campo es obligatorio." -#: apps/member/views.py:783 +#: apps/member/views.py:800 msgid "Manage roles of an user in the club" msgstr "Gestionar los papeles de un usuario en el club" -#: apps/member/views.py:808 +#: apps/member/views.py:825 msgid "Members of the club" msgstr "Miembros del club" @@ -1146,7 +1164,7 @@ msgid "amount" msgstr "monto" #: apps/note/api/serializers.py:183 apps/note/api/serializers.py:189 -#: apps/note/models/transactions.py:226 +#: apps/note/models/transactions.py:224 msgid "" "The transaction can't be saved since the source note or the destination note " "is not active." @@ -1239,68 +1257,68 @@ msgstr "" msgid "notes" msgstr "notes" -#: apps/note/models/notes.py:128 +#: apps/note/models/notes.py:133 msgid "This alias is already taken." msgstr "Este alias ya esta utilizado." -#: apps/note/models/notes.py:148 +#: apps/note/models/notes.py:153 msgid "one's note" msgstr "note de un usuario" -#: apps/note/models/notes.py:149 +#: apps/note/models/notes.py:154 msgid "users note" msgstr "notes de los usuarios" -#: apps/note/models/notes.py:155 +#: apps/note/models/notes.py:160 #, python-format msgid "%(user)s's note" msgstr "Note de %(user)s" -#: apps/note/models/notes.py:189 +#: apps/note/models/notes.py:195 msgid "club note" msgstr "note de un club" -#: apps/note/models/notes.py:190 +#: apps/note/models/notes.py:196 msgid "clubs notes" msgstr "notes de los clubs" -#: apps/note/models/notes.py:196 +#: apps/note/models/notes.py:202 #, python-format msgid "Note of %(club)s club" msgstr "Note del club %(club)s" -#: apps/note/models/notes.py:235 +#: apps/note/models/notes.py:242 msgid "special note" msgstr "note especial" -#: apps/note/models/notes.py:236 +#: apps/note/models/notes.py:243 msgid "special notes" msgstr "notes especiales" -#: apps/note/models/notes.py:259 +#: apps/note/models/notes.py:266 msgid "Invalid alias" msgstr "Alias inválido" -#: apps/note/models/notes.py:275 +#: apps/note/models/notes.py:282 msgid "alias" msgstr "alias" -#: apps/note/models/notes.py:299 +#: apps/note/models/notes.py:306 msgid "Alias is too long." msgstr "El alias es demasiado largo." -#: apps/note/models/notes.py:302 +#: apps/note/models/notes.py:309 msgid "" "This alias contains only complex character. Please use a more simple alias." msgstr "" "Este alias solo contiene caracteres complejos. Por favor usa un alias más " "sencillo." -#: apps/note/models/notes.py:306 +#: apps/note/models/notes.py:313 msgid "An alias with a similar name already exists: {} " msgstr "Un alias parecido ya existe : {} " -#: apps/note/models/notes.py:319 +#: apps/note/models/notes.py:327 msgid "You can't delete your main alias." msgstr "No puede suprimir su alias principal." @@ -1358,7 +1376,7 @@ msgstr "transacción" msgid "transactions" msgstr "transacciones" -#: apps/note/models/transactions.py:184 +#: apps/note/models/transactions.py:186 #, python-brace-format msgid "" "You can't update the {field} on a Transaction. Please invalidate it and " @@ -1367,7 +1385,7 @@ msgstr "" "No se puede cambiar el {field} de una transacción. Por favor invalide esta y " "cree una nueva." -#: apps/note/models/transactions.py:204 +#: apps/note/models/transactions.py:206 msgid "" "The note balances must be between - 92 233 720 368 547 758.08 € and 92 233 " "720 368 547 758.07 €." @@ -1381,27 +1399,27 @@ msgid "" "template." msgstr "" -#: apps/note/models/transactions.py:282 +#: apps/note/models/transactions.py:283 msgid "Template" msgstr "" -#: apps/note/models/transactions.py:285 +#: apps/note/models/transactions.py:286 msgid "recurrent transaction" msgstr "" -#: apps/note/models/transactions.py:286 +#: apps/note/models/transactions.py:287 msgid "recurrent transactions" msgstr "" -#: apps/note/models/transactions.py:301 +#: apps/note/models/transactions.py:302 msgid "first_name" msgstr "nombre" -#: apps/note/models/transactions.py:306 +#: apps/note/models/transactions.py:307 msgid "bank" msgstr "banco" -#: apps/note/models/transactions.py:323 +#: apps/note/models/transactions.py:324 msgid "" "A special transaction is only possible between a Note associated to a " "payment method and a User or a Club" @@ -1409,19 +1427,19 @@ msgstr "" "Una transacción especial solo esta disponible entre una note de un modo de " "pago y un usuario o un club" -#: apps/note/models/transactions.py:331 +#: apps/note/models/transactions.py:333 msgid "Special transaction" msgstr "Transacción especial" -#: apps/note/models/transactions.py:332 +#: apps/note/models/transactions.py:334 msgid "Special transactions" msgstr "Transacciones especiales" -#: apps/note/models/transactions.py:348 +#: apps/note/models/transactions.py:350 msgid "membership transaction" msgstr "transacción de afiliación" -#: apps/note/models/transactions.py:349 apps/treasury/models.py:282 +#: apps/note/models/transactions.py:351 apps/treasury/models.py:284 msgid "membership transactions" msgstr "transacciones de afiliación" @@ -1508,7 +1526,7 @@ msgstr "Correo electrónico enviado por la Note Kfet el" #: apps/note/templates/note/transaction_form.html:54 #: apps/note/templates/note/transaction_form.html:174 msgid "Select emitters" -msgstr "Elegir les remitentes" +msgstr "Elegir los remitentes" #: apps/note/templates/note/transaction_form.html:69 msgid "I am the emitter" @@ -1524,7 +1542,7 @@ msgid "Action" msgstr "Acción" #: apps/note/templates/note/transaction_form.html:112 -#: apps/treasury/forms.py:135 apps/treasury/tables.py:67 +#: apps/treasury/forms.py:136 apps/treasury/tables.py:67 #: apps/treasury/tables.py:135 #: apps/treasury/templates/treasury/remittance_form.html:23 msgid "Amount" @@ -1674,7 +1692,7 @@ msgstr "permanente" msgid "permission" msgstr "permiso" -#: apps/permission/models.py:195 apps/permission/models.py:334 +#: apps/permission/models.py:195 apps/permission/models.py:335 msgid "permissions" msgstr "permisos" @@ -1684,11 +1702,11 @@ msgstr "" "Especifica el campo interesado, solo funciona para los permisos view y " "change." -#: apps/permission/models.py:339 +#: apps/permission/models.py:340 msgid "for club" msgstr "interesa el club" -#: apps/permission/models.py:349 apps/permission/models.py:350 +#: apps/permission/models.py:350 apps/permission/models.py:351 msgid "role permissions" msgstr "permisos por papeles" @@ -1701,7 +1719,7 @@ msgstr "" "Usted no tiene permiso a cambiar el campo {field} on this instance of model " "{app_label}.{model_name}." -#: apps/permission/signals.py:73 apps/permission/views.py:101 +#: apps/permission/signals.py:73 apps/permission/views.py:103 #, python-brace-format msgid "" "You don't have the permission to add an instance of model {app_label}." @@ -1761,25 +1779,25 @@ msgstr "Consulta :" msgid "No associated permission" msgstr "No hay permiso relacionado" -#: apps/permission/views.py:68 +#: apps/permission/views.py:70 #, 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:72 +#: apps/permission/views.py:74 #, 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:108 note_kfet/templates/base.html:106 +#: apps/permission/views.py:110 note_kfet/templates/base.html:106 msgid "Rights" msgstr "Permisos" -#: apps/permission/views.py:113 +#: apps/permission/views.py:115 msgid "All rights" msgstr "Todos los permisos" @@ -1911,54 +1929,54 @@ msgstr "Gracias" msgid "The Note Kfet team." msgstr "El equipo Note Kfet." -#: apps/registration/views.py:39 +#: apps/registration/views.py:40 msgid "Register new user" msgstr "Registrar un nuevo usuario" -#: apps/registration/views.py:83 +#: apps/registration/views.py:85 msgid "Email validation" msgstr "Validación del correo electrónico" -#: apps/registration/views.py:85 +#: apps/registration/views.py:87 msgid "Validate email" msgstr "Validar el correo electrónico" -#: apps/registration/views.py:127 +#: apps/registration/views.py:129 msgid "Email validation unsuccessful" msgstr "La validación del correo electrónico fracasó" -#: apps/registration/views.py:138 +#: apps/registration/views.py:140 msgid "Email validation email sent" msgstr "Correo de validación enviado" -#: apps/registration/views.py:146 +#: apps/registration/views.py:148 msgid "Resend email validation link" msgstr "Reenviar el enlace de validación" -#: apps/registration/views.py:164 +#: apps/registration/views.py:166 msgid "Pre-registered users list" msgstr "Lista de los usuarios con afiliación pendiente" -#: apps/registration/views.py:188 +#: apps/registration/views.py:190 msgid "Unregistered users" msgstr "Usuarios con afiliación pendiente" -#: apps/registration/views.py:201 +#: apps/registration/views.py:203 msgid "Registration detail" msgstr "Detalles de la afiliación" -#: apps/registration/views.py:260 +#: apps/registration/views.py:263 msgid "You must join the BDE." msgstr "Usted tiene que afiliarse al BDE." -#: apps/registration/views.py:284 +#: apps/registration/views.py:287 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:364 +#: apps/registration/views.py:367 msgid "Invalidate pre-registration" msgstr "Invalidar la afiliación" @@ -1966,20 +1984,20 @@ msgstr "Invalidar la afiliación" msgid "Treasury" msgstr "Tesorería" -#: apps/treasury/forms.py:24 apps/treasury/models.py:89 +#: apps/treasury/forms.py:25 apps/treasury/models.py:90 #: 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." -#: apps/treasury/forms.py:98 +#: apps/treasury/forms.py:99 msgid "Remittance is already closed." msgstr "El descuento ya esta cerrado." -#: apps/treasury/forms.py:103 +#: apps/treasury/forms.py:104 msgid "You can't change the type of the remittance." msgstr "No puede cambiar el tipo de descuento." -#: apps/treasury/forms.py:123 apps/treasury/models.py:258 +#: apps/treasury/forms.py:124 apps/treasury/models.py:260 #: apps/treasury/tables.py:97 apps/treasury/tables.py:105 #: apps/treasury/templates/treasury/invoice_list.html:16 #: apps/treasury/templates/treasury/remittance_list.html:16 @@ -1987,7 +2005,7 @@ msgstr "No puede cambiar el tipo de descuento." msgid "Remittance" msgstr "Descuento" -#: apps/treasury/forms.py:124 +#: apps/treasury/forms.py:125 msgid "No attached remittance" msgstr "No hay descuento relacionado" @@ -2011,7 +2029,7 @@ msgstr "Descripción" msgid "Address" msgstr "Dirección" -#: apps/treasury/models.py:60 apps/treasury/models.py:186 +#: apps/treasury/models.py:60 apps/treasury/models.py:187 msgid "Date" msgstr "Fecha" @@ -2031,80 +2049,80 @@ msgstr "Une factura no puede ser modificada cuando esta bloqueada." msgid "tex source" msgstr "código fuente TeX" -#: apps/treasury/models.py:109 apps/treasury/models.py:125 +#: apps/treasury/models.py:110 apps/treasury/models.py:126 msgid "invoice" msgstr "factura" -#: apps/treasury/models.py:110 +#: apps/treasury/models.py:111 msgid "invoices" msgstr "facturas" -#: apps/treasury/models.py:113 +#: apps/treasury/models.py:114 #, python-brace-format msgid "Invoice #{id}" msgstr "Factura n°{id}" -#: apps/treasury/models.py:130 +#: apps/treasury/models.py:131 msgid "Designation" msgstr "Designación" -#: apps/treasury/models.py:134 +#: apps/treasury/models.py:135 msgid "Quantity" msgstr "Cantidad" -#: apps/treasury/models.py:138 +#: apps/treasury/models.py:139 msgid "Unit price" msgstr "Precio unitario" -#: apps/treasury/models.py:154 +#: apps/treasury/models.py:155 msgid "product" msgstr "producto" -#: apps/treasury/models.py:155 +#: apps/treasury/models.py:156 msgid "products" msgstr "productos" -#: apps/treasury/models.py:175 +#: apps/treasury/models.py:176 msgid "remittance type" msgstr "tipo de descuento" -#: apps/treasury/models.py:176 +#: apps/treasury/models.py:177 msgid "remittance types" msgstr "tipos de descuentos" -#: apps/treasury/models.py:197 +#: apps/treasury/models.py:198 msgid "Comment" msgstr "Comentario" -#: apps/treasury/models.py:202 +#: apps/treasury/models.py:203 msgid "Closed" msgstr "Cerrada" -#: apps/treasury/models.py:206 +#: apps/treasury/models.py:207 msgid "remittance" msgstr "descuento" -#: apps/treasury/models.py:207 +#: apps/treasury/models.py:208 msgid "remittances" msgstr "descuentos" -#: apps/treasury/models.py:239 +#: apps/treasury/models.py:241 msgid "Remittance #{:d}: {}" msgstr "Descuento n°{:d} : {}" -#: apps/treasury/models.py:262 +#: apps/treasury/models.py:264 msgid "special transaction proxy" msgstr "proxy de transacción especial" -#: apps/treasury/models.py:263 +#: apps/treasury/models.py:265 msgid "special transaction proxies" msgstr "proxys de transacciones especiales" -#: apps/treasury/models.py:288 +#: apps/treasury/models.py:290 msgid "credit transaction" msgstr "transacción de crédito" -#: apps/treasury/models.py:361 +#: apps/treasury/models.py:369 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." @@ -2113,16 +2131,16 @@ msgstr "" "afiliaciones. Por favor pídelo acreditar su note antes de invalidar este " "crédito." -#: apps/treasury/models.py:376 +#: apps/treasury/models.py:384 #: 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:377 +#: apps/treasury/models.py:385 msgid "Credits from the Société générale" msgstr "Créditos de la Société Générale" -#: apps/treasury/models.py:380 +#: apps/treasury/models.py:388 #, python-brace-format msgid "Soge credit for {user}" msgstr "Crédito de la Société Générale para {user}" @@ -2151,12 +2169,12 @@ msgid "Yes" msgstr "Sí" #: apps/treasury/templates/treasury/invoice_confirm_delete.html:10 -#: apps/treasury/views.py:176 +#: apps/treasury/views.py:179 msgid "Delete invoice" msgstr "Suprimir la factura" #: apps/treasury/templates/treasury/invoice_confirm_delete.html:15 -#: apps/treasury/views.py:180 +#: apps/treasury/views.py:183 msgid "This invoice is locked and can't be deleted." msgstr "Esta factura esta bloqueada y no puede ser suprimida." @@ -2316,44 +2334,44 @@ msgid "There is no matched user that have asked for a Société générale credi msgstr "" "No hay usuario encontrado cual pidió un crédito de la Société Générale." -#: apps/treasury/views.py:38 +#: apps/treasury/views.py:39 msgid "Create new invoice" msgstr "Crear una nueva factura" -#: apps/treasury/views.py:94 +#: apps/treasury/views.py:96 msgid "Invoices list" msgstr "Lista de las facturas" -#: apps/treasury/views.py:109 apps/treasury/views.py:282 -#: apps/treasury/views.py:408 +#: apps/treasury/views.py:111 apps/treasury/views.py:285 +#: apps/treasury/views.py:411 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:119 +#: apps/treasury/views.py:121 msgid "Update an invoice" msgstr "Modificar una factura" -#: apps/treasury/views.py:243 +#: apps/treasury/views.py:246 msgid "Create a new remittance" msgstr "Crear un nuevo descuento" -#: apps/treasury/views.py:270 +#: apps/treasury/views.py:273 msgid "Remittances list" msgstr "Lista de los descuentos" -#: apps/treasury/views.py:333 +#: apps/treasury/views.py:336 msgid "Update a remittance" msgstr "Modificar un descuento" -#: apps/treasury/views.py:356 +#: apps/treasury/views.py:359 msgid "Attach a transaction to a remittance" msgstr "Unir una transacción con un descuento" -#: apps/treasury/views.py:400 +#: apps/treasury/views.py:403 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:440 +#: apps/treasury/views.py:443 msgid "Manage credits from the Société générale" msgstr "Gestionar los créditos de la Société Générale" @@ -2402,7 +2420,7 @@ msgstr "Elegir los papeles que le interesa." msgid "This team doesn't belong to the given bus." msgstr "Este equipo no pertenece al bus dado." -#: apps/wei/forms/surveys/wei2020.py:29 +#: apps/wei/forms/surveys/wei2020.py:30 msgid "Choose a word:" msgstr "Elegir una palabra :" @@ -2581,11 +2599,11 @@ msgstr "Pago de entrada del WEI (estudiantes no pagados)" msgid "WEI list" msgstr "Lista de los WEI" -#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:506 +#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:508 msgid "Register 1A" msgstr "Apuntar un 1A" -#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:573 +#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:576 msgid "Register 2A+" msgstr "Apuntar un 2A+" @@ -2614,8 +2632,8 @@ msgstr "Descargar un PDF" #: apps/wei/templates/wei/survey.html:11 #: apps/wei/templates/wei/survey_closed.html:11 -#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:978 -#: apps/wei/views.py:1032 apps/wei/views.py:1042 +#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:984 +#: apps/wei/views.py:1039 apps/wei/views.py:1049 msgid "Survey WEI" msgstr "Cuestionario WEI" @@ -2655,7 +2673,7 @@ msgstr "Miembros del WEI" msgid "Unvalidated registrations" msgstr "Inscripciones sin validación" -#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:76 +#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:77 msgid "Create WEI" msgstr "Crear un WEI" @@ -2796,97 +2814,97 @@ msgstr "No hay pre-inscripción encontrada con esta entrada." msgid "View validated memberships..." msgstr "Ver las inscripciones validadas..." -#: apps/wei/views.py:55 +#: apps/wei/views.py:56 msgid "Search WEI" msgstr "Buscar un WEI" -#: apps/wei/views.py:105 +#: apps/wei/views.py:107 msgid "WEI Detail" msgstr "Detalles del WEI" -#: apps/wei/views.py:200 +#: apps/wei/views.py:202 msgid "View members of the WEI" msgstr "Ver los miembros del WEI" -#: apps/wei/views.py:228 +#: apps/wei/views.py:230 msgid "Find WEI Membership" msgstr "Buscar una afiliación al WEI" -#: apps/wei/views.py:238 +#: apps/wei/views.py:240 msgid "View registrations to the WEI" msgstr "Ver las inscripciones al WEI" -#: apps/wei/views.py:262 +#: apps/wei/views.py:264 msgid "Find WEI Registration" msgstr "Buscar una inscripción al WEI" -#: apps/wei/views.py:273 +#: apps/wei/views.py:275 msgid "Update the WEI" msgstr "Modificar el WEI" -#: apps/wei/views.py:294 +#: apps/wei/views.py:296 msgid "Create new bus" msgstr "Añadir un bus" -#: apps/wei/views.py:332 +#: apps/wei/views.py:334 msgid "Update bus" msgstr "Modificar el bus" -#: apps/wei/views.py:362 +#: apps/wei/views.py:364 msgid "Manage bus" msgstr "Gestionar el bus" -#: apps/wei/views.py:389 +#: apps/wei/views.py:391 msgid "Create new team" msgstr "Añadir un equipo" -#: apps/wei/views.py:429 +#: apps/wei/views.py:431 msgid "Update team" msgstr "Modificar el equipo" -#: apps/wei/views.py:460 +#: apps/wei/views.py:462 msgid "Manage WEI team" msgstr "Gestionar el equipo" -#: apps/wei/views.py:482 +#: apps/wei/views.py:484 msgid "Register first year student to the WEI" msgstr "Registrar un 1A al WEI" -#: apps/wei/views.py:527 apps/wei/views.py:607 +#: apps/wei/views.py:530 apps/wei/views.py:611 msgid "This user is already registered to this WEI." msgstr "Este usuario ya afilió a este WEI." -#: apps/wei/views.py:532 +#: apps/wei/views.py:535 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:549 +#: apps/wei/views.py:552 msgid "Register old student to the WEI" msgstr "Registrar un 2A+ al WEI" -#: apps/wei/views.py:592 apps/wei/views.py:680 +#: apps/wei/views.py:595 apps/wei/views.py:684 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:637 +#: apps/wei/views.py:641 msgid "Update WEI Registration" msgstr "Modificar la inscripción WEI" -#: apps/wei/views.py:739 +#: apps/wei/views.py:744 msgid "Delete WEI registration" msgstr "Suprimir la inscripción WEI" -#: apps/wei/views.py:750 +#: apps/wei/views.py:755 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:769 +#: apps/wei/views.py:774 msgid "Validate WEI registration" msgstr "Validar la inscripción WEI" -#: apps/wei/views.py:916 +#: apps/wei/views.py:922 msgid "This user didn't give her/his caution check." msgstr "Este usuario no dio su cheque de garantía." diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index a391c4f6..029a4721 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: 2020-09-13 12:35+0200\n" +"POT-Creation-Date: 2020-09-19 22:00+0200\n" "PO-Revision-Date: 2020-09-13 12:36+0200\n" "Last-Translator: elkmaennchen \n" "Language-Team: \n" @@ -18,33 +18,33 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 2.3\n" -#: apps/activity/apps.py:10 apps/activity/models.py:150 -#: apps/activity/models.py:166 +#: apps/activity/apps.py:10 apps/activity/models.py:151 +#: apps/activity/models.py:167 msgid "activity" msgstr "activité" -#: apps/activity/forms.py:35 apps/activity/models.py:131 +#: apps/activity/forms.py:35 apps/activity/models.py:132 msgid "The end date must be after the start date." msgstr "La date de fin doit être après celle de début." -#: apps/activity/forms.py:76 apps/activity/models.py:268 +#: apps/activity/forms.py:76 apps/activity/models.py:270 msgid "You can't invite someone once the activity is started." msgstr "" "Vous ne pouvez pas inviter quelqu'un une fois que l'activité a démarré." -#: apps/activity/forms.py:79 apps/activity/models.py:271 +#: apps/activity/forms.py:79 apps/activity/models.py:273 msgid "This activity is not validated yet." msgstr "Cette activité n'est pas encore validée." -#: apps/activity/forms.py:89 apps/activity/models.py:279 +#: apps/activity/forms.py:89 apps/activity/models.py:281 msgid "This person has been already invited 5 times this year." msgstr "Cette personne a déjà été invitée 5 fois cette année." -#: apps/activity/forms.py:93 apps/activity/models.py:283 +#: apps/activity/forms.py:93 apps/activity/models.py:285 msgid "This person is already invited." msgstr "Cette personne est déjà invitée." -#: apps/activity/forms.py:97 apps/activity/models.py:287 +#: apps/activity/forms.py:97 apps/activity/models.py:289 msgid "You can't invite more than 3 people to this activity." msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité." @@ -52,9 +52,9 @@ msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité." #: apps/member/models.py:199 #: apps/member/templates/member/includes/club_info.html:4 #: apps/member/templates/member/includes/profile_info.html:4 -#: apps/note/models/notes.py:253 apps/note/models/transactions.py:26 -#: apps/note/models/transactions.py:46 apps/note/models/transactions.py:296 -#: apps/permission/models.py:329 +#: apps/note/models/notes.py:260 apps/note/models/transactions.py:26 +#: apps/note/models/transactions.py:46 apps/note/models/transactions.py:297 +#: apps/permission/models.py:330 #: apps/registration/templates/registration/future_profile_detail.html:16 #: apps/wei/models.py:66 apps/wei/models.py:118 #: apps/wei/templates/wei/base.html:26 @@ -105,13 +105,13 @@ msgstr "Lieu où l'activité est organisée, par exemple la Kfet." #: apps/activity/models.py:83 #: apps/activity/templates/activity/includes/activity_info.html:22 -#: apps/note/models/notes.py:229 apps/note/models/transactions.py:66 +#: apps/note/models/notes.py:236 apps/note/models/transactions.py:66 #: apps/permission/models.py:164 msgid "type" msgstr "type" -#: apps/activity/models.py:89 apps/logs/models.py:22 apps/member/models.py:304 -#: apps/note/models/notes.py:144 apps/treasury/models.py:276 +#: apps/activity/models.py:89 apps/logs/models.py:22 apps/member/models.py:305 +#: apps/note/models/notes.py:149 apps/treasury/models.py:278 #: apps/treasury/templates/treasury/sogecredit_detail.html:14 #: apps/wei/models.py:160 apps/wei/templates/wei/survey.html:15 msgid "user" @@ -158,75 +158,75 @@ msgstr "valide" msgid "open" msgstr "ouvrir" -#: apps/activity/models.py:151 +#: apps/activity/models.py:152 msgid "activities" msgstr "activités" -#: apps/activity/models.py:171 +#: apps/activity/models.py:172 msgid "entry time" msgstr "heure d'entrée" -#: apps/activity/models.py:177 apps/note/apps.py:14 +#: apps/activity/models.py:178 apps/note/apps.py:14 #: apps/note/models/notes.py:78 msgid "note" msgstr "note" -#: apps/activity/models.py:188 +#: apps/activity/models.py:189 #: apps/activity/templates/activity/activity_entry.html:46 msgid "entry" msgstr "entrée" -#: apps/activity/models.py:189 +#: apps/activity/models.py:190 #: apps/activity/templates/activity/activity_entry.html:46 msgid "entries" msgstr "entrées" -#: apps/activity/models.py:192 +#: apps/activity/models.py:193 #, python-brace-format msgid "Entry for {guest}, invited by {note} to the activity {activity}" msgstr "Entrée pour {guest}, invité par {note} à l'activité {activity}" -#: apps/activity/models.py:194 +#: apps/activity/models.py:195 #, python-brace-format msgid "Entry for {note} to the activity {activity}" msgstr "Entrée de la note {note} pour l'activité « {activity} »" -#: apps/activity/models.py:201 +#: apps/activity/models.py:202 msgid "Already entered on " msgstr "Déjà rentré le " -#: apps/activity/models.py:201 apps/activity/tables.py:54 +#: apps/activity/models.py:202 apps/activity/tables.py:54 msgid "{:%Y-%m-%d %H:%M:%S}" msgstr "{:%d/%m/%Y %H:%M:%S}" -#: apps/activity/models.py:209 +#: apps/activity/models.py:210 msgid "The balance is negative." msgstr "La note est en négatif." -#: apps/activity/models.py:239 +#: apps/activity/models.py:240 msgid "last name" msgstr "nom de famille" -#: apps/activity/models.py:244 +#: apps/activity/models.py:245 #: apps/member/templates/member/includes/profile_info.html:4 #: apps/registration/templates/registration/future_profile_detail.html:16 #: apps/wei/templates/wei/weimembership_form.html:14 msgid "first name" msgstr "prénom" -#: apps/activity/models.py:251 +#: apps/activity/models.py:252 msgid "inviter" msgstr "hôte" -#: apps/activity/models.py:295 +#: apps/activity/models.py:297 msgid "guest" msgstr "invité" -#: apps/activity/models.py:296 +#: apps/activity/models.py:298 msgid "guests" msgstr "invités" -#: apps/activity/models.py:308 +#: apps/activity/models.py:310 msgid "Invitation" msgstr "Invitation" @@ -250,19 +250,19 @@ msgstr "Entré le " msgid "remove" msgstr "supprimer" -#: apps/activity/tables.py:80 apps/note/forms.py:68 apps/treasury/models.py:192 +#: apps/activity/tables.py:80 apps/note/forms.py:68 apps/treasury/models.py:193 msgid "Type" msgstr "Type" -#: apps/activity/tables.py:82 apps/member/forms.py:183 -#: apps/registration/forms.py:81 apps/treasury/forms.py:129 +#: apps/activity/tables.py:82 apps/member/forms.py:185 +#: apps/registration/forms.py:81 apps/treasury/forms.py:130 #: apps/wei/forms/registration.py:96 msgid "Last name" msgstr "Nom de famille" -#: apps/activity/tables.py:84 apps/member/forms.py:188 +#: apps/activity/tables.py:84 apps/member/forms.py:190 #: apps/note/templates/note/transaction_form.html:134 -#: apps/registration/forms.py:86 apps/treasury/forms.py:131 +#: apps/registration/forms.py:86 apps/treasury/forms.py:132 #: apps/wei/forms/registration.py:101 msgid "First name" msgstr "Prénom" @@ -288,13 +288,13 @@ msgid "Transfer" msgstr "Virement" #: apps/activity/templates/activity/activity_entry.html:18 -#: apps/note/models/transactions.py:312 +#: apps/note/models/transactions.py:313 #: apps/note/templates/note/transaction_form.html:21 msgid "Credit" msgstr "Crédit" #: apps/activity/templates/activity/activity_entry.html:21 -#: apps/note/models/transactions.py:312 +#: apps/note/models/transactions.py:313 #: apps/note/templates/note/transaction_form.html:25 msgid "Debit" msgstr "Débit" @@ -309,10 +309,10 @@ msgid "Return to activity page" msgstr "Retour à la page de l'activité" #: apps/activity/templates/activity/activity_form.html:16 -#: apps/member/templates/member/add_members.html:32 +#: 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:87 apps/treasury/forms.py:141 +#: apps/treasury/forms.py:88 apps/treasury/forms.py:142 #: apps/treasury/templates/treasury/invoice_form.html:74 #: apps/wei/templates/wei/bus_form.html:17 #: apps/wei/templates/wei/busteam_form.html:17 @@ -374,41 +374,41 @@ msgstr "modifier" msgid "Invite" msgstr "Inviter" -#: apps/activity/views.py:33 +#: apps/activity/views.py:34 msgid "Create new activity" msgstr "Créer une nouvelle activité" -#: apps/activity/views.py:63 note_kfet/templates/base.html:88 +#: apps/activity/views.py:65 note_kfet/templates/base.html:88 msgid "Activities" msgstr "Activités" -#: apps/activity/views.py:91 +#: apps/activity/views.py:93 msgid "Activity detail" msgstr "Détails de l'activité" -#: apps/activity/views.py:111 +#: apps/activity/views.py:113 msgid "Update activity" msgstr "Modifier l'activité" -#: apps/activity/views.py:138 +#: apps/activity/views.py:140 msgid "Invite guest to the activity \"{}\"" msgstr "Invitation pour l'activité « {} »" -#: apps/activity/views.py:172 +#: apps/activity/views.py:175 msgid "You are not allowed to display the entry interface for this activity." msgstr "" "Vous n'êtes pas autorisé à afficher l'interface des entrées pour cette " "activité." -#: apps/activity/views.py:175 +#: apps/activity/views.py:178 msgid "This activity does not support activity entries." msgstr "Cette activité ne requiert pas d'entrées." -#: apps/activity/views.py:178 +#: apps/activity/views.py:181 msgid "This activity is closed." msgstr "Cette activité est fermée." -#: apps/activity/views.py:274 +#: apps/activity/views.py:277 msgid "Entry for activity \"{}\"" msgstr "Entrées pour l'activité « {} »" @@ -485,11 +485,11 @@ msgstr "cotisation pour adhérer (normalien élève)" msgid "membership fee (unpaid students)" msgstr "cotisation pour adhérer (normalien étudiant)" -#: apps/member/admin.py:65 apps/member/models.py:315 +#: apps/member/admin.py:65 apps/member/models.py:316 msgid "roles" msgstr "rôles" -#: apps/member/admin.py:66 apps/member/models.py:329 +#: apps/member/admin.py:66 apps/member/models.py:330 msgid "fee" msgstr "cotisation" @@ -497,77 +497,77 @@ msgstr "cotisation" msgid "member" msgstr "adhérent" -#: apps/member/forms.py:23 +#: apps/member/forms.py:24 msgid "Permission mask" msgstr "Masque de permissions" -#: apps/member/forms.py:45 +#: apps/member/forms.py:46 msgid "Report frequency" msgstr "Fréquence des rapports (en jours)" -#: apps/member/forms.py:47 +#: apps/member/forms.py:48 msgid "Last report date" msgstr "Date de dernier rapport" -#: apps/member/forms.py:52 +#: apps/member/forms.py:53 msgid "You can't register to the note if you come from the future." msgstr "Vous ne pouvez pas vous inscrire à la note si vous venez du futur." -#: apps/member/forms.py:77 +#: apps/member/forms.py:79 msgid "select an image" msgstr "choisissez une image" -#: apps/member/forms.py:78 +#: apps/member/forms.py:80 msgid "Maximal size: 2MB" msgstr "Taille maximale : 2 Mo" -#: apps/member/forms.py:103 +#: apps/member/forms.py:105 msgid "This image cannot be loaded." msgstr "Cette image ne peut pas être chargée." -#: apps/member/forms.py:139 apps/member/views.py:98 -#: apps/registration/forms.py:33 apps/registration/views.py:241 +#: apps/member/forms.py:141 apps/member/views.py:100 +#: apps/registration/forms.py:33 apps/registration/views.py:244 msgid "An alias with a similar name already exists." msgstr "Un alias avec un nom similaire existe déjà." -#: apps/member/forms.py:162 apps/registration/forms.py:61 +#: apps/member/forms.py:164 apps/registration/forms.py:61 msgid "Inscription paid by Société Générale" msgstr "Inscription payée par la Société générale" -#: apps/member/forms.py:164 apps/registration/forms.py:63 +#: apps/member/forms.py:166 apps/registration/forms.py:63 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:169 apps/registration/forms.py:68 +#: apps/member/forms.py:171 apps/registration/forms.py:68 #: apps/wei/forms/registration.py:83 msgid "Credit type" msgstr "Type de rechargement" -#: apps/member/forms.py:170 apps/registration/forms.py:69 +#: apps/member/forms.py:172 apps/registration/forms.py:69 #: apps/wei/forms/registration.py:84 msgid "No credit" msgstr "Pas de rechargement" -#: apps/member/forms.py:172 +#: apps/member/forms.py:174 msgid "You can credit the note of the user." msgstr "Vous pouvez créditer la note de l'utilisateur avant l'adhésion." -#: apps/member/forms.py:176 apps/registration/forms.py:74 +#: apps/member/forms.py:178 apps/registration/forms.py:74 #: apps/wei/forms/registration.py:89 msgid "Credit amount" msgstr "Montant à créditer" -#: apps/member/forms.py:193 apps/note/templates/note/transaction_form.html:140 -#: apps/registration/forms.py:91 apps/treasury/forms.py:133 +#: apps/member/forms.py:195 apps/note/templates/note/transaction_form.html:140 +#: apps/registration/forms.py:91 apps/treasury/forms.py:134 #: apps/wei/forms/registration.py:106 msgid "Bank" msgstr "Banque" -#: apps/member/forms.py:220 +#: apps/member/forms.py:222 msgid "User" msgstr "Utilisateur" -#: apps/member/forms.py:234 +#: apps/member/forms.py:236 msgid "Roles" msgstr "Rôles" @@ -794,46 +794,46 @@ msgstr "" "Date maximale d'une fin d'adhésion, après laquelle les adhérents doivent la " "renouveler." -#: apps/member/models.py:285 apps/member/models.py:310 -#: apps/note/models/notes.py:185 +#: apps/member/models.py:286 apps/member/models.py:311 +#: apps/note/models/notes.py:191 msgid "club" msgstr "club" -#: apps/member/models.py:286 +#: apps/member/models.py:287 msgid "clubs" msgstr "clubs" -#: apps/member/models.py:320 +#: apps/member/models.py:321 msgid "membership starts on" msgstr "l'adhésion commence le" -#: apps/member/models.py:324 +#: apps/member/models.py:325 msgid "membership ends on" msgstr "l'adhésion finit le" -#: apps/member/models.py:419 +#: apps/member/models.py:421 #, python-brace-format msgid "The role {role} does not apply to the club {club}." msgstr "Le rôle {role} ne s'applique pas au club {club}." -#: apps/member/models.py:428 apps/member/views.py:628 +#: apps/member/models.py:430 apps/member/views.py:634 msgid "User is already a member of the club" msgstr "L'utilisateur est déjà membre du club" -#: apps/member/models.py:440 +#: apps/member/models.py:442 apps/member/views.py:644 msgid "User is not a member of the parent club" msgstr "L'utilisateur n'est pas membre du club parent" -#: apps/member/models.py:488 +#: apps/member/models.py:495 #, python-brace-format msgid "Membership of {user} for the club {club}" msgstr "Adhésion de {user} pour le club {club}" -#: apps/member/models.py:491 apps/note/models/transactions.py:353 +#: apps/member/models.py:498 apps/note/models/transactions.py:355 msgid "membership" msgstr "adhésion" -#: apps/member/models.py:492 +#: apps/member/models.py:499 msgid "memberships" msgstr "adhésions" @@ -841,7 +841,7 @@ msgstr "adhésions" msgid "Renew" msgstr "Renouveler" -#: apps/member/templates/member/add_members.html:16 +#: apps/member/templates/member/add_members.html:17 #, python-format msgid "" "The user is not a member of the club·s %(clubs)s. An additional fee of " @@ -849,10 +849,19 @@ msgid "" "these club·s." msgstr "" "Cet utilisateur n'est pas membre du/des club·s parent·s %(clubs)s. Un " -"montant supplémentaire de%(pretty_fee)s sera débitée afin de renouveler " +"montant supplémentaire de %(pretty_fee)s sera débité afin de renouveler " "automatiquement l'adhésion dans ce·s club·s." -#: apps/member/templates/member/add_members.html:21 +#: apps/member/templates/member/add_members.html:22 +#, python-format +msgid "" +"The user is not a member of the club·s %(clubs)s. Please create the required " +"memberships, otherwise it will fail." +msgstr "" +"Cet utilisateur n'est pas membre du/des club·s parent·s %(clubs)s. Merci de " +"d'abord créer l'adhésion requise, sinon cette adhésion va échouer." + +#: apps/member/templates/member/add_members.html:29 #, python-format msgid "" "This club has parents %(clubs)s. An additional fee of %(pretty_fee)s will be " @@ -861,13 +870,22 @@ msgstr "" "Ce club a pour parent·s %(clubs)s. Un coût supplémentaire de %(pretty_fee)s " "peut être ajouté pour adhérer automatiquement à ce·s club·s." +#: apps/member/templates/member/add_members.html:34 +#, python-format +msgid "" +"This club has parents %(clubs)s. Please make sure that the user is a member " +"of this or these club·s, otherwise the creation of this membership will fail." +msgstr "" +"Ce club a pour parents %(clubs)s. Merci de vous assurer que l'utilisateur " +"est membre de ce·s club·s, sinon la création de cette adhésion va échouer." + #: apps/member/templates/member/base.html:17 #: apps/registration/templates/registration/future_profile_detail.html:12 msgid "Account #" msgstr "Compte n°" #: apps/member/templates/member/base.html:48 -#: apps/member/templates/member/base.html:62 apps/member/views.py:57 +#: apps/member/templates/member/base.html:62 apps/member/views.py:58 #: apps/registration/templates/registration/future_profile_detail.html:48 #: apps/wei/templates/wei/weimembership_form.html:117 msgid "Update Profile" @@ -911,7 +929,7 @@ msgstr "" "déverrouiller lui-même." #: apps/member/templates/member/base.html:110 -#: apps/member/templates/member/base.html:137 apps/treasury/forms.py:89 +#: apps/member/templates/member/base.html:137 apps/treasury/forms.py:90 msgid "Close" msgstr "Fermer" @@ -927,8 +945,8 @@ msgstr "" "à nouveau possible." #: apps/member/templates/member/club_alias.html:10 -#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:236 -#: apps/member/views.py:433 +#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:238 +#: apps/member/views.py:436 msgid "Note aliases" msgstr "Alias de la note" @@ -992,7 +1010,7 @@ 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:276 apps/wei/templates/wei/base.html:66 +#: apps/note/models/notes.py:283 apps/wei/templates/wei/base.html:66 msgid "aliases" msgstr "alias" @@ -1063,47 +1081,47 @@ msgstr "Sauvegarder les changements" msgid "Registrations" msgstr "Inscriptions" -#: apps/member/views.py:70 apps/registration/forms.py:23 +#: apps/member/views.py:71 apps/registration/forms.py:23 msgid "This address must be valid." msgstr "Cette adresse doit être valide." -#: apps/member/views.py:135 +#: apps/member/views.py:137 msgid "Profile detail" msgstr "Détails de l'utilisateur" -#: apps/member/views.py:195 +#: apps/member/views.py:197 msgid "Search user" msgstr "Chercher un utilisateur" -#: apps/member/views.py:256 +#: apps/member/views.py:258 msgid "Update note picture" msgstr "Modifier la photo de la note" -#: apps/member/views.py:301 +#: apps/member/views.py:304 msgid "Manage auth token" msgstr "Gérer les jetons d'authentification" -#: apps/member/views.py:328 +#: apps/member/views.py:331 msgid "Create new club" msgstr "Créer un nouveau club" -#: apps/member/views.py:347 +#: apps/member/views.py:350 msgid "Search club" msgstr "Chercher un club" -#: apps/member/views.py:380 +#: apps/member/views.py:383 msgid "Club detail" msgstr "Détails du club" -#: apps/member/views.py:456 +#: apps/member/views.py:459 msgid "Update club" msgstr "Modifier le club" -#: apps/member/views.py:490 +#: apps/member/views.py:493 msgid "Add new member to the club" msgstr "Ajouter un nouveau membre au club" -#: apps/member/views.py:619 apps/wei/views.py:922 +#: apps/member/views.py:625 apps/wei/views.py:928 msgid "" "This user don't have enough money to join this club, and can't have a " "negative balance." @@ -1111,25 +1129,25 @@ msgstr "" "Cet utilisateur n'a pas assez d'argent pour rejoindre ce club et ne peut pas " "avoir un solde négatif." -#: apps/member/views.py:632 +#: apps/member/views.py:648 msgid "The membership must start after {:%m-%d-%Y}." msgstr "L'adhésion doit commencer après le {:%d/%m/%Y}." -#: apps/member/views.py:637 +#: apps/member/views.py:653 msgid "The membership must begin before {:%m-%d-%Y}." msgstr "L'adhésion doit commencer avant le {:%d/%m/%Y}." -#: apps/member/views.py:644 apps/member/views.py:646 apps/member/views.py:648 -#: apps/registration/views.py:291 apps/registration/views.py:293 -#: apps/registration/views.py:295 apps/wei/views.py:927 apps/wei/views.py:931 +#: apps/member/views.py:660 apps/member/views.py:662 apps/member/views.py:664 +#: apps/registration/views.py:294 apps/registration/views.py:296 +#: apps/registration/views.py:298 apps/wei/views.py:933 apps/wei/views.py:937 msgid "This field is required." msgstr "Ce champ est requis." -#: apps/member/views.py:783 +#: apps/member/views.py:800 msgid "Manage roles of an user in the club" msgstr "Gérer les rôles d'un utilisateur dans le club" -#: apps/member/views.py:808 +#: apps/member/views.py:825 msgid "Members of the club" msgstr "Membres du club" @@ -1148,7 +1166,7 @@ msgid "amount" msgstr "montant" #: apps/note/api/serializers.py:183 apps/note/api/serializers.py:189 -#: apps/note/models/transactions.py:226 +#: apps/note/models/transactions.py:224 msgid "" "The transaction can't be saved since the source note or the destination note " "is not active." @@ -1241,68 +1259,68 @@ msgstr "" msgid "notes" msgstr "notes" -#: apps/note/models/notes.py:128 +#: apps/note/models/notes.py:133 msgid "This alias is already taken." msgstr "Cet alias est déjà pris." -#: apps/note/models/notes.py:148 +#: apps/note/models/notes.py:153 msgid "one's note" msgstr "note d'un utilisateur" -#: apps/note/models/notes.py:149 +#: apps/note/models/notes.py:154 msgid "users note" msgstr "notes des utilisateurs" -#: apps/note/models/notes.py:155 +#: apps/note/models/notes.py:160 #, python-format msgid "%(user)s's note" msgstr "Note de %(user)s" -#: apps/note/models/notes.py:189 +#: apps/note/models/notes.py:195 msgid "club note" msgstr "note d'un club" -#: apps/note/models/notes.py:190 +#: apps/note/models/notes.py:196 msgid "clubs notes" msgstr "notes des clubs" -#: apps/note/models/notes.py:196 +#: apps/note/models/notes.py:202 #, python-format msgid "Note of %(club)s club" msgstr "Note du club %(club)s" -#: apps/note/models/notes.py:235 +#: apps/note/models/notes.py:242 msgid "special note" msgstr "note spéciale" -#: apps/note/models/notes.py:236 +#: apps/note/models/notes.py:243 msgid "special notes" msgstr "notes spéciales" -#: apps/note/models/notes.py:259 +#: apps/note/models/notes.py:266 msgid "Invalid alias" msgstr "Alias invalide" -#: apps/note/models/notes.py:275 +#: apps/note/models/notes.py:282 msgid "alias" msgstr "alias" -#: apps/note/models/notes.py:299 +#: apps/note/models/notes.py:306 msgid "Alias is too long." msgstr "L'alias est trop long." -#: apps/note/models/notes.py:302 +#: apps/note/models/notes.py:309 msgid "" "This alias contains only complex character. Please use a more simple alias." msgstr "" "Cet alias ne contient que des caractères complexes. Merci d'utiliser un " "alias plus simple." -#: apps/note/models/notes.py:306 +#: apps/note/models/notes.py:313 msgid "An alias with a similar name already exists: {} " msgstr "Un alias avec un nom similaire existe déjà : {} " -#: apps/note/models/notes.py:319 +#: apps/note/models/notes.py:327 msgid "You can't delete your main alias." msgstr "Vous ne pouvez pas supprimer votre alias principal." @@ -1360,7 +1378,7 @@ msgstr "transaction" msgid "transactions" msgstr "transactions" -#: apps/note/models/transactions.py:184 +#: apps/note/models/transactions.py:186 #, python-brace-format msgid "" "You can't update the {field} on a Transaction. Please invalidate it and " @@ -1369,7 +1387,7 @@ msgstr "" "Vous ne pouvez pas mettre à jour le champ {field} dans une transaction. " "Merci de l'invalider et d'en créer une autre." -#: apps/note/models/transactions.py:204 +#: apps/note/models/transactions.py:206 msgid "" "The note balances must be between - 92 233 720 368 547 758.08 € and 92 233 " "720 368 547 758.07 €." @@ -1386,27 +1404,27 @@ msgstr "" "Le destinataire de cette transaction doit être identique à celui du bouton " "utilisé." -#: apps/note/models/transactions.py:282 +#: apps/note/models/transactions.py:283 msgid "Template" msgstr "Bouton" -#: apps/note/models/transactions.py:285 +#: apps/note/models/transactions.py:286 msgid "recurrent transaction" msgstr "transaction issue de bouton" -#: apps/note/models/transactions.py:286 +#: apps/note/models/transactions.py:287 msgid "recurrent transactions" msgstr "transactions issues de boutons" -#: apps/note/models/transactions.py:301 +#: apps/note/models/transactions.py:302 msgid "first_name" msgstr "prénom" -#: apps/note/models/transactions.py:306 +#: apps/note/models/transactions.py:307 msgid "bank" msgstr "banque" -#: apps/note/models/transactions.py:323 +#: apps/note/models/transactions.py:324 msgid "" "A special transaction is only possible between a Note associated to a " "payment method and a User or a Club" @@ -1414,19 +1432,19 @@ msgstr "" "Une transaction spéciale n'est possible que entre une note associée à un " "mode de paiement et un utilisateur ou un club" -#: apps/note/models/transactions.py:331 +#: apps/note/models/transactions.py:333 msgid "Special transaction" msgstr "Transaction de crédit/retrait" -#: apps/note/models/transactions.py:332 +#: apps/note/models/transactions.py:334 msgid "Special transactions" msgstr "Transactions de crédit/retrait" -#: apps/note/models/transactions.py:348 +#: apps/note/models/transactions.py:350 msgid "membership transaction" msgstr "transaction d'adhésion" -#: apps/note/models/transactions.py:349 apps/treasury/models.py:282 +#: apps/note/models/transactions.py:351 apps/treasury/models.py:284 msgid "membership transactions" msgstr "transactions d'adhésion" @@ -1529,7 +1547,7 @@ msgid "Action" msgstr "Action" #: apps/note/templates/note/transaction_form.html:112 -#: apps/treasury/forms.py:135 apps/treasury/tables.py:67 +#: apps/treasury/forms.py:136 apps/treasury/tables.py:67 #: apps/treasury/tables.py:135 #: apps/treasury/templates/treasury/remittance_form.html:23 msgid "Amount" @@ -1679,7 +1697,7 @@ msgstr "permanent" msgid "permission" msgstr "permission" -#: apps/permission/models.py:195 apps/permission/models.py:334 +#: apps/permission/models.py:195 apps/permission/models.py:335 msgid "permissions" msgstr "permissions" @@ -1689,11 +1707,11 @@ msgstr "" "Spécifie le champ concerné, ne fonctionne que pour les permissions view et " "change." -#: apps/permission/models.py:339 +#: apps/permission/models.py:340 msgid "for club" msgstr "s'applique au club" -#: apps/permission/models.py:349 apps/permission/models.py:350 +#: apps/permission/models.py:350 apps/permission/models.py:351 msgid "role permissions" msgstr "permissions par rôles" @@ -1706,7 +1724,7 @@ msgstr "" "Vous n'avez pas la permission de modifier le champ {field} sur l'instance du " "modèle {app_label}.{model_name}." -#: apps/permission/signals.py:73 apps/permission/views.py:101 +#: apps/permission/signals.py:73 apps/permission/views.py:103 #, python-brace-format msgid "" "You don't have the permission to add an instance of model {app_label}." @@ -1765,7 +1783,7 @@ msgstr "Requête :" msgid "No associated permission" msgstr "Pas de permission associée" -#: apps/permission/views.py:68 +#: apps/permission/views.py:70 #, python-brace-format msgid "" "You don't have the permission to update this instance of the model " @@ -1774,7 +1792,7 @@ msgstr "" "Vous n'avez pas la permission de modifier cette instance du modèle « {model} " "» avec ces paramètres. Merci de les corriger et de réessayer." -#: apps/permission/views.py:72 +#: apps/permission/views.py:74 #, python-brace-format msgid "" "You don't have the permission to create an instance of the model \"{model}\" " @@ -1783,11 +1801,11 @@ msgstr "" "Vous n'avez pas la permission d'ajouter une instance du modèle « {model} » " "avec ces paramètres. Merci de les corriger et de réessayer." -#: apps/permission/views.py:108 note_kfet/templates/base.html:106 +#: apps/permission/views.py:110 note_kfet/templates/base.html:106 msgid "Rights" msgstr "Droits" -#: apps/permission/views.py:113 +#: apps/permission/views.py:115 msgid "All rights" msgstr "Tous les droits" @@ -1918,54 +1936,54 @@ msgstr "Merci" msgid "The Note Kfet team." msgstr "L'équipe de la Note Kfet." -#: apps/registration/views.py:39 +#: apps/registration/views.py:40 msgid "Register new user" msgstr "Enregistrer un nouvel utilisateur" -#: apps/registration/views.py:83 +#: apps/registration/views.py:85 msgid "Email validation" msgstr "Validation de l'adresse mail" -#: apps/registration/views.py:85 +#: apps/registration/views.py:87 msgid "Validate email" msgstr "Valider l'adresse e-mail" -#: apps/registration/views.py:127 +#: apps/registration/views.py:129 msgid "Email validation unsuccessful" msgstr "La validation de l'adresse mail a échoué" -#: apps/registration/views.py:138 +#: apps/registration/views.py:140 msgid "Email validation email sent" msgstr "L'email de vérification de l'adresse email a bien été envoyé" -#: apps/registration/views.py:146 +#: apps/registration/views.py:148 msgid "Resend email validation link" msgstr "Renvoyer le lien de validation" -#: apps/registration/views.py:164 +#: apps/registration/views.py:166 msgid "Pre-registered users list" msgstr "Liste des utilisateurs en attente d'inscription" -#: apps/registration/views.py:188 +#: apps/registration/views.py:190 msgid "Unregistered users" msgstr "Utilisateurs en attente d'inscription" -#: apps/registration/views.py:201 +#: apps/registration/views.py:203 msgid "Registration detail" msgstr "Détails de l'inscription" -#: apps/registration/views.py:260 +#: apps/registration/views.py:263 msgid "You must join the BDE." msgstr "Vous devez adhérer au BDE." -#: apps/registration/views.py:284 +#: apps/registration/views.py:287 msgid "" "The entered amount is not enough for the memberships, should be at least {}" msgstr "" "Le montant crédité est trop faible pour adhérer, il doit être au minimum de " "{}" -#: apps/registration/views.py:364 +#: apps/registration/views.py:367 msgid "Invalidate pre-registration" msgstr "Invalider l'inscription" @@ -1973,20 +1991,20 @@ msgstr "Invalider l'inscription" msgid "Treasury" msgstr "Trésorerie" -#: apps/treasury/forms.py:24 apps/treasury/models.py:89 +#: apps/treasury/forms.py:25 apps/treasury/models.py:90 #: apps/treasury/templates/treasury/invoice_form.html:22 msgid "This invoice is locked and can no longer be edited." msgstr "Cette facture est verrouillée et ne peut plus être éditée." -#: apps/treasury/forms.py:98 +#: apps/treasury/forms.py:99 msgid "Remittance is already closed." msgstr "La remise est déjà fermée." -#: apps/treasury/forms.py:103 +#: apps/treasury/forms.py:104 msgid "You can't change the type of the remittance." msgstr "Vous ne pouvez pas changer le type de la remise." -#: apps/treasury/forms.py:123 apps/treasury/models.py:258 +#: apps/treasury/forms.py:124 apps/treasury/models.py:260 #: apps/treasury/tables.py:97 apps/treasury/tables.py:105 #: apps/treasury/templates/treasury/invoice_list.html:16 #: apps/treasury/templates/treasury/remittance_list.html:16 @@ -1994,7 +2012,7 @@ msgstr "Vous ne pouvez pas changer le type de la remise." msgid "Remittance" msgstr "Remise" -#: apps/treasury/forms.py:124 +#: apps/treasury/forms.py:125 msgid "No attached remittance" msgstr "Pas de remise associée" @@ -2018,7 +2036,7 @@ msgstr "Description" msgid "Address" msgstr "Adresse" -#: apps/treasury/models.py:60 apps/treasury/models.py:186 +#: apps/treasury/models.py:60 apps/treasury/models.py:187 msgid "Date" msgstr "Date" @@ -2038,80 +2056,80 @@ msgstr "Une facture ne peut plus être modifiée si elle est verrouillée." msgid "tex source" msgstr "fichier TeX source" -#: apps/treasury/models.py:109 apps/treasury/models.py:125 +#: apps/treasury/models.py:110 apps/treasury/models.py:126 msgid "invoice" msgstr "facture" -#: apps/treasury/models.py:110 +#: apps/treasury/models.py:111 msgid "invoices" msgstr "factures" -#: apps/treasury/models.py:113 +#: apps/treasury/models.py:114 #, python-brace-format msgid "Invoice #{id}" msgstr "Facture n°{id}" -#: apps/treasury/models.py:130 +#: apps/treasury/models.py:131 msgid "Designation" msgstr "Désignation" -#: apps/treasury/models.py:134 +#: apps/treasury/models.py:135 msgid "Quantity" msgstr "Quantité" -#: apps/treasury/models.py:138 +#: apps/treasury/models.py:139 msgid "Unit price" msgstr "Prix unitaire" -#: apps/treasury/models.py:154 +#: apps/treasury/models.py:155 msgid "product" msgstr "produit" -#: apps/treasury/models.py:155 +#: apps/treasury/models.py:156 msgid "products" msgstr "produits" -#: apps/treasury/models.py:175 +#: apps/treasury/models.py:176 msgid "remittance type" msgstr "type de remise" -#: apps/treasury/models.py:176 +#: apps/treasury/models.py:177 msgid "remittance types" msgstr "types de remises" -#: apps/treasury/models.py:197 +#: apps/treasury/models.py:198 msgid "Comment" msgstr "Commentaire" -#: apps/treasury/models.py:202 +#: apps/treasury/models.py:203 msgid "Closed" msgstr "Fermée" -#: apps/treasury/models.py:206 +#: apps/treasury/models.py:207 msgid "remittance" msgstr "remise" -#: apps/treasury/models.py:207 +#: apps/treasury/models.py:208 msgid "remittances" msgstr "remises" -#: apps/treasury/models.py:239 +#: apps/treasury/models.py:241 msgid "Remittance #{:d}: {}" msgstr "Remise n°{:d} : {}" -#: apps/treasury/models.py:262 +#: apps/treasury/models.py:264 msgid "special transaction proxy" msgstr "proxy de transaction spéciale" -#: apps/treasury/models.py:263 +#: apps/treasury/models.py:265 msgid "special transaction proxies" msgstr "proxys de transactions spéciales" -#: apps/treasury/models.py:288 +#: apps/treasury/models.py:290 msgid "credit transaction" msgstr "transaction de crédit" -#: apps/treasury/models.py:361 +#: apps/treasury/models.py:369 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." @@ -2119,16 +2137,16 @@ msgstr "" "Cet utilisateur n'a pas assez d'argent pour payer les adhésions avec sa " "note. Merci de lui demander de recharger sa note avant d'invalider ce crédit." -#: apps/treasury/models.py:376 +#: apps/treasury/models.py:384 #: apps/treasury/templates/treasury/sogecredit_detail.html:10 msgid "Credit from the Société générale" msgstr "Crédit de la Société générale" -#: apps/treasury/models.py:377 +#: apps/treasury/models.py:385 msgid "Credits from the Société générale" msgstr "Crédits de la Société générale" -#: apps/treasury/models.py:380 +#: apps/treasury/models.py:388 #, python-brace-format msgid "Soge credit for {user}" msgstr "Crédit de la société générale pour l'utilisateur {user}" @@ -2157,12 +2175,12 @@ msgid "Yes" msgstr "Oui" #: apps/treasury/templates/treasury/invoice_confirm_delete.html:10 -#: apps/treasury/views.py:176 +#: apps/treasury/views.py:179 msgid "Delete invoice" msgstr "Supprimer la facture" #: apps/treasury/templates/treasury/invoice_confirm_delete.html:15 -#: apps/treasury/views.py:180 +#: apps/treasury/views.py:183 msgid "This invoice is locked and can't be deleted." msgstr "Cette facture est verrouillée et ne peut pas être supprimée." @@ -2326,44 +2344,44 @@ msgstr "" "Il n'y a pas d'utilisateur trouvé ayant demandé un crédit de la Société " "générale." -#: apps/treasury/views.py:38 +#: apps/treasury/views.py:39 msgid "Create new invoice" msgstr "Créer une nouvelle facture" -#: apps/treasury/views.py:94 +#: apps/treasury/views.py:96 msgid "Invoices list" msgstr "Liste des factures" -#: apps/treasury/views.py:109 apps/treasury/views.py:282 -#: apps/treasury/views.py:408 +#: apps/treasury/views.py:111 apps/treasury/views.py:285 +#: apps/treasury/views.py:411 msgid "You are not able to see the treasury interface." msgstr "Vous n'êtes pas autorisé à voir l'interface de trésorerie." -#: apps/treasury/views.py:119 +#: apps/treasury/views.py:121 msgid "Update an invoice" msgstr "Modifier la facture" -#: apps/treasury/views.py:243 +#: apps/treasury/views.py:246 msgid "Create a new remittance" msgstr "Créer une nouvelle remise" -#: apps/treasury/views.py:270 +#: apps/treasury/views.py:273 msgid "Remittances list" msgstr "Liste des remises" -#: apps/treasury/views.py:333 +#: apps/treasury/views.py:336 msgid "Update a remittance" msgstr "Modifier la remise" -#: apps/treasury/views.py:356 +#: apps/treasury/views.py:359 msgid "Attach a transaction to a remittance" msgstr "Joindre une transaction à une remise" -#: apps/treasury/views.py:400 +#: apps/treasury/views.py:403 msgid "List of credits from the Société générale" msgstr "Liste des crédits de la Société générale" -#: apps/treasury/views.py:440 +#: apps/treasury/views.py:443 msgid "Manage credits from the Société générale" msgstr "Gérer les crédits de la Société générale" @@ -2412,7 +2430,7 @@ msgstr "Sélectionnez les rôles qui vous intéressent." msgid "This team doesn't belong to the given bus." msgstr "Cette équipe n'appartient pas à ce bus." -#: apps/wei/forms/surveys/wei2020.py:29 +#: apps/wei/forms/surveys/wei2020.py:30 msgid "Choose a word:" msgstr "Choisissez un mot :" @@ -2591,11 +2609,11 @@ msgstr "Prix du WEI (étudiants)" msgid "WEI list" msgstr "Liste des WEI" -#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:506 +#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:508 msgid "Register 1A" msgstr "Inscrire un 1A" -#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:573 +#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:576 msgid "Register 2A+" msgstr "Inscrire un 2A+" @@ -2624,8 +2642,8 @@ msgstr "Télécharger au format PDF" #: apps/wei/templates/wei/survey.html:11 #: apps/wei/templates/wei/survey_closed.html:11 -#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:978 -#: apps/wei/views.py:1032 apps/wei/views.py:1042 +#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:984 +#: apps/wei/views.py:1039 apps/wei/views.py:1049 msgid "Survey WEI" msgstr "Questionnaire WEI" @@ -2666,7 +2684,7 @@ msgstr "Membres du WEI" msgid "Unvalidated registrations" msgstr "Inscriptions non validées" -#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:76 +#: apps/wei/templates/wei/weiclub_list.html:14 apps/wei/views.py:77 msgid "Create WEI" msgstr "Créer un WEI" @@ -2808,67 +2826,67 @@ msgstr "Il n'y a pas de pré-inscription en attente avec cette entrée." msgid "View validated memberships..." msgstr "Voir les adhésions validées ..." -#: apps/wei/views.py:55 +#: apps/wei/views.py:56 msgid "Search WEI" msgstr "Chercher un WEI" -#: apps/wei/views.py:105 +#: apps/wei/views.py:107 msgid "WEI Detail" msgstr "Détails du WEI" -#: apps/wei/views.py:200 +#: apps/wei/views.py:202 msgid "View members of the WEI" msgstr "Voir les membres du WEI" -#: apps/wei/views.py:228 +#: apps/wei/views.py:230 msgid "Find WEI Membership" msgstr "Trouver une adhésion au WEI" -#: apps/wei/views.py:238 +#: apps/wei/views.py:240 msgid "View registrations to the WEI" msgstr "Voir les inscriptions au WEI" -#: apps/wei/views.py:262 +#: apps/wei/views.py:264 msgid "Find WEI Registration" msgstr "Trouver une inscription au WEI" -#: apps/wei/views.py:273 +#: apps/wei/views.py:275 msgid "Update the WEI" msgstr "Modifier le WEI" -#: apps/wei/views.py:294 +#: apps/wei/views.py:296 msgid "Create new bus" msgstr "Ajouter un nouveau bus" -#: apps/wei/views.py:332 +#: apps/wei/views.py:334 msgid "Update bus" msgstr "Modifier le bus" -#: apps/wei/views.py:362 +#: apps/wei/views.py:364 msgid "Manage bus" msgstr "Gérer le bus" -#: apps/wei/views.py:389 +#: apps/wei/views.py:391 msgid "Create new team" msgstr "Créer une nouvelle équipe" -#: apps/wei/views.py:429 +#: apps/wei/views.py:431 msgid "Update team" msgstr "Modifier l'équipe" -#: apps/wei/views.py:460 +#: apps/wei/views.py:462 msgid "Manage WEI team" msgstr "Gérer l'équipe WEI" -#: apps/wei/views.py:482 +#: apps/wei/views.py:484 msgid "Register first year student to the WEI" msgstr "Inscrire un 1A au WEI" -#: apps/wei/views.py:527 apps/wei/views.py:607 +#: apps/wei/views.py:530 apps/wei/views.py:611 msgid "This user is already registered to this WEI." msgstr "Cette personne est déjà inscrite au WEI." -#: apps/wei/views.py:532 +#: apps/wei/views.py:535 msgid "" "This user can't be in her/his first year since he/she has already " "participated to a WEI." @@ -2876,31 +2894,31 @@ msgstr "" "Cet utilisateur ne peut pas être en première année puisqu'il a déjà " "participé à un WEI." -#: apps/wei/views.py:549 +#: apps/wei/views.py:552 msgid "Register old student to the WEI" msgstr "Inscrire un 2A+ au WEI" -#: apps/wei/views.py:592 apps/wei/views.py:680 +#: apps/wei/views.py:595 apps/wei/views.py:684 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:637 +#: apps/wei/views.py:641 msgid "Update WEI Registration" msgstr "Modifier l'inscription WEI" -#: apps/wei/views.py:739 +#: apps/wei/views.py:744 msgid "Delete WEI registration" msgstr "Supprimer l'inscription WEI" -#: apps/wei/views.py:750 +#: apps/wei/views.py:755 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:769 +#: apps/wei/views.py:774 msgid "Validate WEI registration" msgstr "Valider l'inscription WEI" -#: apps/wei/views.py:916 +#: apps/wei/views.py:922 msgid "This user didn't give her/his caution check." msgstr "Cet utilisateur n'a pas donné son chèque de caution." diff --git a/note.cron b/note.cron index 078856ea..44db347a 100644 --- a/note.cron +++ b/note.cron @@ -20,3 +20,5 @@ 55 6 * * * root cd /var/www/note_kfet && env/bin/python manage.py send_reports # Mettre à jour les boutons mis en avant 00 9 * * * root cd /var/www/note_kfet && env/bin/python manage.py refresh_highlighted_buttons +# Vider les tokens Oauth2 + 00 6 * * * root cd /var/www/note_kfet && env/bin/python manage.py cleartokens diff --git a/note_kfet/admin.py b/note_kfet/admin.py index f128b237..fa192b57 100644 --- a/note_kfet/admin.py +++ b/note_kfet/admin.py @@ -26,6 +26,14 @@ admin_site = StrongAdminSite() admin_site.register(Site, SiteAdmin) # Add external apps model +if "oauth2_provider" in settings.INSTALLED_APPS: + from oauth2_provider.admin import Application, ApplicationAdmin, Grant, \ + GrantAdmin, AccessToken, AccessTokenAdmin, RefreshToken, RefreshTokenAdmin + admin_site.register(Application, ApplicationAdmin) + admin_site.register(Grant, GrantAdmin) + admin_site.register(AccessToken, AccessTokenAdmin) + admin_site.register(RefreshToken, RefreshTokenAdmin) + if "django_htcpcp_tea" in settings.INSTALLED_APPS: from django_htcpcp_tea.admin import * from django_htcpcp_tea.models import * @@ -44,9 +52,3 @@ if "rest_framework" in settings.INSTALLED_APPS: from rest_framework.authtoken.admin import * from rest_framework.authtoken.models import * admin_site.register(Token, TokenAdmin) - -if "cas_server" in settings.INSTALLED_APPS: - from cas_server.admin import * - from cas_server.models import * - admin_site.register(ServicePattern, ServicePatternAdmin) - admin_site.register(FederatedIendityProvider, FederatedIendityProviderAdmin) diff --git a/note_kfet/fixtures/cas.json b/note_kfet/fixtures/cas.json deleted file mode 100644 index c3109d19..00000000 --- a/note_kfet/fixtures/cas.json +++ /dev/null @@ -1,11 +0,0 @@ -[ - { - "model": "cas_server.servicepattern", - "pk": 1, - "fields": { - "pos": 1, - "pattern": ".*", - "name": "REPLACEME" - } - } -] diff --git a/note_kfet/fixtures/initial.json b/note_kfet/fixtures/initial.json index 72e47234..5d54f3e5 100644 --- a/note_kfet/fixtures/initial.json +++ b/note_kfet/fixtures/initial.json @@ -3,7 +3,7 @@ "model": "sites.site", "pk": 1, "fields": { - "domain": "localhost", + "domain": "note.crans.org", "name": "La Note Kfet \ud83c\udf7b" } } diff --git a/note_kfet/settings/__init__.py b/note_kfet/settings/__init__.py index dcfa88a8..0c76b6f4 100644 --- a/note_kfet/settings/__init__.py +++ b/note_kfet/settings/__init__.py @@ -49,13 +49,6 @@ try: except ImportError: pass -if "cas_server" in INSTALLED_APPS: - # CAS Settings - CAS_AUTO_CREATE_USER = False - CAS_LOGO_URL = "/static/img/Saperlistpopette.png" - CAS_FAVICON_URL = "/static/favicon/favicon-32x32.png" - CAS_SHOW_POWERED = False - if "logs" in INSTALLED_APPS: MIDDLEWARE += ('note_kfet.middlewares.SessionMiddleware',) diff --git a/note_kfet/settings/base.py b/note_kfet/settings/base.py index 27010fef..f319b2db 100644 --- a/note_kfet/settings/base.py +++ b/note_kfet/settings/base.py @@ -35,8 +35,10 @@ INSTALLED_APPS = [ 'mailer', 'phonenumber_field', 'polymorphic', + 'oauth2_provider', # Django contrib + # Django Admin will autodiscover our apps for our custom admin site. 'django.contrib.admin', 'django.contrib.admindocs', 'django.contrib.auth', @@ -214,6 +216,16 @@ EMAIL_HOST_PASSWORD = os.getenv('EMAIL_PASSWORD', None) SERVER_EMAIL = os.getenv("NOTE_MAIL", "notekfet@example.com") DEFAULT_FROM_EMAIL = "NoteKfet2020 <" + SERVER_EMAIL + ">" +# Cache +# https://docs.djangoproject.com/en/2.2/topics/cache/#setting-up-the-cache +cache_address = os.getenv("CACHE_ADDRESS", "127.0.0.1:11211") +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', + 'LOCATION': cache_address, + } +} + # Django REST Framework REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ diff --git a/note_kfet/settings/development.py b/note_kfet/settings/development.py index 282ee478..e4fc8826 100644 --- a/note_kfet/settings/development.py +++ b/note_kfet/settings/development.py @@ -24,6 +24,14 @@ if os.getenv("DJANGO_DEV_STORE_METHOD", "sqlite") != "postgresql": } } +# Dummy cache for development +# https://docs.djangoproject.com/en/2.2/topics/cache/#setting-up-the-cache +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', + } +} + # Break it, fix it! DEBUG = True diff --git a/note_kfet/settings/secrets_example.py b/note_kfet/settings/secrets_example.py index b1f9e399..656e558b 100644 --- a/note_kfet/settings/secrets_example.py +++ b/note_kfet/settings/secrets_example.py @@ -3,7 +3,6 @@ # CAS OPTIONAL_APPS = [ -# 'cas_server', # 'debug_toolbar' ] diff --git a/note_kfet/templates/cas_server/base.html b/note_kfet/templates/cas_server/base.html deleted file mode 100644 index 4e93cee0..00000000 --- a/note_kfet/templates/cas_server/base.html +++ /dev/null @@ -1,99 +0,0 @@ -{% load i18n %}{% load static %}{% get_current_language as LANGUAGE_CODE %} - - - - - - {% block title %}{% trans "Central Authentication Service" %}{% endblock %} - - - - - {% if settings.CAS_FAVICON_URL %}{% endif %} - - - -
-
- {% if auto_submit %}{% endif %} -
-
-
- {% if auto_submit %}{% endif %} - {% block content %}{% endblock %} -
-
-
-
-
-
- {% if settings.CAS_SHOW_POWERED %} - - {% endif %} - - - - - {% block javascript %}{% endblock %} - - - diff --git a/note_kfet/urls.py b/note_kfet/urls.py index ae6bf3db..d9e51b63 100644 --- a/note_kfet/urls.py +++ b/note_kfet/urls.py @@ -40,12 +40,11 @@ urlpatterns = [ if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - -if "cas_server" in settings.INSTALLED_APPS: - urlpatterns += [ - # Include CAS Server routers - path('cas/', include('cas_server.urls', namespace="cas_server")), - ] +if "oauth2_provider" in settings.INSTALLED_APPS: + # OAuth2 provider + urlpatterns.append( + path('o/', include('oauth2_provider.urls', namespace='oauth2_provider')) + ) if "debug_toolbar" in settings.INSTALLED_APPS: import debug_toolbar diff --git a/requirements.txt b/requirements.txt index dccb8988..46ef2f63 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,17 +1,18 @@ beautifulsoup4~=4.7.1 Django~=2.2.15 django-bootstrap-datepicker-plus~=3.0.5 -django-cas-server>=1.2.0 django-colorfield~=0.3.2 django-crispy-forms~=1.7.2 django-extensions~=2.1.4 django-filter~=2.1.0 django-htcpcp-tea~=0.3.1 django-mailer~=2.0.1 +django-oauth-toolkit~=1.1.2 django-phonenumber-field~=5.0.0 django-polymorphic~=2.0.3 djangorestframework~=3.9.0 django-rest-polymorphic~=0.1.9 django-tables2~=2.3.1 +python-memcached~=1.59 phonenumbers~=8.9.10 Pillow>=5.4.1