Filter members

This commit is contained in:
Yohann D'ANELLO 2020-07-31 17:01:52 +02:00
parent bd35e4e21e
commit fd705adb05
6 changed files with 242 additions and 108 deletions

View File

@ -130,3 +130,31 @@ class MembershipTable(tables.Table):
template_name = 'django_tables2/bootstrap4.html' template_name = 'django_tables2/bootstrap4.html'
fields = ('user', 'club', 'date_start', 'date_end', 'roles', 'fee', ) fields = ('user', 'club', 'date_start', 'date_end', 'roles', 'fee', )
model = Membership model = Membership
class ClubManagerTable(tables.Table):
"""
List managers of a club.
"""
def render_user(self, value):
# If the user has the right, link the displayed user with the page of its detail.
s = value.username
if PermissionBackend.check_perm(get_current_authenticated_user(), "auth.view_user", value):
s = format_html("<a href={url}>{name}</a>",
url=reverse_lazy('member:user_detail', kwargs={"pk": value.pk}), name=s)
return s
def render_roles(self, record):
roles = record.roles.all()
return ", ".join(str(role) for role in roles)
class Meta:
attrs = {
'class': 'table table-condensed table-striped table-hover',
'style': 'table-layout: fixed;'
}
template_name = 'django_tables2/bootstrap4.html'
fields = ('user', 'user.first_name', 'user.last_name', 'roles', )
model = Membership

View File

@ -30,7 +30,7 @@ from permission.views import ProtectQuerysetMixin
from .forms import ProfileForm, ClubForm, MembershipForm, CustomAuthenticationForm, UserForm, MembershipRolesForm from .forms import ProfileForm, ClubForm, MembershipForm, CustomAuthenticationForm, UserForm, MembershipRolesForm
from .models import Club, Membership from .models import Club, Membership
from .tables import ClubTable, UserTable, MembershipTable from .tables import ClubTable, UserTable, MembershipTable, ClubManagerTable
class CustomLoginView(LoginView): class CustomLoginView(LoginView):
@ -338,6 +338,10 @@ class ClubDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
if PermissionBackend.check_perm(self.request.user, "member.change_club_membership_start", club): if PermissionBackend.check_perm(self.request.user, "member.change_club_membership_start", club):
club.update_membership_dates() club.update_membership_dates()
managers = Membership.objects.filter(club=self.object, roles__name="Bureau de club")\
.order_by('user__last_name').all()
context["managers"] = ClubManagerTable(data=managers, prefix="managers-")
club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note))\ club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note))\
.filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view"))\ .filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view"))\
.order_by('-created_at') .order_by('-created_at')
@ -672,21 +676,33 @@ class ClubMembersListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableV
Q(user__note__alias__normalized_name__iregex='^' + Alias.normalize(pattern)) Q(user__note__alias__normalized_name__iregex='^' + Alias.normalize(pattern))
) )
if 'only_active' in self.request.GET: only_active = "only_active" not in self.request.GET or self.request.GET["only_active"] != '0'
only_active = self.request.GET["only_active"] != '0'
else:
only_active = True
if only_active: if only_active:
qs = qs.filter(date_start__lte=timezone.now().today(), date_end__gte=timezone.now().today()) qs = qs.filter(date_start__lte=timezone.now().today(), date_end__gte=timezone.now().today())
if "roles" in self.request.GET:
if not self.request.GET["roles"]:
return qs.none()
roles_str = self.request.GET["roles"].replace(' ', '').split(',')
roles_int = map(int, roles_str)
qs = qs.filter(roles__in=roles_int)
qs = qs.order_by('-date_start', 'user__username') qs = qs.order_by('-date_start', 'user__username')
return qs.distinct() return qs.distinct()
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["club"] = Club.objects.filter( club = Club.objects.filter(
PermissionBackend.filter_queryset(self.request.user, Club, "view") PermissionBackend.filter_queryset(self.request.user, Club, "view")
).get(pk=self.kwargs["pk"]) ).get(pk=self.kwargs["pk"])
context["club"] = club
applicable_roles = Role.objects.filter(Q(weirole__isnull=not hasattr(club, 'weiclub'))
& (Q(for_club__isnull=True) | Q(for_club=club))).all()
context["applicable_roles"] = applicable_roles
context["only_active"] = "only_active" not in self.request.GET or self.request.GET["only_active"] != '0'
return context return context

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-07-30 17:22+0200\n" "POT-Creation-Date: 2020-07-31 17:00+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"
@ -186,12 +186,12 @@ msgstr ""
msgid "Type" msgid "Type"
msgstr "" msgstr ""
#: apps/activity/tables.py:77 apps/member/forms.py:104 #: apps/activity/tables.py:77 apps/member/forms.py:102
#: apps/registration/forms.py:64 apps/treasury/forms.py:120 #: apps/registration/forms.py:64 apps/treasury/forms.py:120
msgid "Last name" msgid "Last name"
msgstr "" msgstr ""
#: apps/activity/tables.py:79 apps/member/forms.py:109 #: apps/activity/tables.py:79 apps/member/forms.py:107
#: apps/registration/forms.py:69 apps/treasury/forms.py:122 #: apps/registration/forms.py:69 apps/treasury/forms.py:122
#: templates/note/transaction_form.html:126 #: templates/note/transaction_form.html:126
msgid "First name" msgid "First name"
@ -261,12 +261,12 @@ msgstr ""
msgid "create" msgid "create"
msgstr "" msgstr ""
#: apps/logs/models.py:61 apps/note/tables.py:143 #: apps/logs/models.py:61 apps/note/tables.py:161
#: templates/activity/activity_detail.html:67 #: templates/activity/activity_detail.html:67
msgid "edit" msgid "edit"
msgstr "" msgstr ""
#: apps/logs/models.py:62 apps/note/tables.py:120 apps/note/tables.py:148 #: apps/logs/models.py:62 apps/note/tables.py:138 apps/note/tables.py:166
#: apps/wei/tables.py:65 #: apps/wei/tables.py:65
msgid "delete" msgid "delete"
msgstr "" msgstr ""
@ -295,39 +295,47 @@ msgstr ""
msgid "member" msgid "member"
msgstr "" msgstr ""
#: apps/member/forms.py:58 apps/member/views.py:81 #: apps/member/forms.py:58 apps/member/views.py:82
msgid "An alias with a similar name already exists." msgid "An alias with a similar name already exists."
msgstr "" msgstr ""
#: apps/member/forms.py:83 apps/registration/forms.py:44 #: apps/member/forms.py:81 apps/registration/forms.py:44
msgid "Inscription paid by Société Générale" msgid "Inscription paid by Société Générale"
msgstr "" msgstr ""
#: apps/member/forms.py:85 apps/registration/forms.py:46 #: apps/member/forms.py:83 apps/registration/forms.py:46
msgid "Check this case is the Société Générale paid the inscription." msgid "Check this case is the Société Générale paid the inscription."
msgstr "" msgstr ""
#: apps/member/forms.py:90 apps/registration/forms.py:51 #: apps/member/forms.py:88 apps/registration/forms.py:51
msgid "Credit type" msgid "Credit type"
msgstr "" msgstr ""
#: apps/member/forms.py:91 apps/registration/forms.py:52 #: apps/member/forms.py:89 apps/registration/forms.py:52
msgid "No credit" msgid "No credit"
msgstr "" msgstr ""
#: apps/member/forms.py:93 #: apps/member/forms.py:91
msgid "You can credit the note of the user." msgid "You can credit the note of the user."
msgstr "" msgstr ""
#: apps/member/forms.py:97 apps/registration/forms.py:57 #: apps/member/forms.py:95 apps/registration/forms.py:57
msgid "Credit amount" msgid "Credit amount"
msgstr "" msgstr ""
#: apps/member/forms.py:114 apps/registration/forms.py:74 #: apps/member/forms.py:112 apps/registration/forms.py:74
#: apps/treasury/forms.py:124 templates/note/transaction_form.html:132 #: apps/treasury/forms.py:124 templates/note/transaction_form.html:132
msgid "Bank" msgid "Bank"
msgstr "" msgstr ""
#: apps/member/forms.py:138
msgid "User"
msgstr ""
#: apps/member/forms.py:152
msgid "Roles"
msgstr ""
#: apps/member/models.py:34 #: apps/member/models.py:34
#: templates/registration/future_profile_detail.html:40 #: templates/registration/future_profile_detail.html:40
#: templates/wei/weimembership_form.html:48 #: templates/wei/weimembership_form.html:48
@ -525,7 +533,7 @@ msgstr ""
msgid "fee" msgid "fee"
msgstr "" msgstr ""
#: apps/member/models.py:303 apps/member/views.py:535 apps/wei/views.py:787 #: apps/member/models.py:303 apps/member/views.py:534 apps/wei/views.py:787
msgid "User is not a member of the parent club" msgid "User is not a member of the parent club"
msgstr "" msgstr ""
@ -534,7 +542,7 @@ msgstr ""
msgid "The role {role} does not apply to the club {club}." msgid "The role {role} does not apply to the club {club}."
msgstr "" msgstr ""
#: apps/member/models.py:321 apps/member/views.py:544 #: apps/member/models.py:321 apps/member/views.py:543
msgid "User is already a member of the club" msgid "User is already a member of the club"
msgstr "" msgstr ""
@ -555,80 +563,84 @@ msgstr ""
msgid "Renew" msgid "Renew"
msgstr "" msgstr ""
#: apps/member/views.py:56 templates/member/profile_info.html:47 #: apps/member/views.py:57 templates/member/profile_info.html:47
#: templates/registration/future_profile_detail.html:48 #: templates/registration/future_profile_detail.html:48
#: templates/wei/weimembership_form.html:130 #: templates/wei/weimembership_form.html:130
msgid "Update Profile" msgid "Update Profile"
msgstr "" msgstr ""
#: apps/member/views.py:69 apps/registration/forms.py:23 #: apps/member/views.py:70 apps/registration/forms.py:23
msgid "This address must be valid." msgid "This address must be valid."
msgstr "" msgstr ""
#: apps/member/views.py:126 #: apps/member/views.py:127
msgid "Profile detail" msgid "Profile detail"
msgstr "" msgstr ""
#: apps/member/views.py:160 #: apps/member/views.py:161
msgid "Search user" msgid "Search user"
msgstr "" msgstr ""
#: apps/member/views.py:194 apps/member/views.py:376 #: apps/member/views.py:195 apps/member/views.py:381
msgid "Note aliases" msgid "Note aliases"
msgstr "" msgstr ""
#: apps/member/views.py:208 #: apps/member/views.py:209
msgid "Update note picture" msgid "Update note picture"
msgstr "" msgstr ""
#: apps/member/views.py:266 templates/member/profile_info.html:43 #: apps/member/views.py:267 templates/member/profile_info.html:43
msgid "Manage auth token" msgid "Manage auth token"
msgstr "" msgstr ""
#: apps/member/views.py:294 #: apps/member/views.py:295
msgid "Create new club" msgid "Create new club"
msgstr "" msgstr ""
#: apps/member/views.py:306 #: apps/member/views.py:307
msgid "Search club" msgid "Search club"
msgstr "" msgstr ""
#: apps/member/views.py:331 #: apps/member/views.py:332
msgid "Club detail" msgid "Club detail"
msgstr "" msgstr ""
#: apps/member/views.py:393 #: apps/member/views.py:398
msgid "Update club" msgid "Update club"
msgstr "" msgstr ""
#: apps/member/views.py:427 #: apps/member/views.py:432
msgid "Add new member to the club" msgid "Add new member to the club"
msgstr "" msgstr ""
#: apps/member/views.py:530 apps/wei/views.py:778 #: apps/member/views.py:529 apps/wei/views.py:778
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."
msgstr "" msgstr ""
#: apps/member/views.py:548 #: apps/member/views.py:547
msgid "The membership must start after {:%m-%d-%Y}." msgid "The membership must start after {:%m-%d-%Y}."
msgstr "" msgstr ""
#: apps/member/views.py:553 #: apps/member/views.py:552
msgid "The membership must begin before {:%m-%d-%Y}." msgid "The membership must begin before {:%m-%d-%Y}."
msgstr "" msgstr ""
#: apps/member/views.py:570 apps/member/views.py:572 apps/member/views.py:574 #: apps/member/views.py:569 apps/member/views.py:571 apps/member/views.py:573
#: apps/registration/views.py:295 apps/registration/views.py:297 #: apps/registration/views.py:295 apps/registration/views.py:297
#: apps/registration/views.py:299 #: apps/registration/views.py:299
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: apps/member/views.py:634 #: apps/member/views.py:641
msgid "Manage roles of an user in the club" msgid "Manage roles of an user in the club"
msgstr "" msgstr ""
#: apps/member/views.py:666
msgid "Members of the club"
msgstr ""
#: apps/note/admin.py:121 apps/note/models/transactions.py:106 #: apps/note/admin.py:121 apps/note/models/transactions.py:106
msgid "source" msgid "source"
msgstr "" msgstr ""
@ -784,7 +796,7 @@ msgid "transaction templates"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:112 apps/note/models/transactions.py:125 #: apps/note/models/transactions.py:112 apps/note/models/transactions.py:125
#: apps/note/tables.py:33 apps/note/tables.py:42 #: apps/note/tables.py:35 apps/note/tables.py:44
msgid "used alias" msgid "used alias"
msgstr "" msgstr ""
@ -796,7 +808,7 @@ msgstr ""
msgid "reason" msgid "reason"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:151 apps/note/tables.py:95 #: apps/note/models/transactions.py:151 apps/note/tables.py:113
msgid "invalidity reason" msgid "invalidity reason"
msgstr "" msgstr ""
@ -858,25 +870,25 @@ msgstr ""
msgid "membership transactions" msgid "membership transactions"
msgstr "" msgstr ""
#: apps/note/tables.py:57 #: apps/note/tables.py:63
msgid "Click to invalidate" msgid "Click to invalidate"
msgstr "" msgstr ""
#: apps/note/tables.py:57 #: apps/note/tables.py:63
msgid "Click to validate" msgid "Click to validate"
msgstr "" msgstr ""
#: apps/note/tables.py:93 #: apps/note/tables.py:111
msgid "No reason specified" msgid "No reason specified"
msgstr "" msgstr ""
#: apps/note/tables.py:122 apps/note/tables.py:150 apps/wei/tables.py:66 #: apps/note/tables.py:140 apps/note/tables.py:168 apps/wei/tables.py:66
#: templates/treasury/sogecredit_detail.html:59 #: templates/treasury/sogecredit_detail.html:59
#: templates/wei/weiregistration_confirm_delete.html:32 #: templates/wei/weiregistration_confirm_delete.html:32
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
#: apps/note/tables.py:145 apps/wei/tables.py:42 apps/wei/tables.py:43 #: apps/note/tables.py:163 apps/wei/tables.py:42 apps/wei/tables.py:43
#: templates/member/club_info.html:67 templates/note/conso_form.html:128 #: templates/member/club_info.html:67 templates/note/conso_form.html:128
#: templates/wei/bus_tables.html:15 templates/wei/busteam_tables.html:15 #: templates/wei/bus_tables.html:15 templates/wei/busteam_tables.html:15
#: templates/wei/busteam_tables.html:33 templates/wei/weiclub_info.html:68 #: templates/wei/busteam_tables.html:33 templates/wei/weiclub_info.html:68
@ -1828,11 +1840,28 @@ msgstr ""
msgid "Club listing" msgid "Club listing"
msgstr "" msgstr ""
#: templates/member/club_members.html:16
msgid "Display only active memberships"
msgstr ""
#: templates/member/club_members.html:21
msgid "Filter roles:"
msgstr ""
#: templates/member/club_members.html:37
#: templates/wei/weimembership_list.html:18
msgid "There is no membership found with this pattern."
msgstr ""
#: templates/member/club_tables.html:7 #: templates/member/club_tables.html:7
msgid "Club managers"
msgstr ""
#: templates/member/club_tables.html:20
msgid "Club members" msgid "Club members"
msgstr "" msgstr ""
#: templates/member/club_tables.html:20 templates/member/profile_tables.html:28 #: templates/member/club_tables.html:33 templates/member/profile_tables.html:28
#: templates/wei/weiclub_tables.html:105 #: templates/wei/weiclub_tables.html:105
msgid "Transaction history" msgid "Transaction history"
msgstr "" msgstr ""
@ -2469,10 +2498,6 @@ msgid ""
" " " "
msgstr "" msgstr ""
#: templates/wei/weimembership_list.html:18
msgid "There is no membership found with this pattern."
msgstr ""
#: templates/wei/weimembership_list.html:24 #: templates/wei/weimembership_list.html:24
msgid "View unvalidated registrations..." msgid "View unvalidated registrations..."
msgstr "" msgstr ""

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-07-30 17:22+0200\n" "POT-Creation-Date: 2020-07-31 17:00+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"
@ -187,12 +187,12 @@ msgstr "supprimer"
msgid "Type" msgid "Type"
msgstr "Type" msgstr "Type"
#: apps/activity/tables.py:77 apps/member/forms.py:104 #: apps/activity/tables.py:77 apps/member/forms.py:102
#: apps/registration/forms.py:64 apps/treasury/forms.py:120 #: apps/registration/forms.py:64 apps/treasury/forms.py:120
msgid "Last name" msgid "Last name"
msgstr "Nom de famille" msgstr "Nom de famille"
#: apps/activity/tables.py:79 apps/member/forms.py:109 #: apps/activity/tables.py:79 apps/member/forms.py:107
#: apps/registration/forms.py:69 apps/treasury/forms.py:122 #: apps/registration/forms.py:69 apps/treasury/forms.py:122
#: templates/note/transaction_form.html:126 #: templates/note/transaction_form.html:126
msgid "First name" msgid "First name"
@ -262,12 +262,12 @@ msgstr "Nouvelles données"
msgid "create" msgid "create"
msgstr "Créer" msgstr "Créer"
#: apps/logs/models.py:61 apps/note/tables.py:143 #: apps/logs/models.py:61 apps/note/tables.py:161
#: templates/activity/activity_detail.html:67 #: templates/activity/activity_detail.html:67
msgid "edit" msgid "edit"
msgstr "Modifier" msgstr "Modifier"
#: apps/logs/models.py:62 apps/note/tables.py:120 apps/note/tables.py:148 #: apps/logs/models.py:62 apps/note/tables.py:138 apps/note/tables.py:166
#: apps/wei/tables.py:65 #: apps/wei/tables.py:65
msgid "delete" msgid "delete"
msgstr "Supprimer" msgstr "Supprimer"
@ -296,39 +296,47 @@ msgstr "journaux de modifications"
msgid "member" msgid "member"
msgstr "adhérent" msgstr "adhérent"
#: apps/member/forms.py:58 apps/member/views.py:81 #: apps/member/forms.py:58 apps/member/views.py:82
msgid "An alias with a similar name already exists." msgid "An alias with a similar name already exists."
msgstr "Un alias avec un nom similaire existe déjà." msgstr "Un alias avec un nom similaire existe déjà."
#: apps/member/forms.py:83 apps/registration/forms.py:44 #: apps/member/forms.py:81 apps/registration/forms.py:44
msgid "Inscription paid by Société Générale" msgid "Inscription paid by Société Générale"
msgstr "Inscription payée par la Société générale" msgstr "Inscription payée par la Société générale"
#: apps/member/forms.py:85 apps/registration/forms.py:46 #: apps/member/forms.py:83 apps/registration/forms.py:46
msgid "Check this case is the Société Générale paid the inscription." msgid "Check this case is the Société Générale paid the inscription."
msgstr "Cochez cette case si la Société Générale a payé l'inscription." msgstr "Cochez cette case si la Société Générale a payé l'inscription."
#: apps/member/forms.py:90 apps/registration/forms.py:51 #: apps/member/forms.py:88 apps/registration/forms.py:51
msgid "Credit type" msgid "Credit type"
msgstr "Type de rechargement" msgstr "Type de rechargement"
#: apps/member/forms.py:91 apps/registration/forms.py:52 #: apps/member/forms.py:89 apps/registration/forms.py:52
msgid "No credit" msgid "No credit"
msgstr "Pas de rechargement" msgstr "Pas de rechargement"
#: apps/member/forms.py:93 #: apps/member/forms.py:91
msgid "You can credit the note of the user." msgid "You can credit the note of the user."
msgstr "Vous pouvez créditer la note de l'utisateur avant l'adhésion." msgstr "Vous pouvez créditer la note de l'utisateur avant l'adhésion."
#: apps/member/forms.py:97 apps/registration/forms.py:57 #: apps/member/forms.py:95 apps/registration/forms.py:57
msgid "Credit amount" msgid "Credit amount"
msgstr "Montant à créditer" msgstr "Montant à créditer"
#: apps/member/forms.py:114 apps/registration/forms.py:74 #: apps/member/forms.py:112 apps/registration/forms.py:74
#: apps/treasury/forms.py:124 templates/note/transaction_form.html:132 #: apps/treasury/forms.py:124 templates/note/transaction_form.html:132
msgid "Bank" msgid "Bank"
msgstr "Banque" msgstr "Banque"
#: apps/member/forms.py:138
msgid "User"
msgstr "Utilisateur"
#: apps/member/forms.py:152
msgid "Roles"
msgstr "Rôles"
#: apps/member/models.py:34 #: apps/member/models.py:34
#: templates/registration/future_profile_detail.html:40 #: templates/registration/future_profile_detail.html:40
#: templates/wei/weimembership_form.html:48 #: templates/wei/weimembership_form.html:48
@ -530,7 +538,7 @@ msgstr "l'adhésion finit le"
msgid "fee" msgid "fee"
msgstr "cotisation" msgstr "cotisation"
#: apps/member/models.py:303 apps/member/views.py:535 apps/wei/views.py:787 #: apps/member/models.py:303 apps/member/views.py:534 apps/wei/views.py:787
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"
@ -539,7 +547,7 @@ msgstr "L'utilisateur n'est pas membre du club parent"
msgid "The role {role} does not apply to the club {club}." msgid "The role {role} does not apply to the club {club}."
msgstr "Le rôle {role} ne s'applique pas au club {club}." msgstr "Le rôle {role} ne s'applique pas au club {club}."
#: apps/member/models.py:321 apps/member/views.py:544 #: apps/member/models.py:321 apps/member/views.py:543
msgid "User is already a member of the club" msgid "User is already a member of the club"
msgstr "L'utilisateur est déjà membre du club" msgstr "L'utilisateur est déjà membre du club"
@ -560,57 +568,57 @@ msgstr "adhésions"
msgid "Renew" msgid "Renew"
msgstr "Renouveler" msgstr "Renouveler"
#: apps/member/views.py:56 templates/member/profile_info.html:47 #: apps/member/views.py:57 templates/member/profile_info.html:47
#: templates/registration/future_profile_detail.html:48 #: templates/registration/future_profile_detail.html:48
#: templates/wei/weimembership_form.html:130 #: templates/wei/weimembership_form.html:130
msgid "Update Profile" msgid "Update Profile"
msgstr "Modifier le profil" msgstr "Modifier le profil"
#: apps/member/views.py:69 apps/registration/forms.py:23 #: apps/member/views.py:70 apps/registration/forms.py:23
msgid "This address must be valid." msgid "This address must be valid."
msgstr "Cette adresse doit être valide." msgstr "Cette adresse doit être valide."
#: apps/member/views.py:126 #: apps/member/views.py:127
msgid "Profile detail" msgid "Profile detail"
msgstr "Détails de l'utilisateur" msgstr "Détails de l'utilisateur"
#: apps/member/views.py:160 #: apps/member/views.py:161
msgid "Search user" msgid "Search user"
msgstr "Chercher un utilisateur" msgstr "Chercher un utilisateur"
#: apps/member/views.py:194 apps/member/views.py:376 #: apps/member/views.py:195 apps/member/views.py:381
msgid "Note aliases" msgid "Note aliases"
msgstr "Alias de la note" msgstr "Alias de la note"
#: apps/member/views.py:208 #: apps/member/views.py:209
msgid "Update note picture" msgid "Update note picture"
msgstr "Modifier la photo de la note" msgstr "Modifier la photo de la note"
#: apps/member/views.py:266 templates/member/profile_info.html:43 #: apps/member/views.py:267 templates/member/profile_info.html:43
msgid "Manage auth token" msgid "Manage auth token"
msgstr "Gérer les jetons d'authentification" msgstr "Gérer les jetons d'authentification"
#: apps/member/views.py:294 #: apps/member/views.py:295
msgid "Create new club" msgid "Create new club"
msgstr "Créer un nouveau club" msgstr "Créer un nouveau club"
#: apps/member/views.py:306 #: apps/member/views.py:307
msgid "Search club" msgid "Search club"
msgstr "Chercher un club" msgstr "Chercher un club"
#: apps/member/views.py:331 #: apps/member/views.py:332
msgid "Club detail" msgid "Club detail"
msgstr "Détails du club" msgstr "Détails du club"
#: apps/member/views.py:393 #: apps/member/views.py:398
msgid "Update club" msgid "Update club"
msgstr "Modifier le club" msgstr "Modifier le club"
#: apps/member/views.py:427 #: apps/member/views.py:432
msgid "Add new member to the club" msgid "Add new member to the club"
msgstr "Ajouter un nouveau membre au club" msgstr "Ajouter un nouveau membre au club"
#: apps/member/views.py:530 apps/wei/views.py:778 #: apps/member/views.py:529 apps/wei/views.py:778
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."
@ -618,24 +626,28 @@ msgstr ""
"Cet utilisateur n'a pas assez d'argent pour rejoindre ce club et ne peut pas " "Cet utilisateur n'a pas assez d'argent pour rejoindre ce club et ne peut pas "
"avoir un solde négatif." "avoir un solde négatif."
#: apps/member/views.py:548 #: apps/member/views.py:547
msgid "The membership must start after {:%m-%d-%Y}." msgid "The membership must start after {:%m-%d-%Y}."
msgstr "L'adhésion doit commencer après le {:%d/%m/%Y}." msgstr "L'adhésion doit commencer après le {:%d/%m/%Y}."
#: apps/member/views.py:553 #: apps/member/views.py:552
msgid "The membership must begin before {:%m-%d-%Y}." 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:570 apps/member/views.py:572 apps/member/views.py:574 #: apps/member/views.py:569 apps/member/views.py:571 apps/member/views.py:573
#: apps/registration/views.py:295 apps/registration/views.py:297 #: apps/registration/views.py:295 apps/registration/views.py:297
#: apps/registration/views.py:299 #: apps/registration/views.py:299
msgid "This field is required." msgid "This field is required."
msgstr "Ce champ est requis." msgstr "Ce champ est requis."
#: apps/member/views.py:634 #: apps/member/views.py:641
msgid "Manage roles of an user in the club" msgid "Manage roles of an user in the club"
msgstr "Gérer les rôles d'un utilisateur dans le club" msgstr "Gérer les rôles d'un utilisateur dans le club"
#: apps/member/views.py:666
msgid "Members of the club"
msgstr "Membres du club"
#: apps/note/admin.py:121 apps/note/models/transactions.py:106 #: apps/note/admin.py:121 apps/note/models/transactions.py:106
msgid "source" msgid "source"
msgstr "source" msgstr "source"
@ -792,7 +804,7 @@ msgid "transaction templates"
msgstr "modèles de transaction" msgstr "modèles de transaction"
#: apps/note/models/transactions.py:112 apps/note/models/transactions.py:125 #: apps/note/models/transactions.py:112 apps/note/models/transactions.py:125
#: apps/note/tables.py:33 apps/note/tables.py:42 #: apps/note/tables.py:35 apps/note/tables.py:44
msgid "used alias" msgid "used alias"
msgstr "alias utilisé" msgstr "alias utilisé"
@ -804,7 +816,7 @@ msgstr "quantité"
msgid "reason" msgid "reason"
msgstr "raison" msgstr "raison"
#: apps/note/models/transactions.py:151 apps/note/tables.py:95 #: apps/note/models/transactions.py:151 apps/note/tables.py:113
msgid "invalidity reason" msgid "invalidity reason"
msgstr "Motif d'invalidité" msgstr "Motif d'invalidité"
@ -870,25 +882,25 @@ msgstr "Transaction d'adhésion"
msgid "membership transactions" msgid "membership transactions"
msgstr "Transactions d'adhésion" msgstr "Transactions d'adhésion"
#: apps/note/tables.py:57 #: apps/note/tables.py:63
msgid "Click to invalidate" msgid "Click to invalidate"
msgstr "Cliquez pour dévalider" msgstr "Cliquez pour dévalider"
#: apps/note/tables.py:57 #: apps/note/tables.py:63
msgid "Click to validate" msgid "Click to validate"
msgstr "Cliquez pour valider" msgstr "Cliquez pour valider"
#: apps/note/tables.py:93 #: apps/note/tables.py:111
msgid "No reason specified" msgid "No reason specified"
msgstr "Pas de motif spécifié" msgstr "Pas de motif spécifié"
#: apps/note/tables.py:122 apps/note/tables.py:150 apps/wei/tables.py:66 #: apps/note/tables.py:140 apps/note/tables.py:168 apps/wei/tables.py:66
#: templates/treasury/sogecredit_detail.html:59 #: templates/treasury/sogecredit_detail.html:59
#: templates/wei/weiregistration_confirm_delete.html:32 #: templates/wei/weiregistration_confirm_delete.html:32
msgid "Delete" msgid "Delete"
msgstr "Supprimer" msgstr "Supprimer"
#: apps/note/tables.py:145 apps/wei/tables.py:42 apps/wei/tables.py:43 #: apps/note/tables.py:163 apps/wei/tables.py:42 apps/wei/tables.py:43
#: templates/member/club_info.html:67 templates/note/conso_form.html:128 #: templates/member/club_info.html:67 templates/note/conso_form.html:128
#: templates/wei/bus_tables.html:15 templates/wei/busteam_tables.html:15 #: templates/wei/bus_tables.html:15 templates/wei/busteam_tables.html:15
#: templates/wei/busteam_tables.html:33 templates/wei/weiclub_info.html:68 #: templates/wei/busteam_tables.html:33 templates/wei/weiclub_info.html:68
@ -1888,11 +1900,28 @@ msgstr "Créer un club"
msgid "Club listing" msgid "Club listing"
msgstr "Liste des clubs" msgstr "Liste des clubs"
#: templates/member/club_members.html:16
msgid "Display only active memberships"
msgstr "N'afficher que les adhésions encore valides"
#: templates/member/club_members.html:21
msgid "Filter roles:"
msgstr "Filtrer par rôle :"
#: templates/member/club_members.html:37
#: 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/member/club_tables.html:7 #: templates/member/club_tables.html:7
msgid "Club managers"
msgstr "Bureau du club"
#: templates/member/club_tables.html:20
msgid "Club members" msgid "Club members"
msgstr "Membres du club" msgstr "Membres du club"
#: templates/member/club_tables.html:20 templates/member/profile_tables.html:28 #: templates/member/club_tables.html:33 templates/member/profile_tables.html:28
#: templates/wei/weiclub_tables.html:105 #: templates/wei/weiclub_tables.html:105
msgid "Transaction history" msgid "Transaction history"
msgstr "Historique des transactions" msgstr "Historique des transactions"
@ -2591,10 +2620,6 @@ msgstr ""
"l'inscription au WEI.\n" "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 #: templates/wei/weimembership_list.html:24
msgid "View unvalidated registrations..." msgid "View unvalidated registrations..."
msgstr "Voir les inscriptions non validées ..." msgstr "Voir les inscriptions non validées ..."

View File

@ -3,11 +3,30 @@
{% load render_table from django_tables2 %} {% load render_table from django_tables2 %}
{% block profile_info %} {% block profile_info %}
{% include "member/club_info.html" %} {% include "member/club_info.html" %}
{% endblock %} {% endblock %}
{% block profile_content %} {% block profile_content %}
<input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note ..."> <input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note ...">
<div class="form-group">
<div class="form-check">
<label class="form-check-label" for="only_active">
<input type="checkbox" class="checkboxinput form-check-input" id="only_active"
{% if only_active %}checked{% endif %}>
{% trans "Display only active memberships" %}
</label>
</div>
</div>
<div id="div_id_roles" class="form-group">
<label for="id_roles" class="col-form-label">{% trans "Filter roles:" %}</label>
<div class="">
<select name="roles" class="selectmultiple form-control" id="roles" multiple="">
{% for role in applicable_roles %}
<option value="{{ role.id }}" selected>{{ role.name }}</option>
{% endfor %}
</select>
</div>
</div>
<hr> <hr>
<div id="memberships_table"> <div id="memberships_table">
@ -22,21 +41,29 @@
{% endblock %} {% endblock %}
{% block extrajavascript %} {% block extrajavascript %}
<script type="text/javascript"> <script type="text/javascript">
$(document).ready(function() { $(document).ready(function () {
let old_pattern = null;
let searchbar_obj = $("#searchbar"); let searchbar_obj = $("#searchbar");
let only_active_obj = $("#only_active");
let roles_obj = $("#roles");
function reloadTable() { function reloadTable() {
let pattern = searchbar_obj.val(); let pattern = searchbar_obj.val();
if (pattern === old_pattern) let roles = [];
return; $("#roles option:selected").each(function() {
roles.push($(this).val());
});
let roles_str = roles.join(',');
$("#memberships_table").load(location.pathname + "?search=" + pattern.replace(" ", "%20") + " #memberships_table"); $("#memberships_table").load(location.pathname + "?search=" + pattern.replace(" ", "%20")
+ "&only_active=" + (only_active_obj.is(':checked') ? '1' : '0')
+ "&roles=" + roles_str + " #memberships_table");
} }
searchbar_obj.keyup(reloadTable); searchbar_obj.keyup(reloadTable);
only_active_obj.change(reloadTable);
roles_obj.change(reloadTable);
}); });
</script> </script>
{% endblock %} {% endblock %}

View File

@ -1,5 +1,18 @@
{% load render_table from django_tables2 %} {% load render_table from django_tables2 %}
{% load i18n %} {% load i18n %}
{% if managers.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 "Club managers" %}
</a>
</div>
{% render_table managers %}
</div>
<hr>
{% endif %}
{% if member_list.data %} {% if member_list.data %}
<div class="card"> <div class="card">
<div class="card-header position-relative" id="clubListHeading"> <div class="card-header position-relative" id="clubListHeading">