Add PDF member lists

This commit is contained in:
Yohann D'ANELLO 2020-04-23 18:28:16 +02:00
parent 38b32b0623
commit b81f186866
15 changed files with 427 additions and 166 deletions

View File

@ -273,6 +273,7 @@ class Membership(models.Model):
user = models.ForeignKey( user = models.ForeignKey(
User, User,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name="memberships",
verbose_name=_("user"), verbose_name=_("user"),
) )

View File

@ -36,13 +36,15 @@ class PermissionBackend(ModelBackend):
# Unauthenticated users have no permissions # Unauthenticated users have no permissions
return Permission.objects.none() return Permission.objects.none()
return Permission.objects.annotate(club=F("rolepermissions__role__membership__club")) \ return Permission.objects.annotate(
.filter( club=F("rolepermissions__role__membership__club"),
rolepermissions__role__membership__user=user, membership=F("rolepermissions__role__membership"),
rolepermissions__role__membership__date_start__lte=datetime.date.today(), ).filter(
rolepermissions__role__membership__date_end__gte=datetime.date.today(), rolepermissions__role__membership__user=user,
type=t, rolepermissions__role__membership__date_start__lte=datetime.date.today(),
mask__rank__lte=get_current_session().get("permission_mask", 0), rolepermissions__role__membership__date_end__gte=datetime.date.today(),
type=t,
mask__rank__lte=get_current_session().get("permission_mask", 0),
).distinct() ).distinct()
@staticmethod @staticmethod
@ -55,6 +57,7 @@ class PermissionBackend(ModelBackend):
:return: A generator of the requested permissions :return: A generator of the requested permissions
""" """
clubs = {} clubs = {}
memberships = {}
for permission in PermissionBackend.get_raw_permissions(user, type): for permission in PermissionBackend.get_raw_permissions(user, type):
if not isinstance(model.model_class()(), permission.model.model_class()) or not permission.club: 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) clubs[permission.club] = club = Club.objects.get(pk=permission.club)
else: else:
club = clubs[permission.club] 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( permission = permission.about(
user=user, user=user,
club=club, club=club,
membership=membership,
User=User, User=User,
Club=Club, Club=Club,
Membership=Membership, Membership=Membership,

View File

@ -1470,7 +1470,7 @@
"wei", "wei",
"weiregistration" "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", "type": "view",
"mask": 1, "mask": 1,
"field": "", "field": "",
@ -1882,6 +1882,36 @@
"description": "View my own WEI membership if I am an old member or if the WEI is past" "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", "model": "permission.rolepermissions",
"pk": 1, "pk": 1,
@ -2230,5 +2260,25 @@
113 113
] ]
} }
},
{
"model": "permission.rolepermissions",
"pk": 13,
"fields": {
"role": 13,
"permissions": [
115
]
}
},
{
"model": "permission.rolepermissions",
"pk": 14,
"fields": {
"role": 14,
"permissions": [
116
]
}
} }
] ]

View File

@ -38,6 +38,7 @@ class UserCreateView(CreateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context["profile_form"] = self.second_form() context["profile_form"] = self.second_form()
del context["profile_form"].fields["section"]
return context return context

View File

@ -182,7 +182,7 @@ class InvoiceRenderView(LoginRequiredMixin, View):
# Display the generated pdf as a HTTP Response # Display the generated pdf as a HTTP Response
pdf = open("{}/invoice-{}.pdf".format(tmp_dir, pk), 'rb').read() pdf = open("{}/invoice-{}.pdf".format(tmp_dir, pk), 'rb').read()
response = HttpResponse(pdf, content_type="application/pdf") 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: except IOError as e:
raise e raise e
finally: finally:

View File

@ -265,6 +265,7 @@ class WEIMembership(Membership):
bus = models.ForeignKey( bus = models.ForeignKey(
Bus, Bus,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name="memberships",
null=True, null=True,
default=None, default=None,
verbose_name=_("bus"), verbose_name=_("bus"),

View File

@ -91,6 +91,11 @@ class WEIMembershipTable(tables.Table):
args=[A('registration.pk')], args=[A('registration.pk')],
) )
year = tables.Column(
accessor=A("pk"),
verbose_name=_("Year"),
)
bus = tables.LinkColumn( bus = tables.LinkColumn(
'wei:manage_bus', 'wei:manage_bus',
args=[A('bus.pk')], args=[A('bus.pk')],
@ -101,13 +106,17 @@ class WEIMembershipTable(tables.Table):
args=[A('bus.pk')], args=[A('bus.pk')],
) )
def render_year(self, record):
return str(record.user.profile.ens_year) + "A"
class Meta: class Meta:
attrs = { attrs = {
'class': 'table table-condensed table-striped table-hover' 'class': 'table table-condensed table-striped table-hover'
} }
model = WEIMembership model = WEIMembership
template_name = 'django_tables2/bootstrap4.html' 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 = { row_attrs = {
'class': 'table-row', 'class': 'table-row',
'id': lambda record: "row-" + str(record.pk), '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): def render_teams(self, value):
return ", ".join(team.name for team in value.all()) 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: class Meta:
attrs = { attrs = {
'class': 'table table-condensed table-striped table-hover' '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): def render_color(self, value):
return "#{:06X}".format(value) return "#{:06X}".format(value)

View File

@ -4,7 +4,7 @@
from django.urls import path from django.urls import path
from .views import CurrentWEIDetailView, WEIListView, WEICreateView, WEIDetailView, WEIUpdateView,\ from .views import CurrentWEIDetailView, WEIListView, WEICreateView, WEIDetailView, WEIUpdateView,\
WEIRegistrationsView, WEIMembershipsView,\ WEIRegistrationsView, WEIMembershipsView, MemberListRenderView,\
BusCreateView, BusManageView, BusUpdateView, BusTeamCreateView, BusTeamManageView, BusTeamUpdateView,\ BusCreateView, BusManageView, BusUpdateView, BusTeamCreateView, BusTeamManageView, BusTeamUpdateView,\
WEIRegister1AView, WEIRegister2AView, WEIUpdateRegistrationView, WEIDeleteRegistrationView,\ WEIRegister1AView, WEIRegister2AView, WEIUpdateRegistrationView, WEIDeleteRegistrationView,\
WEIValidateRegistrationView, WEISurveyView, WEISurveyEndView, WEIClosedView WEIValidateRegistrationView, WEISurveyView, WEISurveyEndView, WEIClosedView
@ -19,6 +19,11 @@ urlpatterns = [
path('update/<int:pk>/', WEIUpdateView.as_view(), name="wei_update"), 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>/registrations/', WEIRegistrationsView.as_view(), name="wei_registrations"),
path('detail/<int:pk>/memberships/', WEIMembershipsView.as_view(), name="wei_memberships"), 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('add-bus/<int:pk>/', BusCreateView.as_view(), name="add_bus"),
path('manage-bus/<int:pk>/', BusManageView.as_view(), name="manage_bus"), path('manage-bus/<int:pk>/', BusManageView.as_view(), name="manage_bus"),
path('update-bus/<int:pk>/', BusUpdateView.as_view(), name="update_bus"), path('update-bus/<int:pk>/', BusUpdateView.as_view(), name="update_bus"),

View File

@ -1,15 +1,23 @@
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
import os
import shutil
import subprocess
from datetime import datetime, date from datetime import datetime, date
from tempfile import mkdtemp
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied 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.forms import HiddenInput
from django.http import HttpResponse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.template.loader import render_to_string
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.views import View
from django.views.generic import DetailView, UpdateView, CreateView, RedirectView, TemplateView from django.views.generic import DetailView, UpdateView, CreateView, RedirectView, TemplateView
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views.generic.edit import BaseFormView, DeleteView from django.views.generic.edit import BaseFormView, DeleteView
@ -17,6 +25,7 @@ from django_tables2 import SingleTableView
from member.models import Membership, Club from member.models import Membership, Club
from note.models import Transaction, NoteClub, Alias from note.models import Transaction, NoteClub, Alias
from note.tables import HistoryTable from note.tables import HistoryTable
from note_kfet.settings import BASE_DIR
from permission.backends import PermissionBackend from permission.backends import PermissionBackend
from permission.views import ProtectQuerysetMixin from permission.views import ProtectQuerysetMixin
@ -108,7 +117,7 @@ class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
context["my_registration"] = my_registration context["my_registration"] = my_registration
buses = Bus.objects.filter(PermissionBackend.filter_queryset(self.request.user, Bus, "view"))\ 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-") bus_table = BusTable(data=buses, prefix="bus-")
context['buses'] = bus_table context['buses'] = bus_table
@ -299,7 +308,7 @@ class BusManageView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
bus = self.object bus = self.object
teams = BusTeam.objects.filter(PermissionBackend.filter_queryset(self.request.user, BusTeam, "view"))\ 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-") teams_table = BusTeamTable(data=teams, prefix="team-")
context["teams"] = teams_table context["teams"] = teams_table
@ -824,3 +833,80 @@ class WEIClosedView(LoginRequiredMixin, TemplateView):
context["club"] = WEIClub.objects.get(pk=self.kwargs["pk"]) context["club"] = WEIClub.objects.get(pk=self.kwargs["pk"])
context["title"] = _("Survey WEI") context["title"] = _("Survey WEI")
return context 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

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 "" msgstr ""
#: apps/activity/models.py:23 apps/activity/models.py:48 #: 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/notes.py:188 apps/note/models/transactions.py:25
#: apps/note/models/transactions.py:45 apps/note/models/transactions.py:250 #: apps/note/models/transactions.py:45 apps/note/models/transactions.py:250
#: apps/wei/models.py:62 templates/member/club_info.html:13 #: apps/wei/models.py:62 templates/member/club_info.html:13
@ -308,192 +308,192 @@ msgstr ""
msgid "Bank" msgid "Bank"
msgstr "" msgstr ""
#: apps/member/models.py:35 #: apps/member/models.py:34
#: templates/registration/future_profile_detail.html:47 #: templates/registration/future_profile_detail.html:47
#: templates/wei/weimembership_form.html:48 #: templates/wei/weimembership_form.html:48
msgid "phone number" msgid "phone number"
msgstr "" 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/registration/future_profile_detail.html:41
#: templates/wei/weimembership_form.html:42 #: templates/wei/weimembership_form.html:42
msgid "section" msgid "section"
msgstr "" msgstr ""
#: apps/member/models.py:43 #: apps/member/models.py:42
msgid "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\"" msgid "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\""
msgstr "" 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" msgid "department"
msgstr "" msgstr ""
#: apps/member/models.py:53 #: apps/member/models.py:52
msgid "Informatics (A0)" msgid "Informatics (A0)"
msgstr "" msgstr ""
#: apps/member/models.py:54 #: apps/member/models.py:53
msgid "Mathematics (A1)" msgid "Mathematics (A1)"
msgstr "" msgstr ""
#: apps/member/models.py:55 #: apps/member/models.py:54
msgid "Physics (A2)" msgid "Physics (A2)"
msgstr "" msgstr ""
#: apps/member/models.py:56 #: apps/member/models.py:55
msgid "Applied physics (A'2)" msgid "Applied physics (A'2)"
msgstr "" msgstr ""
#: apps/member/models.py:57 #: apps/member/models.py:56
msgid "Chemistry (A''2)" msgid "Chemistry (A''2)"
msgstr "" msgstr ""
#: apps/member/models.py:58 #: apps/member/models.py:57
msgid "Biology (A3)" msgid "Biology (A3)"
msgstr "" msgstr ""
#: apps/member/models.py:59 #: apps/member/models.py:58
msgid "SAPHIRE (B1234)" msgid "SAPHIRE (B1234)"
msgstr "" msgstr ""
#: apps/member/models.py:60 #: apps/member/models.py:59
msgid "Mechanics (B1)" msgid "Mechanics (B1)"
msgstr "" msgstr ""
#: apps/member/models.py:61 #: apps/member/models.py:60
msgid "Civil engineering (B2)" msgid "Civil engineering (B2)"
msgstr "" msgstr ""
#: apps/member/models.py:62 #: apps/member/models.py:61
msgid "Mechanical engineering (B3)" msgid "Mechanical engineering (B3)"
msgstr "" msgstr ""
#: apps/member/models.py:63 #: apps/member/models.py:62
msgid "EEA (B4)" msgid "EEA (B4)"
msgstr "" msgstr ""
#: apps/member/models.py:64 #: apps/member/models.py:63
msgid "Design (C)" msgid "Design (C)"
msgstr "" msgstr ""
#: apps/member/models.py:65 #: apps/member/models.py:64
msgid "Economy-management (D2)" msgid "Economy-management (D2)"
msgstr "" msgstr ""
#: apps/member/models.py:66 #: apps/member/models.py:65
msgid "Social sciences (D3)" msgid "Social sciences (D3)"
msgstr "" msgstr ""
#: apps/member/models.py:67 #: apps/member/models.py:66
msgid "English (E)" msgid "English (E)"
msgstr "" msgstr ""
#: apps/member/models.py:68 #: apps/member/models.py:67
msgid "External (EXT)" msgid "External (EXT)"
msgstr "" msgstr ""
#: apps/member/models.py:75 #: apps/member/models.py:74
msgid "promotion" msgid "promotion"
msgstr "" msgstr ""
#: apps/member/models.py:76 #: apps/member/models.py:75
msgid "Year of entry to the school (None if not ENS student)" msgid "Year of entry to the school (None if not ENS student)"
msgstr "" 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/registration/future_profile_detail.html:44
#: templates/wei/weimembership_form.html:45 #: templates/wei/weimembership_form.html:45
msgid "address" msgid "address"
msgstr "" msgstr ""
#: apps/member/models.py:87 #: apps/member/models.py:86
#: templates/registration/future_profile_detail.html:50 #: templates/registration/future_profile_detail.html:50
#: templates/wei/weimembership_form.html:51 #: templates/wei/weimembership_form.html:51
msgid "paid" msgid "paid"
msgstr "" msgstr ""
#: apps/member/models.py:88 #: apps/member/models.py:87
msgid "Tells if the user receive a salary." msgid "Tells if the user receive a salary."
msgstr "" msgstr ""
#: apps/member/models.py:93 #: apps/member/models.py:92
msgid "email confirmed" msgid "email confirmed"
msgstr "" msgstr ""
#: apps/member/models.py:98 #: apps/member/models.py:97
msgid "registration valid" msgid "registration valid"
msgstr "" msgstr ""
#: apps/member/models.py:127 apps/member/models.py:128 #: apps/member/models.py:126 apps/member/models.py:127
msgid "user profile" msgid "user profile"
msgstr "" 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/registration/future_profile_detail.html:22
#: templates/wei/weiclub_info.html:52 templates/wei/weimembership_form.html:24 #: templates/wei/weiclub_info.html:52 templates/wei/weimembership_form.html:24
msgid "email" msgid "email"
msgstr "" msgstr ""
#: apps/member/models.py:164 #: apps/member/models.py:163
msgid "parent club" msgid "parent club"
msgstr "" msgstr ""
#: apps/member/models.py:173 #: apps/member/models.py:172
msgid "require memberships" msgid "require memberships"
msgstr "" msgstr ""
#: apps/member/models.py:174 #: apps/member/models.py:173
msgid "Uncheck if this club don't require memberships." msgid "Uncheck if this club don't require memberships."
msgstr "" 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)" msgid "membership fee (paid students)"
msgstr "" 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)" msgid "membership fee (unpaid students)"
msgstr "" 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" msgid "membership duration"
msgstr "" msgstr ""
#: apps/member/models.py:191 #: apps/member/models.py:190
msgid "The longest time (in days) a membership can last (NULL = infinite)." msgid "The longest time (in days) a membership can last (NULL = infinite)."
msgstr "" 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" msgid "membership start"
msgstr "" msgstr ""
#: apps/member/models.py:199 #: apps/member/models.py:198
msgid "How long after January 1st the members can renew their membership." msgid "How long after January 1st the members can renew their membership."
msgstr "" 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" msgid "membership end"
msgstr "" msgstr ""
#: apps/member/models.py:207 #: apps/member/models.py:206
msgid "" msgid ""
"How long the membership can last after January 1st of the next year after " "How long the membership can last after January 1st of the next year after "
"members can renew their membership." "members can renew their membership."
msgstr "" 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 #: apps/note/models/notes.py:139
msgid "club" msgid "club"
msgstr "" msgstr ""
#: apps/member/models.py:242 #: apps/member/models.py:241
msgid "clubs" msgid "clubs"
msgstr "" msgstr ""
#: apps/member/models.py:262 apps/permission/models.py:312 #: apps/member/models.py:261 apps/permission/models.py:312
msgid "role" msgid "role"
msgstr "" msgstr ""
#: apps/member/models.py:263 apps/member/models.py:288 #: apps/member/models.py:262 apps/member/models.py:288
msgid "roles" msgid "roles"
msgstr "" msgstr ""
@ -509,7 +509,7 @@ msgstr ""
msgid "fee" msgid "fee"
msgstr "" 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" msgid "User is not a member of the parent club"
msgstr "" msgstr ""
@ -552,7 +552,7 @@ msgstr ""
msgid "Search user" msgid "Search user"
msgstr "" msgstr ""
#: apps/member/views.py:500 apps/wei/views.py:722 #: apps/member/views.py:500 apps/wei/views.py:729
msgid "" msgid ""
"This user don't have enough money to join this club, and can't have a " "This user don't have enough money to join this club, and can't have a "
"negative balance." "negative balance."
@ -567,8 +567,8 @@ msgid "The membership must begin before {:%m-%d-%Y}."
msgstr "" msgstr ""
#: apps/member/views.py:540 apps/member/views.py:542 apps/member/views.py:544 #: 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:289 apps/registration/views.py:291
#: apps/registration/views.py:292 #: apps/registration/views.py:293
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
@ -890,31 +890,31 @@ msgstr ""
msgid "Join Kfet Club" msgid "Join Kfet Club"
msgstr "" msgstr ""
#: apps/registration/views.py:77 #: apps/registration/views.py:78
msgid "Email validation" msgid "Email validation"
msgstr "" msgstr ""
#: apps/registration/views.py:123 #: apps/registration/views.py:124
msgid "Email validation unsuccessful" msgid "Email validation unsuccessful"
msgstr "" msgstr ""
#: apps/registration/views.py:134 #: apps/registration/views.py:135
msgid "Email validation email sent" msgid "Email validation email sent"
msgstr "" msgstr ""
#: apps/registration/views.py:187 #: apps/registration/views.py:188
msgid "Unregistered users" msgid "Unregistered users"
msgstr "" msgstr ""
#: apps/registration/views.py:254 #: apps/registration/views.py:255
msgid "You must join the BDE." msgid "You must join the BDE."
msgstr "" msgstr ""
#: apps/registration/views.py:276 #: apps/registration/views.py:277
msgid "You must join BDE club before joining Kfet club." msgid "You must join BDE club before joining Kfet club."
msgstr "" msgstr ""
#: apps/registration/views.py:281 #: apps/registration/views.py:282
msgid "" msgid ""
"The entered amount is not enough for the memberships, should be at least {}" "The entered amount is not enough for the memberships, should be at least {}"
msgstr "" msgstr ""
@ -1121,7 +1121,7 @@ msgid "WEI"
msgstr "" msgstr ""
#: apps/wei/forms/registration.py:47 apps/wei/models.py:109 #: apps/wei/forms/registration.py:47 apps/wei/models.py:109
#: apps/wei/models.py:270 #: apps/wei/models.py:271
msgid "bus" msgid "bus"
msgstr "" msgstr ""
@ -1154,10 +1154,6 @@ msgstr ""
msgid "This team doesn't belong to the given bus." msgid "This team doesn't belong to the given bus."
msgstr "" 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 #: apps/wei/models.py:20 templates/wei/weiclub_info.html:23
msgid "year" msgid "year"
msgstr "" msgstr ""
@ -1290,19 +1286,19 @@ msgstr ""
msgid "WEI Users" msgid "WEI Users"
msgstr "" msgstr ""
#: apps/wei/models.py:280 #: apps/wei/models.py:281
msgid "team" msgid "team"
msgstr "" msgstr ""
#: apps/wei/models.py:290 #: apps/wei/models.py:291
msgid "WEI registration" msgid "WEI registration"
msgstr "" msgstr ""
#: apps/wei/models.py:294 #: apps/wei/models.py:295
msgid "WEI membership" msgid "WEI membership"
msgstr "" msgstr ""
#: apps/wei/models.py:295 #: apps/wei/models.py:296
msgid "WEI memberships" msgid "WEI memberships"
msgstr "" msgstr ""
@ -1311,46 +1307,58 @@ msgstr ""
msgid "Validate" msgid "Validate"
msgstr "" 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 #: templates/wei/busteam_tables.html:43
msgid "Teams" msgid "Teams"
msgstr "" 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" msgid "Find WEI Membership"
msgstr "" msgstr ""
#: apps/wei/views.py:205 #: apps/wei/views.py:212
msgid "Find WEI Registration" msgid "Find WEI Registration"
msgstr "" 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" msgid "Register 1A"
msgstr "" 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." msgid "This user is already registered to this WEI."
msgstr "" msgstr ""
#: apps/wei/views.py:440 #: apps/wei/views.py:447
msgid "" msgid ""
"This user can't be in her/his first year since he/she has already participed " "This user can't be in her/his first year since he/she has already participed "
"to a WEI." "to a WEI."
msgstr "" 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+" msgid "Register 2A+"
msgstr "" 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." msgid "You already opened an account in the Société générale."
msgstr "" msgstr ""
#: apps/wei/views.py:726 #: apps/wei/views.py:733
msgid "This user didn't give her/his caution check." msgid "This user didn't give her/his caution check."
msgstr "" 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.html:12 templates/wei/survey_closed.html:12
#: templates/wei/survey_end.html:12 #: templates/wei/survey_end.html:12
msgid "Survey WEI" msgid "Survey WEI"
@ -2010,6 +2018,11 @@ msgstr ""
msgid "Members" msgid "Members"
msgstr "" 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 #: templates/wei/survey.html:24
msgid "Next" msgid "Next"
msgstr "" msgstr ""

View File

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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é." msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité."
#: apps/activity/models.py:23 apps/activity/models.py:48 #: 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/notes.py:188 apps/note/models/transactions.py:25
#: apps/note/models/transactions.py:45 apps/note/models/transactions.py:250 #: apps/note/models/transactions.py:45 apps/note/models/transactions.py:250
#: apps/wei/models.py:62 templates/member/club_info.html:13 #: apps/wei/models.py:62 templates/member/club_info.html:13
@ -304,175 +304,175 @@ msgstr "Montant à créditer"
msgid "Bank" msgid "Bank"
msgstr "Banque" msgstr "Banque"
#: apps/member/models.py:35 #: apps/member/models.py:34
#: templates/registration/future_profile_detail.html:47 #: templates/registration/future_profile_detail.html:47
#: templates/wei/weimembership_form.html:48 #: templates/wei/weimembership_form.html:48
msgid "phone number" msgid "phone number"
msgstr "numéro de téléphone" 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/registration/future_profile_detail.html:41
#: templates/wei/weimembership_form.html:42 #: templates/wei/weimembership_form.html:42
msgid "section" msgid "section"
msgstr "section" msgstr "section"
#: apps/member/models.py:43 #: apps/member/models.py:42
msgid "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\"" msgid "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\""
msgstr "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" msgid "department"
msgstr "département" msgstr "département"
#: apps/member/models.py:53 #: apps/member/models.py:52
msgid "Informatics (A0)" msgid "Informatics (A0)"
msgstr "Informatique (A0)" msgstr "Informatique (A0)"
#: apps/member/models.py:54 #: apps/member/models.py:53
msgid "Mathematics (A1)" msgid "Mathematics (A1)"
msgstr "Mathématiques (A1)" msgstr "Mathématiques (A1)"
#: apps/member/models.py:55 #: apps/member/models.py:54
msgid "Physics (A2)" msgid "Physics (A2)"
msgstr "Physique (A2)" msgstr "Physique (A2)"
#: apps/member/models.py:56 #: apps/member/models.py:55
msgid "Applied physics (A'2)" msgid "Applied physics (A'2)"
msgstr "Physique appliquée (A'2)" msgstr "Physique appliquée (A'2)"
#: apps/member/models.py:57 #: apps/member/models.py:56
msgid "Chemistry (A''2)" msgid "Chemistry (A''2)"
msgstr "Chimie (A''2)" msgstr "Chimie (A''2)"
#: apps/member/models.py:58 #: apps/member/models.py:57
msgid "Biology (A3)" msgid "Biology (A3)"
msgstr "Biologie (A3)" msgstr "Biologie (A3)"
#: apps/member/models.py:59 #: apps/member/models.py:58
msgid "SAPHIRE (B1234)" msgid "SAPHIRE (B1234)"
msgstr "SAPHIRE (B1234)" msgstr "SAPHIRE (B1234)"
#: apps/member/models.py:60 #: apps/member/models.py:59
msgid "Mechanics (B1)" msgid "Mechanics (B1)"
msgstr "Mécanique (B1)" msgstr "Mécanique (B1)"
#: apps/member/models.py:61 #: apps/member/models.py:60
msgid "Civil engineering (B2)" msgid "Civil engineering (B2)"
msgstr "Génie civil (B2)" msgstr "Génie civil (B2)"
#: apps/member/models.py:62 #: apps/member/models.py:61
msgid "Mechanical engineering (B3)" msgid "Mechanical engineering (B3)"
msgstr "Génie mécanique (B3)" msgstr "Génie mécanique (B3)"
#: apps/member/models.py:63 #: apps/member/models.py:62
msgid "EEA (B4)" msgid "EEA (B4)"
msgstr "EEA (B4)" msgstr "EEA (B4)"
#: apps/member/models.py:64 #: apps/member/models.py:63
msgid "Design (C)" msgid "Design (C)"
msgstr "Design (C)" msgstr "Design (C)"
#: apps/member/models.py:65 #: apps/member/models.py:64
msgid "Economy-management (D2)" msgid "Economy-management (D2)"
msgstr "Économie-gestion (D2)" msgstr "Économie-gestion (D2)"
#: apps/member/models.py:66 #: apps/member/models.py:65
msgid "Social sciences (D3)" msgid "Social sciences (D3)"
msgstr "Sciences sociales (D3)" msgstr "Sciences sociales (D3)"
#: apps/member/models.py:67 #: apps/member/models.py:66
msgid "English (E)" msgid "English (E)"
msgstr "Anglais (E)" msgstr "Anglais (E)"
#: apps/member/models.py:68 #: apps/member/models.py:67
msgid "External (EXT)" msgid "External (EXT)"
msgstr "Externe (EXT)" msgstr "Externe (EXT)"
#: apps/member/models.py:75 #: apps/member/models.py:74
msgid "promotion" msgid "promotion"
msgstr "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)" 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)" 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/registration/future_profile_detail.html:44
#: templates/wei/weimembership_form.html:45 #: templates/wei/weimembership_form.html:45
msgid "address" msgid "address"
msgstr "adresse" msgstr "adresse"
#: apps/member/models.py:87 #: apps/member/models.py:86
#: templates/registration/future_profile_detail.html:50 #: templates/registration/future_profile_detail.html:50
#: templates/wei/weimembership_form.html:51 #: templates/wei/weimembership_form.html:51
msgid "paid" msgid "paid"
msgstr "payé" msgstr "payé"
#: apps/member/models.py:88 #: apps/member/models.py:87
msgid "Tells if the user receive a salary." msgid "Tells if the user receive a salary."
msgstr "Indique si l'utilisateur perçoit un salaire." msgstr "Indique si l'utilisateur perçoit un salaire."
#: apps/member/models.py:93 #: apps/member/models.py:92
msgid "email confirmed" msgid "email confirmed"
msgstr "adresse email confirmée" msgstr "adresse email confirmée"
#: apps/member/models.py:98 #: apps/member/models.py:97
msgid "registration valid" msgid "registration valid"
msgstr "inscription 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" msgid "user profile"
msgstr "profil utilisateur" 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/registration/future_profile_detail.html:22
#: templates/wei/weiclub_info.html:52 templates/wei/weimembership_form.html:24 #: templates/wei/weiclub_info.html:52 templates/wei/weimembership_form.html:24
msgid "email" msgid "email"
msgstr "courriel" msgstr "courriel"
#: apps/member/models.py:164 #: apps/member/models.py:163
msgid "parent club" msgid "parent club"
msgstr "club parent" msgstr "club parent"
#: apps/member/models.py:173 #: apps/member/models.py:172
msgid "require memberships" msgid "require memberships"
msgstr "nécessite des adhésions" 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." msgid "Uncheck if this club don't require memberships."
msgstr "Décochez si ce club n'utilise pas d'adhésions." 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)" msgid "membership fee (paid students)"
msgstr "cotisation pour adhérer (normalien élève)" 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)" msgid "membership fee (unpaid students)"
msgstr "cotisation pour adhérer (normalien étudiant)" 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" msgid "membership duration"
msgstr "durée de l'adhésion" 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)." 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)." 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" msgid "membership start"
msgstr "début de l'adhésion" 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." msgid "How long after January 1st the members can renew their membership."
msgstr "" msgstr ""
"Combien de temps après le 1er Janvier les adhérents peuvent renouveler leur " "Combien de temps après le 1er Janvier les adhérents peuvent renouveler leur "
"adhésion." "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" msgid "membership end"
msgstr "fin de l'adhésion" msgstr "fin de l'adhésion"
#: apps/member/models.py:207 #: apps/member/models.py:206
msgid "" msgid ""
"How long the membership can last after January 1st of the next year after " "How long the membership can last after January 1st of the next year after "
"members can renew their membership." "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 " "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." "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 #: apps/note/models/notes.py:139
msgid "club" msgid "club"
msgstr "club" msgstr "club"
#: apps/member/models.py:242 #: apps/member/models.py:241
msgid "clubs" msgid "clubs"
msgstr "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" msgid "role"
msgstr "rôle" 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" msgid "roles"
msgstr "rôles" msgstr "rôles"
@ -509,7 +509,7 @@ msgstr "l'adhésion finit le"
msgid "fee" msgid "fee"
msgstr "cotisation" 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" msgid "User is not a member of the parent club"
msgstr "L'utilisateur n'est pas membre du club parent" 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" msgid "Search user"
msgstr "Chercher un utilisateur" 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 "" msgid ""
"This user don't have enough money to join this club, and can't have a " "This user don't have enough money to join this club, and can't have a "
"negative balance." "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}." 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/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:289 apps/registration/views.py:291
#: apps/registration/views.py:292 #: apps/registration/views.py:293
msgid "This field is required." msgid "This field is required."
msgstr "Ce champ est requis." msgstr "Ce champ est requis."
@ -896,31 +896,31 @@ msgstr "Adhérer au club BDE"
msgid "Join Kfet Club" msgid "Join Kfet Club"
msgstr "Adhérer au club Kfet" msgstr "Adhérer au club Kfet"
#: apps/registration/views.py:77 #: apps/registration/views.py:78
msgid "Email validation" msgid "Email validation"
msgstr "Validation de l'adresse mail" msgstr "Validation de l'adresse mail"
#: apps/registration/views.py:123 #: apps/registration/views.py:124
msgid "Email validation unsuccessful" msgid "Email validation unsuccessful"
msgstr " La validation de l'adresse mail a échoué" msgstr " La validation de l'adresse mail a échoué"
#: apps/registration/views.py:134 #: apps/registration/views.py:135
msgid "Email validation email sent" msgid "Email validation email sent"
msgstr "L'email de vérification de l'adresse email a bien été envoyé." 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" msgid "Unregistered users"
msgstr "Utilisateurs en attente d'inscription" msgstr "Utilisateurs en attente d'inscription"
#: apps/registration/views.py:254 #: apps/registration/views.py:255
msgid "You must join the BDE." msgid "You must join the BDE."
msgstr "Vous devez adhérer au 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." 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." 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 "" msgid ""
"The entered amount is not enough for the memberships, should be at least {}" "The entered amount is not enough for the memberships, should be at least {}"
msgstr "" msgstr ""
@ -1131,7 +1131,7 @@ msgid "WEI"
msgstr "WEI" msgstr "WEI"
#: apps/wei/forms/registration.py:47 apps/wei/models.py:109 #: apps/wei/forms/registration.py:47 apps/wei/models.py:109
#: apps/wei/models.py:270 #: apps/wei/models.py:271
msgid "bus" msgid "bus"
msgstr "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." msgid "This team doesn't belong to the given bus."
msgstr "Cette équipe n'appartient pas à ce 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 #: apps/wei/models.py:20 templates/wei/weiclub_info.html:23
msgid "year" msgid "year"
msgstr "année" msgstr "année"
@ -1315,19 +1311,19 @@ msgstr "Participant au WEI"
msgid "WEI Users" msgid "WEI Users"
msgstr "Participants au WEI" msgstr "Participants au WEI"
#: apps/wei/models.py:280 #: apps/wei/models.py:281
msgid "team" msgid "team"
msgstr "équipe" msgstr "équipe"
#: apps/wei/models.py:290 #: apps/wei/models.py:291
msgid "WEI registration" msgid "WEI registration"
msgstr "inscription au WEI" msgstr "inscription au WEI"
#: apps/wei/models.py:294 #: apps/wei/models.py:295
msgid "WEI membership" msgid "WEI membership"
msgstr "adhésion au WEI" msgstr "adhésion au WEI"
#: apps/wei/models.py:295 #: apps/wei/models.py:296
msgid "WEI memberships" msgid "WEI memberships"
msgstr "adhésions au WEI" msgstr "adhésions au WEI"
@ -1336,28 +1332,40 @@ msgstr "adhésions au WEI"
msgid "Validate" msgid "Validate"
msgstr "Valider" 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 #: templates/wei/busteam_tables.html:43
msgid "Teams" msgid "Teams"
msgstr "Équipes" 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" msgid "Find WEI Membership"
msgstr "Trouver une adhésion au WEI" msgstr "Trouver une adhésion au WEI"
#: apps/wei/views.py:205 #: apps/wei/views.py:212
msgid "Find WEI Registration" msgid "Find WEI Registration"
msgstr "Trouver une inscription au WEI" 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" msgid "Register 1A"
msgstr "Inscrire un 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." msgid "This user is already registered to this WEI."
msgstr "Cette personne est déjà inscrite au WEI." msgstr "Cette personne est déjà inscrite au WEI."
#: apps/wei/views.py:440 #: apps/wei/views.py:447
msgid "" msgid ""
"This user can't be in her/his first year since he/she has already participed " "This user can't be in her/his first year since he/she has already participed "
"to a WEI." "to a WEI."
@ -1365,19 +1373,19 @@ msgstr ""
"Cet utilisateur ne peut pas être en première année puisqu'iel a déjà " "Cet utilisateur ne peut pas être en première année puisqu'iel a déjà "
"participé à un WEI." "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+" msgid "Register 2A+"
msgstr "Inscrire un 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." 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." 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." msgid "This user didn't give her/his caution check."
msgstr "Cet utilisateur n'a pas donné son chèque de caution." 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.html:12 templates/wei/survey_closed.html:12
#: templates/wei/survey_end.html:12 #: templates/wei/survey_end.html:12
msgid "Survey WEI" msgid "Survey WEI"
@ -2069,6 +2077,11 @@ msgstr "Ajouter une équipe"
msgid "Members" msgid "Members"
msgstr "Membres" 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 #: templates/wei/survey.html:24
msgid "Next" msgid "Next"
msgstr "Suivant" 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 #: templates/wei/weiregistration_list.html:24
msgid "View validated memberships..." msgid "View validated memberships..."
msgstr "Voir les adhésions validées ..." 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"

View File

@ -41,4 +41,10 @@
</div> </div>
{% render_table memberships %} {% render_table memberships %}
</div> </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 %} {% endif %}

View File

@ -45,4 +45,10 @@
</div> </div>
{% render_table memberships %} {% render_table memberships %}
</div> </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 %} {% endif %}

View 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}

View File

@ -23,6 +23,12 @@
<a href="{% url 'wei:wei_registrations' pk=club.pk %}"> <a href="{% url 'wei:wei_registrations' pk=club.pk %}">
<button class="btn btn-block btn-info">{% trans "View unvalidated registrations..." %}</button> <button class="btn btn-block btn-info">{% trans "View unvalidated registrations..." %}</button>
</a> </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 %} {% endblock %}
{% block extrajavascript %} {% block extrajavascript %}