mirror of
https://gitlab.crans.org/bde/nk20
synced 2024-12-22 23:42:25 +00:00
Better tables
This commit is contained in:
parent
73878d03ab
commit
f83f6da79a
@ -3,7 +3,7 @@
|
||||
|
||||
from rest_framework import serializers
|
||||
|
||||
from ..models import WEIClub, Bus, BusTeam
|
||||
from ..models import WEIClub, Bus, BusTeam, WEIRole, WEIRegistration, WEIMembership
|
||||
|
||||
|
||||
class WEIClubSerializer(serializers.ModelSerializer):
|
||||
@ -37,3 +37,36 @@ class BusTeamSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = BusTeam
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
class WEIRoleSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
REST API Serializer for WEI roles.
|
||||
The djangorestframework plugin will analyse the model `WEIRole` and parse all fields in the API.
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
model = WEIRole
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
class WEIRegistrationSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
REST API Serializer for WEI registrations.
|
||||
The djangorestframework plugin will analyse the model `WEIRegistration` and parse all fields in the API.
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
model = WEIRegistration
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
class WEIMembershipSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
REST API Serializer for WEI memberships.
|
||||
The djangorestframework plugin will analyse the model `WEIMembership` and parse all fields in the API.
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
model = WEIMembership
|
||||
fields = '__all__'
|
||||
|
@ -1,7 +1,8 @@
|
||||
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from .views import WEIClubViewSet, BusViewSet, BusTeamViewSet
|
||||
from .views import WEIClubViewSet, BusViewSet, BusTeamViewSet, WEIRoleViewSet, WEIRegistrationViewSet, \
|
||||
WEIMembershipViewSet
|
||||
|
||||
|
||||
def register_wei_urls(router, path):
|
||||
@ -11,3 +12,6 @@ def register_wei_urls(router, path):
|
||||
router.register(path + '/club', WEIClubViewSet)
|
||||
router.register(path + '/bus', BusViewSet)
|
||||
router.register(path + '/team', BusTeamViewSet)
|
||||
router.register(path + '/role', WEIRoleViewSet)
|
||||
router.register(path + '/registration', WEIRegistrationViewSet)
|
||||
router.register(path + '/membership', WEIMembershipViewSet)
|
||||
|
@ -4,8 +4,9 @@ from django_filters.rest_framework import DjangoFilterBackend
|
||||
from rest_framework.filters import SearchFilter
|
||||
from api.viewsets import ReadProtectedModelViewSet
|
||||
|
||||
from .serializers import WEIClubSerializer, BusSerializer, BusTeamSerializer
|
||||
from ..models import WEIClub, Bus, BusTeam
|
||||
from .serializers import WEIClubSerializer, BusSerializer, BusTeamSerializer, WEIRoleSerializer, \
|
||||
WEIRegistrationSerializer, WEIMembershipSerializer
|
||||
from ..models import WEIClub, Bus, BusTeam, WEIRole, WEIRegistration, WEIMembership
|
||||
|
||||
|
||||
class WEIClubViewSet(ReadProtectedModelViewSet):
|
||||
@ -27,7 +28,7 @@ class BusViewSet(ReadProtectedModelViewSet):
|
||||
The djangorestframework plugin will get all `Bus` objects, serialize it to JSON with the given serializer,
|
||||
then render it on /api/wei/bus/
|
||||
"""
|
||||
queryset = Bus.objects.all()
|
||||
queryset = Bus.objects
|
||||
serializer_class = BusSerializer
|
||||
filter_backends = [SearchFilter, DjangoFilterBackend]
|
||||
search_fields = ['$name', ]
|
||||
@ -40,8 +41,46 @@ class BusTeamViewSet(ReadProtectedModelViewSet):
|
||||
The djangorestframework plugin will get all `BusTeam` objects, serialize it to JSON with the given serializer,
|
||||
then render it on /api/wei/team/
|
||||
"""
|
||||
queryset = BusTeam.objects.all()
|
||||
queryset = BusTeam.objects
|
||||
serializer_class = BusTeamSerializer
|
||||
filter_backends = [SearchFilter, DjangoFilterBackend]
|
||||
search_fields = ['$name', ]
|
||||
filterset_fields = ['name', 'bus', 'bus__wei', ]
|
||||
|
||||
|
||||
class WEIRoleViewSet(ReadProtectedModelViewSet):
|
||||
"""
|
||||
REST API View set.
|
||||
The djangorestframework plugin will get all `WEIRole` objects, serialize it to JSON with the given serializer,
|
||||
then render it on /api/wei/role/
|
||||
"""
|
||||
queryset = WEIRole.objects
|
||||
serializer_class = WEIRoleSerializer
|
||||
filter_backends = [SearchFilter]
|
||||
search_fields = ['$name', ]
|
||||
|
||||
|
||||
class WEIRegistrationViewSet(ReadProtectedModelViewSet):
|
||||
"""
|
||||
REST API View set.
|
||||
The djangorestframework plugin will get all WEIRegistration objects, serialize it to JSON with the given serializer,
|
||||
then render it on /api/wei/registration/
|
||||
"""
|
||||
queryset = WEIRegistration.objects
|
||||
serializer_class = WEIRegistrationSerializer
|
||||
filter_backends = [SearchFilter, DjangoFilterBackend]
|
||||
search_fields = ['$user__username', ]
|
||||
filterset_fields = ['user', 'wei', ]
|
||||
|
||||
|
||||
class WEIMembershipViewSet(ReadProtectedModelViewSet):
|
||||
"""
|
||||
REST API View set.
|
||||
The djangorestframework plugin will get all `BusTeam` objects, serialize it to JSON with the given serializer,
|
||||
then render it on /api/wei/membership/
|
||||
"""
|
||||
queryset = WEIMembership.objects
|
||||
serializer_class = WEIMembershipSerializer
|
||||
filter_backends = [SearchFilter, DjangoFilterBackend]
|
||||
search_fields = ['$user__username', '$bus__name', '$team__name', ]
|
||||
filterset_fields = ['user', 'club', 'bus', 'team', ]
|
||||
|
@ -77,7 +77,7 @@ class WEIRegistrationTable(tables.Table):
|
||||
}
|
||||
model = WEIRegistration
|
||||
template_name = 'django_tables2/bootstrap4.html'
|
||||
fields = ('user', 'first_year',)
|
||||
fields = ('user', 'user.first_name', 'user.last_name', 'first_year',)
|
||||
row_attrs = {
|
||||
'class': 'table-row',
|
||||
'id': lambda record: "row-" + str(record.pk),
|
||||
@ -86,13 +86,28 @@ class WEIRegistrationTable(tables.Table):
|
||||
|
||||
|
||||
class WEIMembershipTable(tables.Table):
|
||||
user = tables.LinkColumn(
|
||||
'wei:wei_update_registration',
|
||||
args=[A('registration.pk')],
|
||||
)
|
||||
|
||||
bus = tables.LinkColumn(
|
||||
'wei:manage_bus',
|
||||
args=[A('bus.pk')],
|
||||
)
|
||||
|
||||
team = tables.LinkColumn(
|
||||
'wei:manage_bus_team',
|
||||
args=[A('bus.pk')],
|
||||
)
|
||||
|
||||
class Meta:
|
||||
attrs = {
|
||||
'class': 'table table-condensed table-striped table-hover'
|
||||
}
|
||||
model = WEIMembership
|
||||
template_name = 'django_tables2/bootstrap4.html'
|
||||
fields = ('user', )
|
||||
fields = ('user', 'user.first_name', 'user.last_name', 'bus', 'team', )
|
||||
row_attrs = {
|
||||
'class': 'table-row',
|
||||
'id': lambda record: "row-" + str(record.pk),
|
||||
|
@ -4,6 +4,7 @@
|
||||
from django.urls import path
|
||||
|
||||
from .views import CurrentWEIDetailView, WEIListView, WEICreateView, WEIDetailView, WEIUpdateView,\
|
||||
WEIRegistrationsView, WEIMembershipsView,\
|
||||
BusCreateView, BusManageView, BusUpdateView, BusTeamCreateView, BusTeamManageView, BusTeamUpdateView,\
|
||||
WEIRegister1AView, WEIRegister2AView, WEIUpdateRegistrationView, WEIDeleteRegistrationView,\
|
||||
WEIValidateRegistrationView, WEISurveyView, WEISurveyEndView, WEIClosedView
|
||||
@ -16,6 +17,8 @@ urlpatterns = [
|
||||
path('create/', WEICreateView.as_view(), name="wei_create"),
|
||||
path('detail/<int:pk>/', WEIDetailView.as_view(), name="wei_detail"),
|
||||
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('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"),
|
||||
|
@ -5,6 +5,7 @@ from datetime import datetime, date
|
||||
|
||||
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.forms import HiddenInput
|
||||
from django.shortcuts import redirect
|
||||
@ -14,7 +15,7 @@ from django.utils.translation import gettext_lazy as _
|
||||
from django.views.generic.edit import BaseFormView, DeleteView
|
||||
from django_tables2 import SingleTableView
|
||||
from member.models import Membership, Club
|
||||
from note.models import Transaction, NoteClub
|
||||
from note.models import Transaction, NoteClub, Alias
|
||||
from note.tables import HistoryTable
|
||||
from permission.backends import PermissionBackend
|
||||
from permission.views import ProtectQuerysetMixin
|
||||
@ -128,6 +129,78 @@ class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
|
||||
return context
|
||||
|
||||
|
||||
class WEIMembershipsView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView):
|
||||
"""
|
||||
List all WEI memberships
|
||||
"""
|
||||
model = WEIMembership
|
||||
table_class = WEIMembershipTable
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.club = WEIClub.objects.get(pk=self.kwargs["pk"])
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_queryset(self, **kwargs):
|
||||
qs = super().get_queryset(**kwargs).filter(club=self.club)
|
||||
|
||||
pattern = self.request.GET.get("search", "")
|
||||
|
||||
if not pattern:
|
||||
return qs.none()
|
||||
|
||||
qs = qs.filter(
|
||||
Q(user__first_name__iregex=pattern)
|
||||
| Q(user__last_name__iregex=pattern)
|
||||
| Q(user__note__alias__name__iregex="^" + pattern)
|
||||
| Q(user__note__alias__normalized_name__iregex="^" + Alias.normalize(pattern))
|
||||
| Q(bus__name__iregex=pattern)
|
||||
| Q(team__name__iregex=pattern)
|
||||
)
|
||||
|
||||
return qs[:20]
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context["club"] = self.club
|
||||
context["title"] = _("Find WEI Membership")
|
||||
return context
|
||||
|
||||
|
||||
class WEIRegistrationsView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView):
|
||||
"""
|
||||
List all non-validated WEI registrations.
|
||||
"""
|
||||
model = WEIRegistration
|
||||
table_class = WEIRegistrationTable
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.club = WEIClub.objects.get(pk=self.kwargs["pk"])
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_queryset(self, **kwargs):
|
||||
qs = super().get_queryset(**kwargs).filter(wei=self.club, membership=None)
|
||||
|
||||
pattern = self.request.GET.get("search", "")
|
||||
|
||||
if not pattern:
|
||||
return qs.none()
|
||||
|
||||
qs = qs.filter(
|
||||
Q(user__first_name__iregex=pattern)
|
||||
| Q(user__last_name__iregex=pattern)
|
||||
| Q(user__note__alias__name__iregex="^" + pattern)
|
||||
| Q(user__note__alias__normalized_name__iregex="^" + Alias.normalize(pattern))
|
||||
)
|
||||
|
||||
return qs[:20]
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context["club"] = self.club
|
||||
context["title"] = _("Find WEI Registration")
|
||||
return context
|
||||
|
||||
|
||||
class WEIUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
|
||||
"""
|
||||
Update the information of the WEI.
|
||||
@ -494,7 +567,7 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update
|
||||
|
||||
def get_form(self, form_class=None):
|
||||
form = super().get_form(form_class)
|
||||
del form.fields["user"]
|
||||
form.fields["user"].disabled = True
|
||||
if not self.object.first_year:
|
||||
del form.fields["information_json"]
|
||||
return form
|
||||
@ -502,7 +575,7 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update
|
||||
def form_valid(self, form):
|
||||
# If the membership is already validated, then we update the bus and the team (and the roles)
|
||||
if form.instance.is_validated:
|
||||
membership_form = WEIMembershipForm(self.request.POST)
|
||||
membership_form = WEIMembershipForm(self.request.POST, instance=form.instance.membership)
|
||||
if not membership_form.is_valid():
|
||||
return self.form_invalid(form)
|
||||
membership_form.save()
|
||||
@ -534,14 +607,22 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update
|
||||
|
||||
|
||||
class WEIDeleteRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, DeleteView):
|
||||
"""
|
||||
Delete a non-validated WEI registration
|
||||
"""
|
||||
model = WEIRegistration
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
wei = self.get_object().wei
|
||||
object = self.get_object()
|
||||
wei = object.wei
|
||||
today = date.today()
|
||||
# We can't delete a registration of a past WEI
|
||||
if today > wei.membership_end:
|
||||
return redirect(reverse_lazy('wei:wei_closed', args=(wei.pk,)))
|
||||
|
||||
if not PermissionBackend.check_perm(self.request.user, "wei.delete_weiregistration", object):
|
||||
raise PermissionDenied
|
||||
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-21 01:01+0200\n"
|
||||
"POT-Creation-Date: 2020-04-21 17:47+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"
|
||||
@ -439,7 +439,7 @@ msgstr ""
|
||||
msgid "fee"
|
||||
msgstr ""
|
||||
|
||||
#: apps/member/models.py:267 apps/member/views.py:500 apps/wei/views.py:645
|
||||
#: apps/member/models.py:267 apps/member/views.py:500 apps/wei/views.py:726
|
||||
msgid "User is not a member of the parent club"
|
||||
msgstr ""
|
||||
|
||||
@ -482,7 +482,7 @@ msgstr ""
|
||||
msgid "Search user"
|
||||
msgstr ""
|
||||
|
||||
#: apps/member/views.py:495 apps/wei/views.py:636
|
||||
#: apps/member/views.py:495 apps/wei/views.py:717
|
||||
msgid ""
|
||||
"This user don't have enough money to join this club, and can't have a "
|
||||
"negative balance."
|
||||
@ -1000,7 +1000,7 @@ msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: apps/wei/apps.py:10 apps/wei/models.py:44 apps/wei/models.py:45
|
||||
#: apps/wei/models.py:56 apps/wei/models.py:161 templates/base.html:115
|
||||
#: apps/wei/models.py:56 apps/wei/models.py:161 templates/base.html:116
|
||||
msgid "WEI"
|
||||
msgstr ""
|
||||
|
||||
@ -1194,38 +1194,46 @@ msgstr ""
|
||||
msgid "Validate"
|
||||
msgstr ""
|
||||
|
||||
#: apps/wei/tables.py:110 templates/wei/bus_tables.html:26
|
||||
#: apps/wei/tables.py:125 templates/wei/bus_tables.html:26
|
||||
#: templates/wei/busteam_tables.html:43
|
||||
msgid "Teams"
|
||||
msgstr ""
|
||||
|
||||
#: apps/wei/views.py:336 templates/wei/weiclub_info.html:62
|
||||
#: apps/wei/views.py:165
|
||||
msgid "Find WEI Membership"
|
||||
msgstr ""
|
||||
|
||||
#: apps/wei/views.py:200
|
||||
msgid "Find WEI Registration"
|
||||
msgstr ""
|
||||
|
||||
#: apps/wei/views.py:409 templates/wei/weiclub_info.html:62
|
||||
msgid "Register 1A"
|
||||
msgstr ""
|
||||
|
||||
#: apps/wei/views.py:357 apps/wei/views.py:425
|
||||
#: apps/wei/views.py:430 apps/wei/views.py:498
|
||||
msgid "This user is already registered to this WEI."
|
||||
msgstr ""
|
||||
|
||||
#: apps/wei/views.py:362
|
||||
#: apps/wei/views.py:435
|
||||
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:390 templates/wei/weiclub_info.html:63
|
||||
#: apps/wei/views.py:463 templates/wei/weiclub_info.html:63
|
||||
msgid "Register 2A+"
|
||||
msgstr ""
|
||||
|
||||
#: apps/wei/views.py:408 apps/wei/views.py:491
|
||||
#: apps/wei/views.py:481 apps/wei/views.py:564
|
||||
msgid "You already opened an account in the Société générale."
|
||||
msgstr ""
|
||||
|
||||
#: apps/wei/views.py:640
|
||||
#: apps/wei/views.py:721
|
||||
msgid "This user didn't give her/his caution check."
|
||||
msgstr ""
|
||||
|
||||
#: apps/wei/views.py:708 apps/wei/views.py:728 apps/wei/views.py:738
|
||||
#: apps/wei/views.py:789 apps/wei/views.py:809 apps/wei/views.py:819
|
||||
#: templates/wei/survey.html:12 templates/wei/survey_closed.html:12
|
||||
#: templates/wei/survey_end.html:12
|
||||
msgid "Survey WEI"
|
||||
@ -1323,7 +1331,7 @@ msgstr ""
|
||||
msgid "Registrations"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:153
|
||||
#: templates/base.html:155
|
||||
msgid ""
|
||||
"Your e-mail address is not validated. Please check your mail inbox and click "
|
||||
"on the validation link."
|
||||
@ -1425,7 +1433,7 @@ msgstr ""
|
||||
msgid "Club listing"
|
||||
msgstr ""
|
||||
|
||||
#: templates/member/club_tables.html:7 templates/wei/weiclub_tables.html:92
|
||||
#: templates/member/club_tables.html:7
|
||||
msgid "Member of the Club"
|
||||
msgstr ""
|
||||
|
||||
@ -1892,6 +1900,10 @@ msgstr ""
|
||||
msgid "Update my registration"
|
||||
msgstr ""
|
||||
|
||||
#: templates/wei/weiclub_tables.html:92
|
||||
msgid "Members of the WEI"
|
||||
msgstr ""
|
||||
|
||||
#: templates/wei/weiclub_tables.html:120
|
||||
msgid "Unvalidated registrations"
|
||||
msgstr ""
|
||||
@ -2000,6 +2012,14 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#: templates/wei/weimembership_list.html:18
|
||||
msgid "There is no membership found with this pattern."
|
||||
msgstr ""
|
||||
|
||||
#: templates/wei/weimembership_list.html:24
|
||||
msgid "View unvalidated registrations..."
|
||||
msgstr ""
|
||||
|
||||
#: templates/wei/weiregistration_confirm_delete.html:17
|
||||
msgid "This registration is already validated and can't be deleted."
|
||||
msgstr ""
|
||||
@ -2008,5 +2028,13 @@ msgstr ""
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Are you sure you want to delete the registration of %(user)s for the WEI "
|
||||
"%(wei_name)s? This action can't be undoed."
|
||||
"%(wei_name)s? This action can't be undone."
|
||||
msgstr ""
|
||||
|
||||
#: templates/wei/weiregistration_list.html:18
|
||||
msgid "There is no pre-registration found with this pattern."
|
||||
msgstr ""
|
||||
|
||||
#: templates/wei/weiregistration_list.html:24
|
||||
msgid "View validated memberships..."
|
||||
msgstr ""
|
||||
|
@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-21 01:01+0200\n"
|
||||
"POT-Creation-Date: 2020-04-21 17:47+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"
|
||||
@ -439,7 +439,7 @@ msgstr "l'adhésion finit le"
|
||||
msgid "fee"
|
||||
msgstr "cotisation"
|
||||
|
||||
#: apps/member/models.py:267 apps/member/views.py:500 apps/wei/views.py:645
|
||||
#: apps/member/models.py:267 apps/member/views.py:500 apps/wei/views.py:726
|
||||
msgid "User is not a member of the parent club"
|
||||
msgstr "L'utilisateur n'est pas membre du club parent"
|
||||
|
||||
@ -482,7 +482,7 @@ msgstr "Un alias avec un nom similaire existe déjà."
|
||||
msgid "Search user"
|
||||
msgstr "Chercher un utilisateur"
|
||||
|
||||
#: apps/member/views.py:495 apps/wei/views.py:636
|
||||
#: apps/member/views.py:495 apps/wei/views.py:717
|
||||
msgid ""
|
||||
"This user don't have enough money to join this club, and can't have a "
|
||||
"negative balance."
|
||||
@ -1008,7 +1008,7 @@ msgid "Remove"
|
||||
msgstr "supprimer"
|
||||
|
||||
#: apps/wei/apps.py:10 apps/wei/models.py:44 apps/wei/models.py:45
|
||||
#: apps/wei/models.py:56 apps/wei/models.py:161 templates/base.html:115
|
||||
#: apps/wei/models.py:56 apps/wei/models.py:161 templates/base.html:116
|
||||
msgid "WEI"
|
||||
msgstr "WEI"
|
||||
|
||||
@ -1217,20 +1217,28 @@ msgstr "adhésions au WEI"
|
||||
msgid "Validate"
|
||||
msgstr "Valider"
|
||||
|
||||
#: apps/wei/tables.py:110 templates/wei/bus_tables.html:26
|
||||
#: apps/wei/tables.py:125 templates/wei/bus_tables.html:26
|
||||
#: templates/wei/busteam_tables.html:43
|
||||
msgid "Teams"
|
||||
msgstr "Équipes"
|
||||
|
||||
#: apps/wei/views.py:336 templates/wei/weiclub_info.html:62
|
||||
#: apps/wei/views.py:165
|
||||
msgid "Find WEI Membership"
|
||||
msgstr "Trouver une adhésion au WEI"
|
||||
|
||||
#: apps/wei/views.py:200
|
||||
msgid "Find WEI Registration"
|
||||
msgstr "Trouver une inscription au WEI"
|
||||
|
||||
#: apps/wei/views.py:409 templates/wei/weiclub_info.html:62
|
||||
msgid "Register 1A"
|
||||
msgstr "Inscrire un 1A"
|
||||
|
||||
#: apps/wei/views.py:357 apps/wei/views.py:425
|
||||
#: apps/wei/views.py:430 apps/wei/views.py:498
|
||||
msgid "This user is already registered to this WEI."
|
||||
msgstr "Cette personne est déjà inscrite au WEI."
|
||||
|
||||
#: apps/wei/views.py:362
|
||||
#: apps/wei/views.py:435
|
||||
msgid ""
|
||||
"This user can't be in her/his first year since he/she has already participed "
|
||||
"to a WEI."
|
||||
@ -1238,19 +1246,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:390 templates/wei/weiclub_info.html:63
|
||||
#: apps/wei/views.py:463 templates/wei/weiclub_info.html:63
|
||||
msgid "Register 2A+"
|
||||
msgstr "Inscrire un 2A+"
|
||||
|
||||
#: apps/wei/views.py:408 apps/wei/views.py:491
|
||||
#: apps/wei/views.py:481 apps/wei/views.py:564
|
||||
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:640
|
||||
#: apps/wei/views.py:721
|
||||
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:708 apps/wei/views.py:728 apps/wei/views.py:738
|
||||
#: apps/wei/views.py:789 apps/wei/views.py:809 apps/wei/views.py:819
|
||||
#: templates/wei/survey.html:12 templates/wei/survey_closed.html:12
|
||||
#: templates/wei/survey_end.html:12
|
||||
msgid "Survey WEI"
|
||||
@ -1348,7 +1356,7 @@ msgstr "Clubs"
|
||||
msgid "Registrations"
|
||||
msgstr "Inscriptions"
|
||||
|
||||
#: templates/base.html:153
|
||||
#: templates/base.html:155
|
||||
msgid ""
|
||||
"Your e-mail address is not validated. Please check your mail inbox and click "
|
||||
"on the validation link."
|
||||
@ -1454,7 +1462,7 @@ msgstr "Créer un club"
|
||||
msgid "Club listing"
|
||||
msgstr "Liste des clubs"
|
||||
|
||||
#: templates/member/club_tables.html:7 templates/wei/weiclub_tables.html:92
|
||||
#: templates/member/club_tables.html:7
|
||||
msgid "Member of the Club"
|
||||
msgstr "Membre du club"
|
||||
|
||||
@ -1943,6 +1951,10 @@ msgstr "M'inscrire au WEI ! – 2A+"
|
||||
msgid "Update my registration"
|
||||
msgstr "Mettre à jour mon inscription"
|
||||
|
||||
#: templates/wei/weiclub_tables.html:92
|
||||
msgid "Members of the WEI"
|
||||
msgstr "Membres du WEI"
|
||||
|
||||
#: templates/wei/weiclub_tables.html:120
|
||||
msgid "Unvalidated registrations"
|
||||
msgstr "Inscriptions non validées"
|
||||
@ -1973,15 +1985,15 @@ msgstr "chèque de caution donné"
|
||||
|
||||
#: templates/wei/weimembership_form.html:103
|
||||
msgid "preferred bus"
|
||||
msgstr ""
|
||||
msgstr "bus préféré"
|
||||
|
||||
#: templates/wei/weimembership_form.html:106
|
||||
msgid "preferred team"
|
||||
msgstr ""
|
||||
msgstr "équipe préférée"
|
||||
|
||||
#: templates/wei/weimembership_form.html:109
|
||||
msgid "preferred roles"
|
||||
msgstr ""
|
||||
msgstr "rôles préférés"
|
||||
|
||||
#: templates/wei/weimembership_form.html:117
|
||||
#: templates/wei/weiregistration_confirm_delete.html:31
|
||||
@ -2069,6 +2081,14 @@ msgstr ""
|
||||
"l'inscription au WEI.\n"
|
||||
" "
|
||||
|
||||
#: templates/wei/weimembership_list.html:18
|
||||
msgid "There is no membership found with this pattern."
|
||||
msgstr "Il n'y a pas d'adhésion trouvée avec cette entrée."
|
||||
|
||||
#: templates/wei/weimembership_list.html:24
|
||||
msgid "View unvalidated registrations..."
|
||||
msgstr "Voir les inscriptions non validées ..."
|
||||
|
||||
#: templates/wei/weiregistration_confirm_delete.html:17
|
||||
msgid "This registration is already validated and can't be deleted."
|
||||
msgstr "L'inscription a déjà été validée et ne peut pas être supprimée."
|
||||
@ -2077,7 +2097,15 @@ msgstr "L'inscription a déjà été validée et ne peut pas être supprimée."
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Are you sure you want to delete the registration of %(user)s for the WEI "
|
||||
"%(wei_name)s? This action can't be undoed."
|
||||
"%(wei_name)s? This action can't be undone."
|
||||
msgstr ""
|
||||
"Êtes-vous sûr de vouloir supprimer l'inscription de %(user)s pour le WEI "
|
||||
"%(wei_name)s ? Cette action ne pourra pas être annulée."
|
||||
|
||||
#: templates/wei/weiregistration_list.html:18
|
||||
msgid "There is no pre-registration found with this pattern."
|
||||
msgstr "Il n'y a pas de pré-inscription en attente avec cette entrée."
|
||||
|
||||
#: templates/wei/weiregistration_list.html:24
|
||||
msgid "View validated memberships..."
|
||||
msgstr "Voir les adhésions validées ..."
|
||||
|
@ -88,8 +88,8 @@
|
||||
{% if member_list.data %}
|
||||
<div class="card">
|
||||
<div class="card-header position-relative" id="clubListHeading">
|
||||
<a class="btn btn-link stretched-link font-weight-bold">
|
||||
<i class="fa fa-users"></i> {% trans "Member of the Club" %}
|
||||
<a class="btn btn-link stretched-link font-weight-bold" href="{% url "wei:wei_memberships" pk=club.pk %}">
|
||||
<i class="fa fa-users"></i> {% trans "Members of the WEI" %}
|
||||
</a>
|
||||
</div>
|
||||
{% render_table member_list %}
|
||||
@ -116,7 +116,7 @@
|
||||
{% if pre_registrations.data %}
|
||||
<div class="card">
|
||||
<div class="card-header position-relative" id="historyListHeading">
|
||||
<a class="btn btn-link stretched-link font-weight-bold">
|
||||
<a class="btn btn-link stretched-link font-weight-bold" href="{% url 'wei:wei_registrations' pk=club.pk %}">
|
||||
<i class="fa fa-user-plus"></i> {% trans "Unvalidated registrations" %}
|
||||
</a>
|
||||
</div>
|
||||
|
46
templates/wei/weimembership_list.html
Normal file
46
templates/wei/weimembership_list.html
Normal file
@ -0,0 +1,46 @@
|
||||
{% extends "member/noteowner_detail.html" %}
|
||||
{% load i18n %}
|
||||
{% load render_table from django_tables2 %}
|
||||
|
||||
{% block profile_info %}
|
||||
{% include "wei/weiclub_info.html" %}
|
||||
{% endblock %}
|
||||
|
||||
{% block profile_content %}
|
||||
<input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note/bus/équipe ...">
|
||||
<hr>
|
||||
|
||||
<div id="memberships_table">
|
||||
{% if table.data %}
|
||||
{% render_table table %}
|
||||
{% else %}
|
||||
<div class="alert alert-warning">
|
||||
{% trans "There is no membership found with this pattern." %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<a href="{% url 'wei:wei_registrations' pk=club.pk %}">
|
||||
<button class="btn btn-block btn-info">{% trans "View unvalidated registrations..." %}</button>
|
||||
</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block extrajavascript %}
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
let old_pattern = null;
|
||||
let searchbar_obj = $("#searchbar");
|
||||
|
||||
function reloadTable() {
|
||||
let pattern = searchbar_obj.val();
|
||||
|
||||
if (pattern === old_pattern)
|
||||
return;
|
||||
|
||||
$("#memberships_table").load(location.pathname + "?search=" + pattern.replace(" ", "%20") + " #memberships_table");
|
||||
}
|
||||
|
||||
searchbar_obj.keyup(reloadTable);
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
@ -21,7 +21,7 @@
|
||||
<div class="card-body">
|
||||
<div class="alert alert-warning">
|
||||
{% with user=object.user wei_name=object.wei.name %}
|
||||
{% blocktrans %}Are you sure you want to delete the registration of {{ user }} for the WEI {{ wei_name }}? This action can't be undoed.{% endblocktrans %}
|
||||
{% blocktrans %}Are you sure you want to delete the registration of {{ user }} for the WEI {{ wei_name }}? This action can't be undone.{% endblocktrans %}
|
||||
{% endwith %}
|
||||
</div>
|
||||
</div>
|
||||
|
46
templates/wei/weiregistration_list.html
Normal file
46
templates/wei/weiregistration_list.html
Normal file
@ -0,0 +1,46 @@
|
||||
{% extends "member/noteowner_detail.html" %}
|
||||
{% load i18n %}
|
||||
{% load render_table from django_tables2 %}
|
||||
|
||||
{% block profile_info %}
|
||||
{% include "wei/weiclub_info.html" %}
|
||||
{% endblock %}
|
||||
|
||||
{% block profile_content %}
|
||||
<input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note ...">
|
||||
<hr>
|
||||
|
||||
<div id="registrations_table">
|
||||
{% if table.data %}
|
||||
{% render_table table %}
|
||||
{% else %}
|
||||
<div class="alert alert-warning">
|
||||
{% trans "There is no pre-registration found with this pattern." %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<a href="{% url 'wei:wei_memberships' pk=club.pk %}">
|
||||
<button class="btn btn-block btn-info">{% trans "View validated memberships..." %}</button>
|
||||
</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block extrajavascript %}
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
let old_pattern = null;
|
||||
let searchbar_obj = $("#searchbar");
|
||||
|
||||
function reloadTable() {
|
||||
let pattern = searchbar_obj.val();
|
||||
|
||||
if (pattern === old_pattern)
|
||||
return;
|
||||
|
||||
$("#registrations_table").load(location.pathname + "?search=" + pattern.replace(" ", "%20") + " #registrations_table");
|
||||
}
|
||||
|
||||
searchbar_obj.keyup(reloadTable);
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
Loading…
Reference in New Issue
Block a user