mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 07:49:57 +01:00 
			
		
		
		
	Add PDF member lists
This commit is contained in:
		| @@ -273,6 +273,7 @@ class Membership(models.Model): | ||||
|     user = models.ForeignKey( | ||||
|         User, | ||||
|         on_delete=models.PROTECT, | ||||
|         related_name="memberships", | ||||
|         verbose_name=_("user"), | ||||
|     ) | ||||
|  | ||||
|   | ||||
| @@ -36,13 +36,15 @@ class PermissionBackend(ModelBackend): | ||||
|             # Unauthenticated users have no permissions | ||||
|             return Permission.objects.none() | ||||
|  | ||||
|         return Permission.objects.annotate(club=F("rolepermissions__role__membership__club")) \ | ||||
|             .filter( | ||||
|                 rolepermissions__role__membership__user=user, | ||||
|                 rolepermissions__role__membership__date_start__lte=datetime.date.today(), | ||||
|                 rolepermissions__role__membership__date_end__gte=datetime.date.today(), | ||||
|                 type=t, | ||||
|                 mask__rank__lte=get_current_session().get("permission_mask", 0), | ||||
|         return Permission.objects.annotate( | ||||
|             club=F("rolepermissions__role__membership__club"), | ||||
|             membership=F("rolepermissions__role__membership"), | ||||
|         ).filter( | ||||
|             rolepermissions__role__membership__user=user, | ||||
|             rolepermissions__role__membership__date_start__lte=datetime.date.today(), | ||||
|             rolepermissions__role__membership__date_end__gte=datetime.date.today(), | ||||
|             type=t, | ||||
|             mask__rank__lte=get_current_session().get("permission_mask", 0), | ||||
|         ).distinct() | ||||
|  | ||||
|     @staticmethod | ||||
| @@ -55,6 +57,7 @@ class PermissionBackend(ModelBackend): | ||||
|         :return: A generator of the requested permissions | ||||
|         """ | ||||
|         clubs = {} | ||||
|         memberships = {} | ||||
|  | ||||
|         for permission in PermissionBackend.get_raw_permissions(user, type): | ||||
|             if not isinstance(model.model_class()(), permission.model.model_class()) or not permission.club: | ||||
| @@ -64,9 +67,16 @@ class PermissionBackend(ModelBackend): | ||||
|                 clubs[permission.club] = club = Club.objects.get(pk=permission.club) | ||||
|             else: | ||||
|                 club = clubs[permission.club] | ||||
|  | ||||
|             if permission.membership not in memberships: | ||||
|                 memberships[permission.membership] = membership = Membership.objects.get(pk=permission.membership) | ||||
|             else: | ||||
|                 membership = memberships[permission.membership] | ||||
|  | ||||
|             permission = permission.about( | ||||
|                 user=user, | ||||
|                 club=club, | ||||
|                 membership=membership, | ||||
|                 User=User, | ||||
|                 Club=Club, | ||||
|                 Membership=Membership, | ||||
|   | ||||
| @@ -1470,7 +1470,7 @@ | ||||
| 				"wei", | ||||
| 				"weiregistration" | ||||
| 			], | ||||
| 			"query": "{\"user\": [\"user\"], \"wei\": [\"club\"], \"wei__membership_start__lte\": [\"today\"], \"wei__year\": [\"today\", \"year\"]}", | ||||
| 			"query": "{\"user\": [\"user\"], \"wei\": [\"club\"], \"wei__membership_start__lte\": [\"today\"]}", | ||||
| 			"type": "view", | ||||
| 			"mask": 1, | ||||
| 			"field": "", | ||||
| @@ -1882,6 +1882,36 @@ | ||||
| 			"description": "View my own WEI membership if I am an old member or if the WEI is past" | ||||
| 		} | ||||
| 	}, | ||||
| 	{ | ||||
| 		"model": "permission.permission", | ||||
| 		"pk": 115, | ||||
| 		"fields": { | ||||
| 			"model": [ | ||||
| 				"wei", | ||||
| 				"weimembership" | ||||
| 			], | ||||
| 			"query": "{\"wei\": [\"club\"], \"bus\": [\"membership\", \"weimembership\", \"bus\"]}", | ||||
| 			"type": "view", | ||||
| 			"mask": 1, | ||||
| 			"field": "", | ||||
| 			"description": "View the members of the bus" | ||||
| 		} | ||||
| 	}, | ||||
| 	{ | ||||
| 		"model": "permission.permission", | ||||
| 		"pk": 116, | ||||
| 		"fields": { | ||||
| 			"model": [ | ||||
| 				"wei", | ||||
| 				"weimembership" | ||||
| 			], | ||||
| 			"query": "{\"wei\": [\"club\"], \"team\": [\"membership\", \"weimembership\", \"team\"]}", | ||||
| 			"type": "view", | ||||
| 			"mask": 1, | ||||
| 			"field": "", | ||||
| 			"description": "View the members of the team" | ||||
| 		} | ||||
| 	}, | ||||
| 	{ | ||||
| 		"model": "permission.rolepermissions", | ||||
| 		"pk": 1, | ||||
| @@ -2230,5 +2260,25 @@ | ||||
| 				113 | ||||
| 			] | ||||
| 		} | ||||
| 	}, | ||||
| 	{ | ||||
| 		"model": "permission.rolepermissions", | ||||
| 		"pk": 13, | ||||
| 		"fields": { | ||||
| 			"role": 13, | ||||
| 			"permissions": [ | ||||
| 				115 | ||||
| 			] | ||||
| 		} | ||||
| 	}, | ||||
| 	{ | ||||
| 		"model": "permission.rolepermissions", | ||||
| 		"pk": 14, | ||||
| 		"fields": { | ||||
| 			"role": 14, | ||||
| 			"permissions": [ | ||||
| 				116 | ||||
| 			] | ||||
| 		} | ||||
| 	} | ||||
| ] | ||||
| @@ -38,6 +38,7 @@ class UserCreateView(CreateView): | ||||
|     def get_context_data(self, **kwargs): | ||||
|         context = super().get_context_data(**kwargs) | ||||
|         context["profile_form"] = self.second_form() | ||||
|         del context["profile_form"].fields["section"] | ||||
|  | ||||
|         return context | ||||
|  | ||||
|   | ||||
| @@ -182,7 +182,7 @@ class InvoiceRenderView(LoginRequiredMixin, View): | ||||
|             # Display the generated pdf as a HTTP Response | ||||
|             pdf = open("{}/invoice-{}.pdf".format(tmp_dir, pk), 'rb').read() | ||||
|             response = HttpResponse(pdf, content_type="application/pdf") | ||||
|             response['Content-Disposition'] = "inline;filename=invoice-{:d}.pdf".format(pk) | ||||
|             response['Content-Disposition'] = "inline;filename=Facture%20n°{:d}.pdf".format(pk) | ||||
|         except IOError as e: | ||||
|             raise e | ||||
|         finally: | ||||
|   | ||||
| @@ -265,6 +265,7 @@ class WEIMembership(Membership): | ||||
|     bus = models.ForeignKey( | ||||
|         Bus, | ||||
|         on_delete=models.PROTECT, | ||||
|         related_name="memberships", | ||||
|         null=True, | ||||
|         default=None, | ||||
|         verbose_name=_("bus"), | ||||
|   | ||||
| @@ -91,6 +91,11 @@ class WEIMembershipTable(tables.Table): | ||||
|         args=[A('registration.pk')], | ||||
|     ) | ||||
|  | ||||
|     year = tables.Column( | ||||
|         accessor=A("pk"), | ||||
|         verbose_name=_("Year"), | ||||
|     ) | ||||
|  | ||||
|     bus = tables.LinkColumn( | ||||
|         'wei:manage_bus', | ||||
|         args=[A('bus.pk')], | ||||
| @@ -101,13 +106,17 @@ class WEIMembershipTable(tables.Table): | ||||
|         args=[A('bus.pk')], | ||||
|     ) | ||||
|  | ||||
|     def render_year(self, record): | ||||
|         return str(record.user.profile.ens_year) + "A" | ||||
|  | ||||
|     class Meta: | ||||
|         attrs = { | ||||
|             'class': 'table table-condensed table-striped table-hover' | ||||
|         } | ||||
|         model = WEIMembership | ||||
|         template_name = 'django_tables2/bootstrap4.html' | ||||
|         fields = ('user', 'user.first_name', 'user.last_name', 'bus', 'team', ) | ||||
|         fields = ('user', 'user.last_name', 'user.first_name', 'registration.gender', 'user.profile.department', | ||||
|                   'year', 'bus', 'team', ) | ||||
|         row_attrs = { | ||||
|             'class': 'table-row', | ||||
|             'id': lambda record: "row-" + str(record.pk), | ||||
| @@ -130,9 +139,16 @@ class BusTable(tables.Table): | ||||
|         } | ||||
|     ) | ||||
|  | ||||
|     count = tables.Column( | ||||
|         verbose_name=_("Members count"), | ||||
|     ) | ||||
|  | ||||
|     def render_teams(self, value): | ||||
|         return ", ".join(team.name for team in value.all()) | ||||
|  | ||||
|     def render_count(self, value): | ||||
|         return str(value) + " " + (str(_("members")) if value > 0 else str(_("member"))) | ||||
|  | ||||
|     class Meta: | ||||
|         attrs = { | ||||
|             'class': 'table table-condensed table-striped table-hover' | ||||
| @@ -161,6 +177,13 @@ class BusTeamTable(tables.Table): | ||||
|         } | ||||
|     ) | ||||
|  | ||||
|     def render_count(self, value): | ||||
|         return str(value) + " " + (str(_("members")) if value > 0 else str(_("member"))) | ||||
|  | ||||
|     count = tables.Column( | ||||
|         verbose_name=_("Members count"), | ||||
|     ) | ||||
|  | ||||
|     def render_color(self, value): | ||||
|         return "#{:06X}".format(value) | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
| from django.urls import path | ||||
|  | ||||
| from .views import CurrentWEIDetailView, WEIListView, WEICreateView, WEIDetailView, WEIUpdateView,\ | ||||
|     WEIRegistrationsView, WEIMembershipsView,\ | ||||
|     WEIRegistrationsView, WEIMembershipsView, MemberListRenderView,\ | ||||
|     BusCreateView, BusManageView, BusUpdateView, BusTeamCreateView, BusTeamManageView, BusTeamUpdateView,\ | ||||
|     WEIRegister1AView, WEIRegister2AView, WEIUpdateRegistrationView, WEIDeleteRegistrationView,\ | ||||
|     WEIValidateRegistrationView, WEISurveyView, WEISurveyEndView, WEIClosedView | ||||
| @@ -19,6 +19,11 @@ urlpatterns = [ | ||||
|     path('update/<int:pk>/', WEIUpdateView.as_view(), name="wei_update"), | ||||
|     path('detail/<int:pk>/registrations/', WEIRegistrationsView.as_view(), name="wei_registrations"), | ||||
|     path('detail/<int:pk>/memberships/', WEIMembershipsView.as_view(), name="wei_memberships"), | ||||
|     path('detail/<int:wei_pk>/memberships/pdf/', MemberListRenderView.as_view(), name="wei_memberships_pdf"), | ||||
|     path('detail/<int:wei_pk>/memberships/pdf/<int:bus_pk>/', MemberListRenderView.as_view(), | ||||
|          name="wei_memberships_bus_pdf"), | ||||
|     path('detail/<int:wei_pk>/memberships/pdf/<int:bus_pk>/<int:team_pk>/', MemberListRenderView.as_view(), | ||||
|          name="wei_memberships_team_pdf"), | ||||
|     path('add-bus/<int:pk>/', BusCreateView.as_view(), name="add_bus"), | ||||
|     path('manage-bus/<int:pk>/', BusManageView.as_view(), name="manage_bus"), | ||||
|     path('update-bus/<int:pk>/', BusUpdateView.as_view(), name="update_bus"), | ||||
|   | ||||
| @@ -1,15 +1,23 @@ | ||||
| # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| import os | ||||
| import shutil | ||||
| import subprocess | ||||
| from datetime import datetime, date | ||||
| from tempfile import mkdtemp | ||||
|  | ||||
| from django.contrib.auth.mixins import LoginRequiredMixin | ||||
| from django.contrib.auth.models import User | ||||
| from django.core.exceptions import PermissionDenied | ||||
| from django.db.models import Q | ||||
| from django.db.models import Q, Count | ||||
| from django.db.models.functions import Lower | ||||
| from django.forms import HiddenInput | ||||
| from django.http import HttpResponse | ||||
| from django.shortcuts import redirect | ||||
| from django.template.loader import render_to_string | ||||
| from django.urls import reverse_lazy | ||||
| from django.views import View | ||||
| from django.views.generic import DetailView, UpdateView, CreateView, RedirectView, TemplateView | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
| from django.views.generic.edit import BaseFormView, DeleteView | ||||
| @@ -17,6 +25,7 @@ from django_tables2 import SingleTableView | ||||
| from member.models import Membership, Club | ||||
| from note.models import Transaction, NoteClub, Alias | ||||
| from note.tables import HistoryTable | ||||
| from note_kfet.settings import BASE_DIR | ||||
| from permission.backends import PermissionBackend | ||||
| from permission.views import ProtectQuerysetMixin | ||||
|  | ||||
| @@ -108,7 +117,7 @@ class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | ||||
|         context["my_registration"] = my_registration | ||||
|  | ||||
|         buses = Bus.objects.filter(PermissionBackend.filter_queryset(self.request.user, Bus, "view"))\ | ||||
|             .filter(wei=self.object) | ||||
|             .filter(wei=self.object).annotate(count=Count("memberships")) | ||||
|         bus_table = BusTable(data=buses, prefix="bus-") | ||||
|         context['buses'] = bus_table | ||||
|  | ||||
| @@ -299,7 +308,7 @@ class BusManageView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | ||||
|  | ||||
|         bus = self.object | ||||
|         teams = BusTeam.objects.filter(PermissionBackend.filter_queryset(self.request.user, BusTeam, "view"))\ | ||||
|             .filter(bus=bus) | ||||
|             .filter(bus=bus).annotate(count=Count("memberships")) | ||||
|         teams_table = BusTeamTable(data=teams, prefix="team-") | ||||
|         context["teams"] = teams_table | ||||
|  | ||||
| @@ -824,3 +833,80 @@ class WEIClosedView(LoginRequiredMixin, TemplateView): | ||||
|         context["club"] = WEIClub.objects.get(pk=self.kwargs["pk"]) | ||||
|         context["title"] = _("Survey WEI") | ||||
|         return context | ||||
|  | ||||
|  | ||||
| class MemberListRenderView(LoginRequiredMixin, View): | ||||
|     """ | ||||
|     Render Invoice as a generated PDF with the given information and a LaTeX template | ||||
|     """ | ||||
|  | ||||
|     def get_queryset(self, **kwargs): | ||||
|         qs = WEIMembership.objects.filter(PermissionBackend.filter_queryset(self.request.user, WEIMembership, "view")) | ||||
|         qs = qs.filter(club__pk=self.kwargs["wei_pk"]).order_by( | ||||
|             Lower('bus__name'), | ||||
|             Lower('team__name'), | ||||
|             'roles', | ||||
|             Lower('user__last_name'), | ||||
|             Lower('user__first_name'), | ||||
|         ).distinct() | ||||
|  | ||||
|         if "bus_pk" in self.kwargs: | ||||
|             qs = qs.filter(bus__pk=self.kwargs["bus_pk"]) | ||||
|  | ||||
|         if "team_pk" in self.kwargs: | ||||
|             qs = qs.filter(team__pk=self.kwargs["team_pk"] if self.kwargs["team_pk"] else None) | ||||
|  | ||||
|         return qs | ||||
|  | ||||
|     def get(self, request, **kwargs): | ||||
|         qs = self.get_queryset() | ||||
|  | ||||
|         wei = WEIClub.objects.get(pk=self.kwargs["wei_pk"]) | ||||
|         bus = team = None | ||||
|         if "bus_pk" in self.kwargs: | ||||
|             bus = Bus.objects.get(pk=self.kwargs["bus_pk"]) | ||||
|         if "team_pk" in self.kwargs: | ||||
|             team = BusTeam.objects.filter(pk=self.kwargs["team_pk"] if self.kwargs["team_pk"] else None) | ||||
|             if team.exists(): | ||||
|                 team = team.get() | ||||
|                 bus = team.bus | ||||
|             else: | ||||
|                 team = dict(name="Staff") | ||||
|  | ||||
|         # Fill the template with the information | ||||
|         tex = render_to_string("wei/weilist_sample.tex", dict(memberships=qs.all(), wei=wei, bus=bus, team=team)) | ||||
|  | ||||
|         try: | ||||
|             os.mkdir(BASE_DIR + "/tmp") | ||||
|         except FileExistsError: | ||||
|             pass | ||||
|         # We render the file in a temporary directory | ||||
|         tmp_dir = mkdtemp(prefix=BASE_DIR + "/tmp/") | ||||
|  | ||||
|         try: | ||||
|             with open("{}/wei-list.tex".format(tmp_dir), "wb") as f: | ||||
|                 f.write(tex.encode("UTF-8")) | ||||
|             del tex | ||||
|  | ||||
|             error = subprocess.Popen( | ||||
|                 ["pdflatex", "{}/wei-list.tex".format(tmp_dir)], | ||||
|                 cwd=tmp_dir, | ||||
|                 stdin=open(os.devnull, "r"), | ||||
|                 stderr=open(os.devnull, "wb"), | ||||
|                 stdout=open(os.devnull, "wb"), | ||||
|             ).wait() | ||||
|  | ||||
|             if error: | ||||
|                 raise IOError("An error attempted while generating a WEI list (code=" + str(error) + ")") | ||||
|  | ||||
|             # Display the generated pdf as a HTTP Response | ||||
|             pdf = open("{}/wei-list.pdf".format(tmp_dir), 'rb').read() | ||||
|             response = HttpResponse(pdf, content_type="application/pdf") | ||||
|             response['Content-Disposition'] = "inline;filename=Liste%20des%20participants%20au%20WEI.pdf" | ||||
|         except IOError as e: | ||||
|             raise e | ||||
|         finally: | ||||
|             # Delete all temporary files | ||||
|             shutil.rmtree(tmp_dir) | ||||
|  | ||||
|         return response | ||||
|   | ||||
| @@ -8,7 +8,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: PACKAGE VERSION\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2020-04-22 17:25+0200\n" | ||||
| "POT-Creation-Date: 2020-04-23 18:21+0200\n" | ||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
| @@ -44,7 +44,7 @@ msgid "You can't invite more than 3 people to this activity." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:23 apps/activity/models.py:48 | ||||
| #: apps/member/models.py:152 apps/member/models.py:256 | ||||
| #: apps/member/models.py:151 apps/member/models.py:255 | ||||
| #: apps/note/models/notes.py:188 apps/note/models/transactions.py:25 | ||||
| #: apps/note/models/transactions.py:45 apps/note/models/transactions.py:250 | ||||
| #: apps/wei/models.py:62 templates/member/club_info.html:13 | ||||
| @@ -308,192 +308,192 @@ msgstr "" | ||||
| msgid "Bank" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:35 | ||||
| #: apps/member/models.py:34 | ||||
| #: templates/registration/future_profile_detail.html:47 | ||||
| #: templates/wei/weimembership_form.html:48 | ||||
| msgid "phone number" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:42 templates/member/profile_info.html:27 | ||||
| #: apps/member/models.py:41 templates/member/profile_info.html:27 | ||||
| #: templates/registration/future_profile_detail.html:41 | ||||
| #: templates/wei/weimembership_form.html:42 | ||||
| msgid "section" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:43 | ||||
| #: apps/member/models.py:42 | ||||
| msgid "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\"" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:51 templates/wei/weimembership_form.html:36 | ||||
| #: apps/member/models.py:50 templates/wei/weimembership_form.html:36 | ||||
| msgid "department" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:53 | ||||
| #: apps/member/models.py:52 | ||||
| msgid "Informatics (A0)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:54 | ||||
| #: apps/member/models.py:53 | ||||
| msgid "Mathematics (A1)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:55 | ||||
| #: apps/member/models.py:54 | ||||
| msgid "Physics (A2)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:56 | ||||
| #: apps/member/models.py:55 | ||||
| msgid "Applied physics (A'2)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:57 | ||||
| #: apps/member/models.py:56 | ||||
| msgid "Chemistry (A''2)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:58 | ||||
| #: apps/member/models.py:57 | ||||
| msgid "Biology (A3)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:59 | ||||
| #: apps/member/models.py:58 | ||||
| msgid "SAPHIRE (B1234)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:60 | ||||
| #: apps/member/models.py:59 | ||||
| msgid "Mechanics (B1)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:61 | ||||
| #: apps/member/models.py:60 | ||||
| msgid "Civil engineering (B2)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:62 | ||||
| #: apps/member/models.py:61 | ||||
| msgid "Mechanical engineering (B3)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:63 | ||||
| #: apps/member/models.py:62 | ||||
| msgid "EEA (B4)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:64 | ||||
| #: apps/member/models.py:63 | ||||
| msgid "Design (C)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:65 | ||||
| #: apps/member/models.py:64 | ||||
| msgid "Economy-management (D2)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:66 | ||||
| #: apps/member/models.py:65 | ||||
| msgid "Social sciences (D3)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:67 | ||||
| #: apps/member/models.py:66 | ||||
| msgid "English (E)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:68 | ||||
| #: apps/member/models.py:67 | ||||
| msgid "External (EXT)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:75 | ||||
| #: apps/member/models.py:74 | ||||
| msgid "promotion" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:76 | ||||
| #: apps/member/models.py:75 | ||||
| msgid "Year of entry to the school (None if not ENS student)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:80 templates/member/profile_info.html:30 | ||||
| #: apps/member/models.py:79 templates/member/profile_info.html:30 | ||||
| #: templates/registration/future_profile_detail.html:44 | ||||
| #: templates/wei/weimembership_form.html:45 | ||||
| msgid "address" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:87 | ||||
| #: apps/member/models.py:86 | ||||
| #: templates/registration/future_profile_detail.html:50 | ||||
| #: templates/wei/weimembership_form.html:51 | ||||
| msgid "paid" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:88 | ||||
| #: apps/member/models.py:87 | ||||
| msgid "Tells if the user receive a salary." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:93 | ||||
| #: apps/member/models.py:92 | ||||
| msgid "email confirmed" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:98 | ||||
| #: apps/member/models.py:97 | ||||
| msgid "registration valid" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:127 apps/member/models.py:128 | ||||
| #: apps/member/models.py:126 apps/member/models.py:127 | ||||
| msgid "user profile" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:157 templates/member/club_info.html:57 | ||||
| #: apps/member/models.py:156 templates/member/club_info.html:57 | ||||
| #: templates/registration/future_profile_detail.html:22 | ||||
| #: templates/wei/weiclub_info.html:52 templates/wei/weimembership_form.html:24 | ||||
| msgid "email" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:164 | ||||
| #: apps/member/models.py:163 | ||||
| msgid "parent club" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:173 | ||||
| #: apps/member/models.py:172 | ||||
| msgid "require memberships" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:174 | ||||
| #: apps/member/models.py:173 | ||||
| msgid "Uncheck if this club don't require memberships." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:179 templates/member/club_info.html:41 | ||||
| #: apps/member/models.py:178 templates/member/club_info.html:41 | ||||
| msgid "membership fee (paid students)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:184 templates/member/club_info.html:44 | ||||
| #: apps/member/models.py:183 templates/member/club_info.html:44 | ||||
| msgid "membership fee (unpaid students)" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:190 templates/member/club_info.html:33 | ||||
| #: apps/member/models.py:189 templates/member/club_info.html:33 | ||||
| msgid "membership duration" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:191 | ||||
| #: apps/member/models.py:190 | ||||
| msgid "The longest time (in days) a membership can last (NULL = infinite)." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:198 templates/member/club_info.html:23 | ||||
| #: apps/member/models.py:197 templates/member/club_info.html:23 | ||||
| msgid "membership start" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:199 | ||||
| #: apps/member/models.py:198 | ||||
| msgid "How long after January 1st the members can renew their membership." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:206 templates/member/club_info.html:28 | ||||
| #: apps/member/models.py:205 templates/member/club_info.html:28 | ||||
| msgid "membership end" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:207 | ||||
| #: apps/member/models.py:206 | ||||
| msgid "" | ||||
| "How long the membership can last after January 1st of the next year after " | ||||
| "members can renew their membership." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:241 apps/member/models.py:283 | ||||
| #: apps/member/models.py:240 apps/member/models.py:283 | ||||
| #: apps/note/models/notes.py:139 | ||||
| msgid "club" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:242 | ||||
| #: apps/member/models.py:241 | ||||
| msgid "clubs" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:262 apps/permission/models.py:312 | ||||
| #: apps/member/models.py:261 apps/permission/models.py:312 | ||||
| msgid "role" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:263 apps/member/models.py:288 | ||||
| #: apps/member/models.py:262 apps/member/models.py:288 | ||||
| msgid "roles" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -509,7 +509,7 @@ msgstr "" | ||||
| msgid "fee" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:320 apps/member/views.py:505 apps/wei/views.py:731 | ||||
| #: apps/member/models.py:320 apps/member/views.py:505 apps/wei/views.py:738 | ||||
| msgid "User is not a member of the parent club" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -552,7 +552,7 @@ msgstr "" | ||||
| msgid "Search user" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/views.py:500 apps/wei/views.py:722 | ||||
| #: apps/member/views.py:500 apps/wei/views.py:729 | ||||
| msgid "" | ||||
| "This user don't have enough money to join this club, and can't have a " | ||||
| "negative balance." | ||||
| @@ -567,8 +567,8 @@ msgid "The membership must begin before {:%m-%d-%Y}." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/member/views.py:540 apps/member/views.py:542 apps/member/views.py:544 | ||||
| #: apps/registration/views.py:288 apps/registration/views.py:290 | ||||
| #: apps/registration/views.py:292 | ||||
| #: apps/registration/views.py:289 apps/registration/views.py:291 | ||||
| #: apps/registration/views.py:293 | ||||
| msgid "This field is required." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -890,31 +890,31 @@ msgstr "" | ||||
| msgid "Join Kfet Club" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/registration/views.py:77 | ||||
| #: apps/registration/views.py:78 | ||||
| msgid "Email validation" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/registration/views.py:123 | ||||
| #: apps/registration/views.py:124 | ||||
| msgid "Email validation unsuccessful" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/registration/views.py:134 | ||||
| #: apps/registration/views.py:135 | ||||
| msgid "Email validation email sent" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/registration/views.py:187 | ||||
| #: apps/registration/views.py:188 | ||||
| msgid "Unregistered users" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/registration/views.py:254 | ||||
| #: apps/registration/views.py:255 | ||||
| msgid "You must join the BDE." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/registration/views.py:276 | ||||
| #: apps/registration/views.py:277 | ||||
| msgid "You must join BDE club before joining Kfet club." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/registration/views.py:281 | ||||
| #: apps/registration/views.py:282 | ||||
| msgid "" | ||||
| "The entered amount is not enough for the memberships, should be at least {}" | ||||
| msgstr "" | ||||
| @@ -1121,7 +1121,7 @@ msgid "WEI" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/forms/registration.py:47 apps/wei/models.py:109 | ||||
| #: apps/wei/models.py:270 | ||||
| #: apps/wei/models.py:271 | ||||
| msgid "bus" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -1154,10 +1154,6 @@ msgstr "" | ||||
| msgid "This team doesn't belong to the given bus." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/management/commands/wei_algorithm.py:11 | ||||
| msgid "Attribute to each first year member a bus for the WEI" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/models.py:20 templates/wei/weiclub_info.html:23 | ||||
| msgid "year" | ||||
| msgstr "" | ||||
| @@ -1290,19 +1286,19 @@ msgstr "" | ||||
| msgid "WEI Users" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/models.py:280 | ||||
| #: apps/wei/models.py:281 | ||||
| msgid "team" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/models.py:290 | ||||
| #: apps/wei/models.py:291 | ||||
| msgid "WEI registration" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/models.py:294 | ||||
| #: apps/wei/models.py:295 | ||||
| msgid "WEI membership" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/models.py:295 | ||||
| #: apps/wei/models.py:296 | ||||
| msgid "WEI memberships" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -1311,46 +1307,58 @@ msgstr "" | ||||
| msgid "Validate" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/tables.py:125 templates/wei/bus_tables.html:26 | ||||
| #: apps/wei/tables.py:96 | ||||
| msgid "Year" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/tables.py:134 templates/wei/bus_tables.html:26 | ||||
| #: templates/wei/busteam_tables.html:43 | ||||
| msgid "Teams" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/views.py:170 | ||||
| #: apps/wei/tables.py:143 apps/wei/tables.py:185 | ||||
| msgid "Members count" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/tables.py:150 apps/wei/tables.py:151 apps/wei/tables.py:182 | ||||
| msgid "members" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/views.py:177 | ||||
| msgid "Find WEI Membership" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/views.py:205 | ||||
| #: apps/wei/views.py:212 | ||||
| msgid "Find WEI Registration" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/views.py:414 templates/wei/weiclub_info.html:62 | ||||
| #: apps/wei/views.py:421 templates/wei/weiclub_info.html:62 | ||||
| msgid "Register 1A" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/views.py:435 apps/wei/views.py:503 | ||||
| #: apps/wei/views.py:442 apps/wei/views.py:510 | ||||
| msgid "This user is already registered to this WEI." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/views.py:440 | ||||
| #: apps/wei/views.py:447 | ||||
| msgid "" | ||||
| "This user can't be in her/his first year since he/she has already participed " | ||||
| "to a WEI." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/views.py:468 templates/wei/weiclub_info.html:63 | ||||
| #: apps/wei/views.py:475 templates/wei/weiclub_info.html:63 | ||||
| msgid "Register 2A+" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/views.py:486 apps/wei/views.py:569 | ||||
| #: apps/wei/views.py:493 apps/wei/views.py:576 | ||||
| msgid "You already opened an account in the Société générale." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/views.py:726 | ||||
| #: apps/wei/views.py:733 | ||||
| msgid "This user didn't give her/his caution check." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/views.py:795 apps/wei/views.py:815 apps/wei/views.py:825 | ||||
| #: apps/wei/views.py:802 apps/wei/views.py:822 apps/wei/views.py:832 | ||||
| #: templates/wei/survey.html:12 templates/wei/survey_closed.html:12 | ||||
| #: templates/wei/survey_end.html:12 | ||||
| msgid "Survey WEI" | ||||
| @@ -2010,6 +2018,11 @@ msgstr "" | ||||
| msgid "Members" | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/wei/bus_tables.html:48 templates/wei/busteam_tables.html:52 | ||||
| #: templates/wei/weimembership_list.html:30 | ||||
| msgid "View as PDF" | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/wei/survey.html:24 | ||||
| msgid "Next" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -3,7 +3,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: PACKAGE VERSION\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2020-04-22 17:25+0200\n" | ||||
| "POT-Creation-Date: 2020-04-23 18:21+0200\n" | ||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
| @@ -40,7 +40,7 @@ msgid "You can't invite more than 3 people to this activity." | ||||
| msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité." | ||||
|  | ||||
| #: apps/activity/models.py:23 apps/activity/models.py:48 | ||||
| #: apps/member/models.py:152 apps/member/models.py:256 | ||||
| #: apps/member/models.py:151 apps/member/models.py:255 | ||||
| #: apps/note/models/notes.py:188 apps/note/models/transactions.py:25 | ||||
| #: apps/note/models/transactions.py:45 apps/note/models/transactions.py:250 | ||||
| #: apps/wei/models.py:62 templates/member/club_info.html:13 | ||||
| @@ -304,175 +304,175 @@ msgstr "Montant à créditer" | ||||
| msgid "Bank" | ||||
| msgstr "Banque" | ||||
|  | ||||
| #: apps/member/models.py:35 | ||||
| #: apps/member/models.py:34 | ||||
| #: templates/registration/future_profile_detail.html:47 | ||||
| #: templates/wei/weimembership_form.html:48 | ||||
| msgid "phone number" | ||||
| msgstr "numéro de téléphone" | ||||
|  | ||||
| #: apps/member/models.py:42 templates/member/profile_info.html:27 | ||||
| #: apps/member/models.py:41 templates/member/profile_info.html:27 | ||||
| #: templates/registration/future_profile_detail.html:41 | ||||
| #: templates/wei/weimembership_form.html:42 | ||||
| msgid "section" | ||||
| msgstr "section" | ||||
|  | ||||
| #: apps/member/models.py:43 | ||||
| #: apps/member/models.py:42 | ||||
| msgid "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\"" | ||||
| msgstr "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\"" | ||||
|  | ||||
| #: apps/member/models.py:51 templates/wei/weimembership_form.html:36 | ||||
| #: apps/member/models.py:50 templates/wei/weimembership_form.html:36 | ||||
| msgid "department" | ||||
| msgstr "département" | ||||
|  | ||||
| #: apps/member/models.py:53 | ||||
| #: apps/member/models.py:52 | ||||
| msgid "Informatics (A0)" | ||||
| msgstr "Informatique (A0)" | ||||
|  | ||||
| #: apps/member/models.py:54 | ||||
| #: apps/member/models.py:53 | ||||
| msgid "Mathematics (A1)" | ||||
| msgstr "Mathématiques (A1)" | ||||
|  | ||||
| #: apps/member/models.py:55 | ||||
| #: apps/member/models.py:54 | ||||
| msgid "Physics (A2)" | ||||
| msgstr "Physique (A2)" | ||||
|  | ||||
| #: apps/member/models.py:56 | ||||
| #: apps/member/models.py:55 | ||||
| msgid "Applied physics (A'2)" | ||||
| msgstr "Physique appliquée (A'2)" | ||||
|  | ||||
| #: apps/member/models.py:57 | ||||
| #: apps/member/models.py:56 | ||||
| msgid "Chemistry (A''2)" | ||||
| msgstr "Chimie (A''2)" | ||||
|  | ||||
| #: apps/member/models.py:58 | ||||
| #: apps/member/models.py:57 | ||||
| msgid "Biology (A3)" | ||||
| msgstr "Biologie (A3)" | ||||
|  | ||||
| #: apps/member/models.py:59 | ||||
| #: apps/member/models.py:58 | ||||
| msgid "SAPHIRE (B1234)" | ||||
| msgstr "SAPHIRE (B1234)" | ||||
|  | ||||
| #: apps/member/models.py:60 | ||||
| #: apps/member/models.py:59 | ||||
| msgid "Mechanics (B1)" | ||||
| msgstr "Mécanique (B1)" | ||||
|  | ||||
| #: apps/member/models.py:61 | ||||
| #: apps/member/models.py:60 | ||||
| msgid "Civil engineering (B2)" | ||||
| msgstr "Génie civil (B2)" | ||||
|  | ||||
| #: apps/member/models.py:62 | ||||
| #: apps/member/models.py:61 | ||||
| msgid "Mechanical engineering (B3)" | ||||
| msgstr "Génie mécanique (B3)" | ||||
|  | ||||
| #: apps/member/models.py:63 | ||||
| #: apps/member/models.py:62 | ||||
| msgid "EEA (B4)" | ||||
| msgstr "EEA (B4)" | ||||
|  | ||||
| #: apps/member/models.py:64 | ||||
| #: apps/member/models.py:63 | ||||
| msgid "Design (C)" | ||||
| msgstr "Design (C)" | ||||
|  | ||||
| #: apps/member/models.py:65 | ||||
| #: apps/member/models.py:64 | ||||
| msgid "Economy-management (D2)" | ||||
| msgstr "Économie-gestion (D2)" | ||||
|  | ||||
| #: apps/member/models.py:66 | ||||
| #: apps/member/models.py:65 | ||||
| msgid "Social sciences (D3)" | ||||
| msgstr "Sciences sociales (D3)" | ||||
|  | ||||
| #: apps/member/models.py:67 | ||||
| #: apps/member/models.py:66 | ||||
| msgid "English (E)" | ||||
| msgstr "Anglais (E)" | ||||
|  | ||||
| #: apps/member/models.py:68 | ||||
| #: apps/member/models.py:67 | ||||
| msgid "External (EXT)" | ||||
| msgstr "Externe (EXT)" | ||||
|  | ||||
| #: apps/member/models.py:75 | ||||
| #: apps/member/models.py:74 | ||||
| msgid "promotion" | ||||
| msgstr "promotion" | ||||
|  | ||||
| #: apps/member/models.py:76 | ||||
| #: apps/member/models.py:75 | ||||
| msgid "Year of entry to the school (None if not ENS student)" | ||||
| msgstr "Année d'entrée dans l'école (None si non-étudiant·e de l'ENS)" | ||||
|  | ||||
| #: apps/member/models.py:80 templates/member/profile_info.html:30 | ||||
| #: apps/member/models.py:79 templates/member/profile_info.html:30 | ||||
| #: templates/registration/future_profile_detail.html:44 | ||||
| #: templates/wei/weimembership_form.html:45 | ||||
| msgid "address" | ||||
| msgstr "adresse" | ||||
|  | ||||
| #: apps/member/models.py:87 | ||||
| #: apps/member/models.py:86 | ||||
| #: templates/registration/future_profile_detail.html:50 | ||||
| #: templates/wei/weimembership_form.html:51 | ||||
| msgid "paid" | ||||
| msgstr "payé" | ||||
|  | ||||
| #: apps/member/models.py:88 | ||||
| #: apps/member/models.py:87 | ||||
| msgid "Tells if the user receive a salary." | ||||
| msgstr "Indique si l'utilisateur perçoit un salaire." | ||||
|  | ||||
| #: apps/member/models.py:93 | ||||
| #: apps/member/models.py:92 | ||||
| msgid "email confirmed" | ||||
| msgstr "adresse email confirmée" | ||||
|  | ||||
| #: apps/member/models.py:98 | ||||
| #: apps/member/models.py:97 | ||||
| msgid "registration valid" | ||||
| msgstr "inscription valid" | ||||
|  | ||||
| #: apps/member/models.py:127 apps/member/models.py:128 | ||||
| #: apps/member/models.py:126 apps/member/models.py:127 | ||||
| msgid "user profile" | ||||
| msgstr "profil utilisateur" | ||||
|  | ||||
| #: apps/member/models.py:157 templates/member/club_info.html:57 | ||||
| #: apps/member/models.py:156 templates/member/club_info.html:57 | ||||
| #: templates/registration/future_profile_detail.html:22 | ||||
| #: templates/wei/weiclub_info.html:52 templates/wei/weimembership_form.html:24 | ||||
| msgid "email" | ||||
| msgstr "courriel" | ||||
|  | ||||
| #: apps/member/models.py:164 | ||||
| #: apps/member/models.py:163 | ||||
| msgid "parent club" | ||||
| msgstr "club parent" | ||||
|  | ||||
| #: apps/member/models.py:173 | ||||
| #: apps/member/models.py:172 | ||||
| msgid "require memberships" | ||||
| msgstr "nécessite des adhésions" | ||||
|  | ||||
| #: apps/member/models.py:174 | ||||
| #: apps/member/models.py:173 | ||||
| msgid "Uncheck if this club don't require memberships." | ||||
| msgstr "Décochez si ce club n'utilise pas d'adhésions." | ||||
|  | ||||
| #: apps/member/models.py:179 templates/member/club_info.html:41 | ||||
| #: apps/member/models.py:178 templates/member/club_info.html:41 | ||||
| msgid "membership fee (paid students)" | ||||
| msgstr "cotisation pour adhérer (normalien élève)" | ||||
|  | ||||
| #: apps/member/models.py:184 templates/member/club_info.html:44 | ||||
| #: apps/member/models.py:183 templates/member/club_info.html:44 | ||||
| msgid "membership fee (unpaid students)" | ||||
| msgstr "cotisation pour adhérer (normalien étudiant)" | ||||
|  | ||||
| #: apps/member/models.py:190 templates/member/club_info.html:33 | ||||
| #: apps/member/models.py:189 templates/member/club_info.html:33 | ||||
| msgid "membership duration" | ||||
| msgstr "durée de l'adhésion" | ||||
|  | ||||
| #: apps/member/models.py:191 | ||||
| #: apps/member/models.py:190 | ||||
| msgid "The longest time (in days) a membership can last (NULL = infinite)." | ||||
| msgstr "La durée maximale (en jours) d'une adhésion (NULL = infinie)." | ||||
|  | ||||
| #: apps/member/models.py:198 templates/member/club_info.html:23 | ||||
| #: apps/member/models.py:197 templates/member/club_info.html:23 | ||||
| msgid "membership start" | ||||
| msgstr "début de l'adhésion" | ||||
|  | ||||
| #: apps/member/models.py:199 | ||||
| #: apps/member/models.py:198 | ||||
| msgid "How long after January 1st the members can renew their membership." | ||||
| msgstr "" | ||||
| "Combien de temps après le 1er Janvier les adhérents peuvent renouveler leur " | ||||
| "adhésion." | ||||
|  | ||||
| #: apps/member/models.py:206 templates/member/club_info.html:28 | ||||
| #: apps/member/models.py:205 templates/member/club_info.html:28 | ||||
| msgid "membership end" | ||||
| msgstr "fin de l'adhésion" | ||||
|  | ||||
| #: apps/member/models.py:207 | ||||
| #: apps/member/models.py:206 | ||||
| msgid "" | ||||
| "How long the membership can last after January 1st of the next year after " | ||||
| "members can renew their membership." | ||||
| @@ -480,20 +480,20 @@ msgstr "" | ||||
| "Combien de temps l'adhésion peut durer après le 1er Janvier de l'année " | ||||
| "suivante avant que les adhérents peuvent renouveler leur adhésion." | ||||
|  | ||||
| #: apps/member/models.py:241 apps/member/models.py:283 | ||||
| #: apps/member/models.py:240 apps/member/models.py:283 | ||||
| #: apps/note/models/notes.py:139 | ||||
| msgid "club" | ||||
| msgstr "club" | ||||
|  | ||||
| #: apps/member/models.py:242 | ||||
| #: apps/member/models.py:241 | ||||
| msgid "clubs" | ||||
| msgstr "clubs" | ||||
|  | ||||
| #: apps/member/models.py:262 apps/permission/models.py:312 | ||||
| #: apps/member/models.py:261 apps/permission/models.py:312 | ||||
| msgid "role" | ||||
| msgstr "rôle" | ||||
|  | ||||
| #: apps/member/models.py:263 apps/member/models.py:288 | ||||
| #: apps/member/models.py:262 apps/member/models.py:288 | ||||
| msgid "roles" | ||||
| msgstr "rôles" | ||||
|  | ||||
| @@ -509,7 +509,7 @@ msgstr "l'adhésion finit le" | ||||
| msgid "fee" | ||||
| msgstr "cotisation" | ||||
|  | ||||
| #: apps/member/models.py:320 apps/member/views.py:505 apps/wei/views.py:731 | ||||
| #: apps/member/models.py:320 apps/member/views.py:505 apps/wei/views.py:738 | ||||
| msgid "User is not a member of the parent club" | ||||
| msgstr "L'utilisateur n'est pas membre du club parent" | ||||
|  | ||||
| @@ -552,7 +552,7 @@ msgstr "Un alias avec un nom similaire existe déjà." | ||||
| msgid "Search user" | ||||
| msgstr "Chercher un utilisateur" | ||||
|  | ||||
| #: apps/member/views.py:500 apps/wei/views.py:722 | ||||
| #: apps/member/views.py:500 apps/wei/views.py:729 | ||||
| msgid "" | ||||
| "This user don't have enough money to join this club, and can't have a " | ||||
| "negative balance." | ||||
| @@ -569,8 +569,8 @@ msgid "The membership must begin before {:%m-%d-%Y}." | ||||
| msgstr "L'adhésion doit commencer avant le {:%d/%m/%Y}." | ||||
|  | ||||
| #: apps/member/views.py:540 apps/member/views.py:542 apps/member/views.py:544 | ||||
| #: apps/registration/views.py:288 apps/registration/views.py:290 | ||||
| #: apps/registration/views.py:292 | ||||
| #: apps/registration/views.py:289 apps/registration/views.py:291 | ||||
| #: apps/registration/views.py:293 | ||||
| msgid "This field is required." | ||||
| msgstr "Ce champ est requis." | ||||
|  | ||||
| @@ -896,31 +896,31 @@ msgstr "Adhérer au club BDE" | ||||
| msgid "Join Kfet Club" | ||||
| msgstr "Adhérer au club Kfet" | ||||
|  | ||||
| #: apps/registration/views.py:77 | ||||
| #: apps/registration/views.py:78 | ||||
| msgid "Email validation" | ||||
| msgstr "Validation de l'adresse mail" | ||||
|  | ||||
| #: apps/registration/views.py:123 | ||||
| #: apps/registration/views.py:124 | ||||
| msgid "Email validation unsuccessful" | ||||
| msgstr " La validation de l'adresse mail a échoué" | ||||
|  | ||||
| #: apps/registration/views.py:134 | ||||
| #: apps/registration/views.py:135 | ||||
| msgid "Email validation email sent" | ||||
| msgstr "L'email de vérification de l'adresse email a bien été envoyé." | ||||
|  | ||||
| #: apps/registration/views.py:187 | ||||
| #: apps/registration/views.py:188 | ||||
| msgid "Unregistered users" | ||||
| msgstr "Utilisateurs en attente d'inscription" | ||||
|  | ||||
| #: apps/registration/views.py:254 | ||||
| #: apps/registration/views.py:255 | ||||
| msgid "You must join the BDE." | ||||
| msgstr "Vous devez adhérer au BDE." | ||||
|  | ||||
| #: apps/registration/views.py:276 | ||||
| #: apps/registration/views.py:277 | ||||
| msgid "You must join BDE club before joining Kfet club." | ||||
| msgstr "Vous devez adhérer au club BDE avant d'adhérer au club Kfet." | ||||
|  | ||||
| #: apps/registration/views.py:281 | ||||
| #: apps/registration/views.py:282 | ||||
| msgid "" | ||||
| "The entered amount is not enough for the memberships, should be at least {}" | ||||
| msgstr "" | ||||
| @@ -1131,7 +1131,7 @@ msgid "WEI" | ||||
| msgstr "WEI" | ||||
|  | ||||
| #: apps/wei/forms/registration.py:47 apps/wei/models.py:109 | ||||
| #: apps/wei/models.py:270 | ||||
| #: apps/wei/models.py:271 | ||||
| msgid "bus" | ||||
| msgstr "Bus" | ||||
|  | ||||
| @@ -1169,10 +1169,6 @@ 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/management/commands/wei_algorithm.py:11 | ||||
| msgid "Attribute to each first year member a bus for the WEI" | ||||
| msgstr "Attribuer à chaque première année un bus pour le WEI" | ||||
|  | ||||
| #: apps/wei/models.py:20 templates/wei/weiclub_info.html:23 | ||||
| msgid "year" | ||||
| msgstr "année" | ||||
| @@ -1315,19 +1311,19 @@ msgstr "Participant au WEI" | ||||
| msgid "WEI Users" | ||||
| msgstr "Participants au WEI" | ||||
|  | ||||
| #: apps/wei/models.py:280 | ||||
| #: apps/wei/models.py:281 | ||||
| msgid "team" | ||||
| msgstr "équipe" | ||||
|  | ||||
| #: apps/wei/models.py:290 | ||||
| #: apps/wei/models.py:291 | ||||
| msgid "WEI registration" | ||||
| msgstr "inscription au WEI" | ||||
|  | ||||
| #: apps/wei/models.py:294 | ||||
| #: apps/wei/models.py:295 | ||||
| msgid "WEI membership" | ||||
| msgstr "adhésion au WEI" | ||||
|  | ||||
| #: apps/wei/models.py:295 | ||||
| #: apps/wei/models.py:296 | ||||
| msgid "WEI memberships" | ||||
| msgstr "adhésions au WEI" | ||||
|  | ||||
| @@ -1336,28 +1332,40 @@ msgstr "adhésions au WEI" | ||||
| msgid "Validate" | ||||
| msgstr "Valider" | ||||
|  | ||||
| #: apps/wei/tables.py:125 templates/wei/bus_tables.html:26 | ||||
| #: apps/wei/tables.py:96 | ||||
| msgid "Year" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/wei/tables.py:134 templates/wei/bus_tables.html:26 | ||||
| #: templates/wei/busteam_tables.html:43 | ||||
| msgid "Teams" | ||||
| msgstr "Équipes" | ||||
|  | ||||
| #: apps/wei/views.py:170 | ||||
| #: apps/wei/tables.py:143 apps/wei/tables.py:185 | ||||
| msgid "Members count" | ||||
| msgstr "Nombre de membres" | ||||
|  | ||||
| #: apps/wei/tables.py:150 apps/wei/tables.py:151 apps/wei/tables.py:182 | ||||
| msgid "members" | ||||
| msgstr "adhérents" | ||||
|  | ||||
| #: apps/wei/views.py:177 | ||||
| msgid "Find WEI Membership" | ||||
| msgstr "Trouver une adhésion au WEI" | ||||
|  | ||||
| #: apps/wei/views.py:205 | ||||
| #: apps/wei/views.py:212 | ||||
| msgid "Find WEI Registration" | ||||
| msgstr "Trouver une inscription au WEI" | ||||
|  | ||||
| #: apps/wei/views.py:414 templates/wei/weiclub_info.html:62 | ||||
| #: apps/wei/views.py:421 templates/wei/weiclub_info.html:62 | ||||
| msgid "Register 1A" | ||||
| msgstr "Inscrire un 1A" | ||||
|  | ||||
| #: apps/wei/views.py:435 apps/wei/views.py:503 | ||||
| #: apps/wei/views.py:442 apps/wei/views.py:510 | ||||
| msgid "This user is already registered to this WEI." | ||||
| msgstr "Cette personne est déjà inscrite au WEI." | ||||
|  | ||||
| #: apps/wei/views.py:440 | ||||
| #: apps/wei/views.py:447 | ||||
| msgid "" | ||||
| "This user can't be in her/his first year since he/she has already participed " | ||||
| "to a WEI." | ||||
| @@ -1365,19 +1373,19 @@ msgstr "" | ||||
| "Cet utilisateur ne peut pas être en première année puisqu'iel a déjà " | ||||
| "participé à un WEI." | ||||
|  | ||||
| #: apps/wei/views.py:468 templates/wei/weiclub_info.html:63 | ||||
| #: apps/wei/views.py:475 templates/wei/weiclub_info.html:63 | ||||
| msgid "Register 2A+" | ||||
| msgstr "Inscrire un 2A+" | ||||
|  | ||||
| #: apps/wei/views.py:486 apps/wei/views.py:569 | ||||
| #: apps/wei/views.py:493 apps/wei/views.py:576 | ||||
| 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:726 | ||||
| #: apps/wei/views.py:733 | ||||
| msgid "This user didn't give her/his caution check." | ||||
| msgstr "Cet utilisateur n'a pas donné son chèque de caution." | ||||
|  | ||||
| #: apps/wei/views.py:795 apps/wei/views.py:815 apps/wei/views.py:825 | ||||
| #: apps/wei/views.py:802 apps/wei/views.py:822 apps/wei/views.py:832 | ||||
| #: templates/wei/survey.html:12 templates/wei/survey_closed.html:12 | ||||
| #: templates/wei/survey_end.html:12 | ||||
| msgid "Survey WEI" | ||||
| @@ -2069,6 +2077,11 @@ msgstr "Ajouter une équipe" | ||||
| msgid "Members" | ||||
| msgstr "Membres" | ||||
|  | ||||
| #: templates/wei/bus_tables.html:48 templates/wei/busteam_tables.html:52 | ||||
| #: templates/wei/weimembership_list.html:30 | ||||
| msgid "View as PDF" | ||||
| msgstr "Télécharger au format PDF" | ||||
|  | ||||
| #: templates/wei/survey.html:24 | ||||
| msgid "Next" | ||||
| msgstr "Suivant" | ||||
| @@ -2292,3 +2305,6 @@ msgstr "Il n'y a pas de pré-inscription en attente avec cette entrée." | ||||
| #: templates/wei/weiregistration_list.html:24 | ||||
| msgid "View validated memberships..." | ||||
| msgstr "Voir les adhésions validées ..." | ||||
|  | ||||
| #~ msgid "Attribute to each first year member a bus for the WEI" | ||||
| #~ msgstr "Attribuer à chaque première année un bus pour le WEI" | ||||
|   | ||||
| @@ -41,4 +41,10 @@ | ||||
|         </div> | ||||
|         {% render_table memberships %} | ||||
|     </div> | ||||
|  | ||||
|     <hr> | ||||
|  | ||||
|     <a href="{% url 'wei:wei_memberships_bus_pdf' wei_pk=club.pk bus_pk=object.pk %}" data-turbolinks="false"> | ||||
|         <button class="btn btn-block btn-danger"><i class="fa fa-file-pdf-o"></i> {% trans "View as PDF" %}</button> | ||||
|     </a> | ||||
| {% endif %} | ||||
|   | ||||
| @@ -45,4 +45,10 @@ | ||||
|         </div> | ||||
|         {% render_table memberships %} | ||||
|     </div> | ||||
|  | ||||
|     <hr> | ||||
|  | ||||
|     <a href="{% url 'wei:wei_memberships_team_pdf' wei_pk=club.pk bus_pk=object.bus.pk team_pk=object.pk %}" data-turbolinks="false"> | ||||
|         <button class="btn btn-block btn-danger"><i class="fa fa-file-pdf-o"></i> {% trans "View as PDF" %}</button> | ||||
|     </a> | ||||
| {% endif %} | ||||
|   | ||||
							
								
								
									
										37
									
								
								templates/wei/weilist_sample.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								templates/wei/weilist_sample.tex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| \documentclass{article} | ||||
|  | ||||
| \usepackage[utf8]{inputenc} | ||||
| \usepackage[T1]{fontenc} | ||||
| \usepackage[french]{babel} | ||||
|  | ||||
| \usepackage[margin=2cm]{geometry} | ||||
| \usepackage{tabularx} | ||||
|  | ||||
| \begin{document} | ||||
| \begin{center} | ||||
| \huge{Liste des inscrits \og {{ wei.name }} \fg{}} | ||||
|  | ||||
| {% if bus %} | ||||
| \LARGE{Bus {{ bus.name }}} | ||||
|  | ||||
|  | ||||
| {% if team %} | ||||
| \Large{Équipe {{ team.name }}} | ||||
| {% endif %} | ||||
| {% endif %} | ||||
| \end{center} | ||||
|  | ||||
| \begin{center} | ||||
| \begin{tabularx}{\textwidth}{|c|c|c|c|c|c|c|X|} | ||||
| \hline | ||||
| \textbf{Nom} & \textbf{Prénom} & \textbf{Genre} & \textbf{Département} & \textbf{Année} & \textbf{Bus} & \textbf{Équipe} & \textbf{Rôles} \\ | ||||
| \hline | ||||
| {% for membership in memberships %} | ||||
| {{ membership.user.last_name|safe }} & {{ membership.user.first_name|safe }} & {{ membership.registration.get_gender_display|safe }} | ||||
| & {{ membership.user.profile.get_department_display|safe }} & {{ membership.user.profile.ens_year|safe }}A & {{ membership.bus.name|safe }} | ||||
| & {% if membership.team %}{{ membership.team.name|safe }}{% else %}--{% endif %} & {{ membership.roles.all|join:", "|safe }} \\ | ||||
| \hline | ||||
| {% endfor %} | ||||
| \end{tabularx} | ||||
| \end{center} | ||||
| \end{document} | ||||
| @@ -23,6 +23,12 @@ | ||||
|     <a href="{% url 'wei:wei_registrations' pk=club.pk %}"> | ||||
|         <button class="btn btn-block btn-info">{% trans "View unvalidated registrations..." %}</button> | ||||
|     </a> | ||||
|  | ||||
|     <hr> | ||||
|  | ||||
|     <a href="{% url 'wei:wei_memberships_pdf' wei_pk=club.pk %}" data-turbolinks="false"> | ||||
|         <button class="btn btn-block btn-danger"><i class="fa fa-file-pdf-o"></i> {% trans "View as PDF" %}</button> | ||||
|     </a> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block extrajavascript %} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user