From d5ad2c5141cd5b460ca14e4edf824f69b9b82f4d Mon Sep 17 00:00:00 2001 From: Bartuccio Antoine Date: Wed, 24 Apr 2019 03:10:42 +0200 Subject: [PATCH 1/8] clubs: Handle bulk add of users in clubs and refresh of the form handling --- club/templates/club/club_members.jinja | 5 +- club/views.py | 132 +++++++++++++++---------- locale/fr/LC_MESSAGES/django.po | 69 +++++++------ 3 files changed, 121 insertions(+), 85 deletions(-) diff --git a/club/templates/club/club_members.jinja b/club/templates/club/club_members.jinja index 5f68a9df..d3db8542 100644 --- a/club/templates/club/club_members.jinja +++ b/club/templates/club/club_members.jinja @@ -11,7 +11,7 @@ {% trans %}Since{% endtrans %} - {% for m in club.members.filter(end_date=None).order_by('-role').all() %} + {% for m in members %} {{ user_profile_link(m.user) }} {{ settings.SITH_CLUB_ROLES[m.role] }} @@ -30,6 +30,3 @@

{% endblock %} - - - diff --git a/club/views.py b/club/views.py index 1b460b2c..5b7e1349 100644 --- a/club/views.py +++ b/club/views.py @@ -33,7 +33,7 @@ from django.core.urlresolvers import reverse, reverse_lazy from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext as _t -from ajax_select.fields import AutoCompleteSelectField +from ajax_select.fields import AutoCompleteSelectField, AutoCompleteSelectMultipleField from django.core.exceptions import PermissionDenied from django.shortcuts import get_object_or_404, redirect @@ -44,6 +44,7 @@ from core.views import ( CanEditPropMixin, TabedViewMixin, PageEditViewBase, + DetailFormView, ) from core.views.forms import SelectDate, SelectDateTime from club.models import Club, Membership, Mailing, MailingSubscription @@ -305,7 +306,7 @@ class ClubToolsView(ClubTabsMixin, CanEditMixin, DetailView): current_tab = "tools" -class ClubMemberForm(forms.ModelForm): +class ClubMemberForm(forms.Form): """ Form handling the members of a club """ @@ -313,24 +314,68 @@ class ClubMemberForm(forms.ModelForm): error_css_class = "error" required_css_class = "required" - class Meta: - model = Membership - fields = ["user", "role", "start_date", "description"] - widgets = {"start_date": SelectDate} - - user = AutoCompleteSelectField( - "users", required=True, label=_("Select user"), help_text=None + users = AutoCompleteSelectMultipleField( + "users", + label=_("Users to add"), + help_text=_("Search users to add (one or more)."), + required=True, ) - def save(self, *args, **kwargs): + def __init__(self, *args, **kwargs): + self.club = kwargs.pop("club") + self.request_user = kwargs.pop("request_user") + super(ClubMemberForm, self).__init__(*args, **kwargs) + + # Using a ModelForm forces a save and we don't want that + # We want the view to process the model creation since they are multiple users + self.fields.update( + forms.fields_for_model( + Membership, + fields=("role", "start_date", "description"), + widgets={"start_date": SelectDate}, + ) + ) + if not self.request_user.is_root: + self.fields.pop("start_date") + + def clean_users(self): """ - Overloaded to return the club, and not to a Membership object that has no view + Check that the user is not trying to add an user already in the club """ - super(ClubMemberForm, self).save(*args, **kwargs) - return self.instance.club + cleaned_data = super(ClubMemberForm, self).clean() + users = [] + for user_id in cleaned_data["users"]: + user = User.objects.filter(id=user_id).first() + if not user: + raise forms.ValidationError( + _("One of the selected users doesn't exist", code="invalid") + ) + users.append(user) + if self.club.get_membership_for(user): + raise forms.ValidationError( + _("You can not add the same user twice"), code="invalid" + ) + return users + + def clean(self): + """ + Check user rights + """ + cleaned_data = super(ClubMemberForm, self).clean() + request_user = self.request_user + membership = self.club.get_membership_for(request_user) + print(request_user.is_root) + if not ( + cleaned_data["role"] <= SITH_MAXIMUM_FREE_ROLE + or (membership is not None and membership.role >= cleaned_data["role"]) + or request_user.is_board_member + or request_user.is_root + ): + raise forms.ValidationError(_("You do not have the permission to do that")) + return cleaned_data -class ClubMembersView(ClubTabsMixin, CanViewMixin, UpdateView): +class ClubMembersView(ClubTabsMixin, CanViewMixin, DetailFormView): """ View of a club's members """ @@ -341,52 +386,39 @@ class ClubMembersView(ClubTabsMixin, CanViewMixin, UpdateView): template_name = "club/club_members.jinja" current_tab = "members" - def get_form(self): - """ - Here we get a Membership object, but the view handles Club object. - That's why the save method of ClubMemberForm is overridden. - """ - form = super(ClubMembersView, self).get_form() - if ( - "user" in form.data and form.data.get("user") != "" - ): # Load an existing membership if possible - form.instance = ( - Membership.objects.filter(club=self.object) - .filter(user=form.data.get("user")) - .filter(end_date=None) - .first() - ) - if form.instance is None: # Instanciate a new membership - form.instance = Membership(club=self.object, user=self.request.user) - if not self.request.user.is_root: - form.fields.pop("start_date", None) - return form + def get_form_kwargs(self): + kwargs = super(ClubMembersView, self).get_form_kwargs() + kwargs["request_user"] = self.request_user + kwargs["club"] = self.get_object() + return kwargs + + def get_context_data(self, *args, **kwargs): + kwargs = super(ClubMembersView, self).get_context_data(*args, **kwargs) + kwargs["members"] = ( + self.get_object().members.filter(end_date=None).order_by("-role").all() + ) + return kwargs def form_valid(self, form): """ Check user rights """ - user = self.request.user - ms = self.object.get_membership_for(user) - if ( - form.cleaned_data["role"] <= SITH_MAXIMUM_FREE_ROLE - or (ms is not None and ms.role >= form.cleaned_data["role"]) - or user.is_board_member - or user.is_root - ): - form.save() - form = self.form_class() - return super(ModelFormMixin, self).form_valid(form) - else: - form.add_error(None, _("You do not have the permission to do that")) - return self.form_invalid(form) + resp = super(ClubMembersView, self).form_valid(form) + + data = form.clean() + users = data.pop("users", []) + for user in users: + Membership(club=self.get_object(), user=user, **data).save() + return resp def dispatch(self, request, *args, **kwargs): - self.request = request + self.request_user = request.user return super(ClubMembersView, self).dispatch(request, *args, **kwargs) def get_success_url(self, **kwargs): - return reverse_lazy("club:club_members", kwargs={"club_id": self.club.id}) + return reverse_lazy( + "club:club_members", kwargs={"club_id": self.get_object().id} + ) class ClubOldMembersView(ClubTabsMixin, CanViewMixin, DetailView): diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index a62e1c94..3c29867c 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-04-22 14:57+0200\n" +"POT-Creation-Date: 2019-04-24 03:06+0200\n" "PO-Revision-Date: 2016-07-18\n" "Last-Translator: Skia \n" "Language-Team: AE info \n" @@ -177,7 +177,7 @@ msgstr "type de cible" #: accounting/models.py:313 club/models.py:422 #: club/templates/club/club_members.jinja:8 #: club/templates/club/club_old_members.jinja:8 -#: club/templates/club/mailing.jinja:28 club/views.py:111 +#: club/templates/club/mailing.jinja:28 club/views.py:112 #: counter/templates/counter/cash_summary_list.jinja:32 #: counter/templates/counter/stats.jinja:15 #: counter/templates/counter/stats.jinja:52 @@ -386,7 +386,7 @@ msgid "Delete" msgstr "Supprimer" #: accounting/templates/accounting/bank_account_details.jinja:18 -#: club/views.py:128 core/views/user.py:205 sas/templates/sas/picture.jinja:86 +#: club/views.py:129 core/views/user.py:205 sas/templates/sas/picture.jinja:86 msgid "Infos" msgstr "Infos" @@ -405,7 +405,7 @@ msgstr "Nouveau compte club" #: accounting/templates/accounting/bank_account_details.jinja:27 #: accounting/templates/accounting/bank_account_list.jinja:22 #: accounting/templates/accounting/club_account_details.jinja:58 -#: accounting/templates/accounting/journal_details.jinja:89 club/views.py:174 +#: accounting/templates/accounting/journal_details.jinja:89 club/views.py:175 #: com/templates/com/news_admin_list.jinja:39 #: com/templates/com/news_admin_list.jinja:68 #: com/templates/com/news_admin_list.jinja:115 @@ -1070,8 +1070,8 @@ msgstr "Du" msgid "To" msgstr "Au" -#: club/templates/club/club_sellings.jinja:5 club/views.py:194 -#: club/views.py:478 counter/templates/counter/counter_main.jinja:19 +#: club/templates/club/club_sellings.jinja:5 club/views.py:195 +#: club/views.py:507 counter/templates/counter/counter_main.jinja:19 #: counter/templates/counter/last_ops.jinja:35 msgid "Sellings" msgstr "Ventes" @@ -1097,7 +1097,7 @@ msgstr "unités" msgid "Benefit: " msgstr "Bénéfice : " -#: club/templates/club/club_sellings.jinja:21 club/views.py:417 +#: club/templates/club/club_sellings.jinja:21 club/views.py:446 #: core/templates/core/user_account_detail.jinja:18 #: core/templates/core/user_account_detail.jinja:51 #: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:168 @@ -1246,60 +1246,71 @@ msgstr "Aucune page n'existe pour ce club" msgid "Club stats" msgstr "Statistiques du club" -#: club/views.py:138 +#: club/views.py:139 msgid "Members" msgstr "Membres" -#: club/views.py:147 +#: club/views.py:148 msgid "Old members" msgstr "Anciens membres" -#: club/views.py:157 core/templates/core/page.jinja:33 +#: club/views.py:158 core/templates/core/page.jinja:33 msgid "History" msgstr "Historique" -#: club/views.py:165 core/templates/core/base.jinja:121 core/views/user.py:228 +#: club/views.py:166 core/templates/core/base.jinja:121 core/views/user.py:228 #: sas/templates/sas/picture.jinja:95 trombi/views.py:60 msgid "Tools" msgstr "Outils" -#: club/views.py:185 +#: club/views.py:186 msgid "Edit club page" msgstr "Éditer la page de club" -#: club/views.py:201 +#: club/views.py:202 msgid "Mailing list" msgstr "Listes de diffusion" -#: club/views.py:210 com/views.py:141 +#: club/views.py:211 com/views.py:141 msgid "Posters list" msgstr "Liste d'affiches" -#: club/views.py:220 counter/templates/counter/counter_list.jinja:21 +#: club/views.py:221 counter/templates/counter/counter_list.jinja:21 #: counter/templates/counter/counter_list.jinja:43 #: counter/templates/counter/counter_list.jinja:59 msgid "Props" msgstr "Propriétés" -#: club/views.py:322 core/views/forms.py:358 counter/views.py:113 -#: trombi/views.py:141 -msgid "Select user" -msgstr "Choisir un utilisateur" +#: club/views.py:319 +msgid "Users to add" +msgstr "Utilisateurs à ajouter" -#: club/views.py:381 sas/views.py:129 sas/views.py:195 sas/views.py:286 +#: club/views.py:320 core/views/group.py:63 +msgid "Search users to add (one or more)." +msgstr "Recherche les utilisateurs à ajouter (un ou plus)." + +#: club/views.py:348 +msgid "One of the selected users doesn't exist" +msgstr "Un des utilisateurs sélectionné n'existe pas" + +#: club/views.py:353 core/views/group.py:82 +msgid "You can not add the same user twice" +msgstr "Vous ne pouvez pas ajouter deux fois le même utilisateur" + +#: club/views.py:371 sas/views.py:129 sas/views.py:195 sas/views.py:286 msgid "You do not have the permission to do that" msgstr "Vous n'avez pas la permission de faire cela" -#: club/views.py:406 counter/views.py:1481 +#: club/views.py:435 counter/views.py:1481 msgid "Begin date" msgstr "Date de début" -#: club/views.py:412 com/views.py:85 com/views.py:221 counter/views.py:1487 +#: club/views.py:441 com/views.py:85 com/views.py:221 counter/views.py:1487 #: election/views.py:190 subscription/views.py:52 msgid "End date" msgstr "Date de fin" -#: club/views.py:435 core/templates/core/user_stats.jinja:27 +#: club/views.py:464 core/templates/core/user_stats.jinja:27 #: counter/views.py:1635 msgid "Product" msgstr "Produit" @@ -3507,6 +3518,10 @@ msgstr "Parrain" msgid "Godchild" msgstr "Fillot" +#: core/views/forms.py:358 counter/views.py:113 trombi/views.py:141 +msgid "Select user" +msgstr "Choisir un utilisateur" + #: core/views/forms.py:371 core/views/forms.py:389 election/models.py:24 #: election/views.py:167 msgid "edit groups" @@ -3525,14 +3540,6 @@ msgstr "Utilisateurs à retirer du groupe" msgid "Users to add to group" msgstr "Utilisateurs à ajouter au groupe" -#: core/views/group.py:63 -msgid "Search users to add (one or more)." -msgstr "Recherche les utilisateurs à ajouter (un ou plus)." - -#: core/views/group.py:82 -msgid "You can not add the same user twice" -msgstr "Vous ne pouvez pas ajouter deux fois le même utilisateur" - #: core/views/user.py:223 trombi/templates/trombi/export.jinja:25 #: trombi/templates/trombi/user_profile.jinja:11 msgid "Pictures" From 80f1f9699cc2b9e0f0cea898867104cb4bc67e79 Mon Sep 17 00:00:00 2001 From: Bartuccio Antoine Date: Wed, 24 Apr 2019 13:48:32 +0200 Subject: [PATCH 2/8] clubs: move Membership form validation outside of model and fix and add tests --- club/models.py | 12 ---------- club/tests.py | 65 +++++++++++++++++++++++++++++++++++++++++++------- club/views.py | 13 ++++++---- 3 files changed, 65 insertions(+), 25 deletions(-) diff --git a/club/models.py b/club/models.py index 00c9239d..250d584f 100644 --- a/club/models.py +++ b/club/models.py @@ -276,18 +276,6 @@ class Membership(models.Model): _("description"), max_length=128, null=False, blank=True ) - def clean(self): - sub = User.objects.filter(pk=self.user.pk).first() - if sub is None or not sub.is_subscribed: - raise ValidationError(_("User must be subscriber to take part to a club")) - if ( - Membership.objects.filter(user=self.user) - .filter(club=self.club) - .filter(end_date=None) - .exists() - ): - raise ValidationError(_("User is already member of that club")) - def __str__(self): return ( self.club.name diff --git a/club/tests.py b/club/tests.py index c0409a9f..b9130bb4 100644 --- a/club/tests.py +++ b/club/tests.py @@ -44,7 +44,7 @@ class ClubTest(TestCase): self.client.login(username="root", password="plop") self.client.post( reverse("club:club_members", kwargs={"club_id": self.bdf.id}), - {"user": self.skia.id, "start_date": "12/06/2016", "role": 3}, + {"users": self.skia.id, "start_date": "12/06/2016", "role": 3}, ) response = self.client.get( reverse("club:club_members", kwargs={"club_id": self.bdf.id}) @@ -55,14 +55,37 @@ class ClubTest(TestCase): in str(response.content) ) + def test_create_add_multiple_user_to_club_from_root_ok(self): + self.client.login(username="root", password="plop") + self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + { + "users": "|%d|%d|" % (self.skia.id, self.rbatsbak.id), + "start_date": "12/06/2016", + "role": 3, + }, + ) + response = self.client.get( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}) + ) + self.assertTrue(response.status_code == 200) + content = str(response.content) + self.assertTrue( + "S' Kia\\n Responsable info" in content + ) + self.assertTrue( + "Richard Batsbak\\n Responsable info" + in content + ) + def test_create_add_user_to_club_from_root_fail_not_subscriber(self): self.client.login(username="root", password="plop") response = self.client.post( reverse("club:club_members", kwargs={"club_id": self.bdf.id}), - {"user": self.guy.id, "start_date": "12/06/2016", "role": 3}, + {"users": self.guy.id, "start_date": "12/06/2016", "role": 3}, ) self.assertTrue(response.status_code == 200) - self.assertTrue('
  • ' in str(response.content)) + self.assertTrue('
    • ' in str(response.content)) response = self.client.get( reverse("club:club_members", kwargs={"club_id": self.bdf.id}) ) @@ -75,7 +98,7 @@ class ClubTest(TestCase): self.client.login(username="root", password="plop") self.client.post( reverse("club:club_members", kwargs={"club_id": self.bdf.id}), - {"user": self.skia.id, "start_date": "12/06/2016", "role": 3}, + {"users": self.skia.id, "start_date": "12/06/2016", "role": 3}, ) response = self.client.get( reverse("club:club_members", kwargs={"club_id": self.bdf.id}) @@ -86,7 +109,7 @@ class ClubTest(TestCase): ) response = self.client.post( reverse("club:club_members", kwargs={"club_id": self.bdf.id}), - {"user": self.skia.id, "start_date": "12/06/2016", "role": 4}, + {"users": self.skia.id, "start_date": "12/06/2016", "role": 4}, ) self.assertTrue(response.status_code == 200) self.assertFalse( @@ -94,16 +117,40 @@ class ClubTest(TestCase): in str(response.content) ) + def test_create_add_user_non_existent_to_club_from_root_fail(self): + self.client.login(username="root", password="plop") + response = self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users": [9999], "start_date": "12/06/2016", "role": 3}, + ) + self.assertTrue(response.status_code == 200) + content = str(response.content) + self.assertTrue('
      • ' in content) + self.assertFalse("Responsable info" in content) + self.client.login(username="root", password="plop") + response = self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + { + "users": "|%d|%d|" % (self.skia.id, 9999), + "start_date": "12/06/2016", + "role": 3, + }, + ) + self.assertTrue(response.status_code == 200) + content = str(response.content) + self.assertTrue('
        • ' in content) + self.assertFalse("Responsable info" in content) + def test_create_add_user_to_club_from_skia_ok(self): self.client.login(username="root", password="plop") self.client.post( reverse("club:club_members", kwargs={"club_id": self.bdf.id}), - {"user": self.skia.id, "start_date": "12/06/2016", "role": 10}, + {"users": self.skia.id, "start_date": "12/06/2016", "role": 10}, ) self.client.login(username="skia", password="plop") self.client.post( reverse("club:club_members", kwargs={"club_id": self.bdf.id}), - {"user": self.rbatsbak.id, "start_date": "12/06/2016", "role": 9}, + {"users": self.rbatsbak.id, "start_date": "12/06/2016", "role": 9}, ) response = self.client.get( reverse("club:club_members", kwargs={"club_id": self.bdf.id}) @@ -118,12 +165,12 @@ class ClubTest(TestCase): self.client.login(username="root", password="plop") self.client.post( reverse("club:club_members", kwargs={"club_id": self.bdf.id}), - {"user": self.rbatsbak.id, "start_date": "12/06/2016", "role": 3}, + {"users": self.rbatsbak.id, "start_date": "12/06/2016", "role": 3}, ) self.client.login(username="rbatsbak", password="plop") response = self.client.post( reverse("club:club_members", kwargs={"club_id": self.bdf.id}), - {"user": self.skia.id, "start_date": "12/06/2016", "role": 10}, + {"users": self.skia.id, "start_date": "12/06/2016", "role": 10}, ) self.assertTrue(response.status_code == 200) self.assertTrue( diff --git a/club/views.py b/club/views.py index 5b7e1349..64b5e301 100644 --- a/club/views.py +++ b/club/views.py @@ -326,8 +326,9 @@ class ClubMemberForm(forms.Form): self.request_user = kwargs.pop("request_user") super(ClubMemberForm, self).__init__(*args, **kwargs) - # Using a ModelForm forces a save and we don't want that + # Using a ModelForm binds too much the form with the model and we don't want that # We want the view to process the model creation since they are multiple users + # We also want the form to handle bulk deletion self.fields.update( forms.fields_for_model( Membership, @@ -341,6 +342,7 @@ class ClubMemberForm(forms.Form): def clean_users(self): """ Check that the user is not trying to add an user already in the club + Also check that the user is valid and has a valid subscription """ cleaned_data = super(ClubMemberForm, self).clean() users = [] @@ -348,13 +350,17 @@ class ClubMemberForm(forms.Form): user = User.objects.filter(id=user_id).first() if not user: raise forms.ValidationError( - _("One of the selected users doesn't exist", code="invalid") + _("One of the selected users doesn't exist"), code="invalid" + ) + if not user.is_subscribed: + raise forms.ValidationError( + _("User must be subscriber to take part to a club"), code="invalid" ) - users.append(user) if self.club.get_membership_for(user): raise forms.ValidationError( _("You can not add the same user twice"), code="invalid" ) + users.append(user) return users def clean(self): @@ -364,7 +370,6 @@ class ClubMemberForm(forms.Form): cleaned_data = super(ClubMemberForm, self).clean() request_user = self.request_user membership = self.club.get_membership_for(request_user) - print(request_user.is_root) if not ( cleaned_data["role"] <= SITH_MAXIMUM_FREE_ROLE or (membership is not None and membership.role >= cleaned_data["role"]) From 69646925563f9d69e2cf87373daffcfe2cf2675a Mon Sep 17 00:00:00 2001 From: Bartuccio Antoine Date: Wed, 24 Apr 2019 18:17:03 +0200 Subject: [PATCH 3/8] clubs: basic bulk mark as old --- club/models.py | 7 +++++-- club/views.py | 37 ++++++++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/club/models.py b/club/models.py index 250d584f..d446c080 100644 --- a/club/models.py +++ b/club/models.py @@ -292,12 +292,15 @@ class Membership(models.Model): """ return user.is_in_group(settings.SITH_MAIN_BOARD_GROUP) - def can_be_edited_by(self, user): + def can_be_edited_by(self, user, membership=None): """ Method to see if that object can be edited by the given user """ if user.memberships: - ms = user.memberships.filter(club=self.club, end_date=None).first() + if membership: # This is for optimisation purpose + ms = membership + else: + ms = user.memberships.filter(club=self.club, end_date=None).first() return (ms and ms.role >= self.role) or user.is_in_group( settings.SITH_MAIN_BOARD_GROUP ) diff --git a/club/views.py b/club/views.py index 64b5e301..82bd1ed2 100644 --- a/club/views.py +++ b/club/views.py @@ -318,12 +318,18 @@ class ClubMemberForm(forms.Form): "users", label=_("Users to add"), help_text=_("Search users to add (one or more)."), - required=True, + required=False, ) def __init__(self, *args, **kwargs): self.club = kwargs.pop("club") self.request_user = kwargs.pop("request_user") + self.club_members = kwargs.pop("club_members", None) + if not self.club_members: + self.club_members = ( + self.club.members.filter(end_date=None).order_by("-role").all() + ) + self.request_user_membership = self.club.get_membership_for(self.request_user) super(ClubMemberForm, self).__init__(*args, **kwargs) # Using a ModelForm binds too much the form with the model and we don't want that @@ -336,6 +342,20 @@ class ClubMemberForm(forms.Form): widgets={"start_date": SelectDate}, ) ) + self.fields["users_old"] = forms.ModelMultipleChoiceField( + User.objects.filter( + id__in=[ + ms.user.id + for ms in self.club_members + if ms.can_be_edited_by( + self.request_user, self.request_user_membership + ) + ] + ).all(), + label=_("Mark as old"), + required=False, + widget=forms.CheckboxSelectMultiple, + ) if not self.request_user.is_root: self.fields.pop("start_date") @@ -369,7 +389,7 @@ class ClubMemberForm(forms.Form): """ cleaned_data = super(ClubMemberForm, self).clean() request_user = self.request_user - membership = self.club.get_membership_for(request_user) + membership = self.request_user_membership if not ( cleaned_data["role"] <= SITH_MAXIMUM_FREE_ROLE or (membership is not None and membership.role >= cleaned_data["role"]) @@ -395,13 +415,12 @@ class ClubMembersView(ClubTabsMixin, CanViewMixin, DetailFormView): kwargs = super(ClubMembersView, self).get_form_kwargs() kwargs["request_user"] = self.request_user kwargs["club"] = self.get_object() + kwargs["club_members"] = self.members return kwargs def get_context_data(self, *args, **kwargs): kwargs = super(ClubMembersView, self).get_context_data(*args, **kwargs) - kwargs["members"] = ( - self.get_object().members.filter(end_date=None).order_by("-role").all() - ) + kwargs["members"] = self.members return kwargs def form_valid(self, form): @@ -412,12 +431,20 @@ class ClubMembersView(ClubTabsMixin, CanViewMixin, DetailFormView): data = form.clean() users = data.pop("users", []) + users_old = data.pop("users_old", []) for user in users: Membership(club=self.get_object(), user=user, **data).save() + for user in users_old: + membership = self.get_object().get_membership_for(user) + membership.end_date = timezone.now() + membership.save() return resp def dispatch(self, request, *args, **kwargs): self.request_user = request.user + self.members = ( + self.get_object().members.filter(end_date=None).order_by("-role").all() + ) return super(ClubMembersView, self).dispatch(request, *args, **kwargs) def get_success_url(self, **kwargs): From 75328de5cae7d31e1fdef412220a552312706faa Mon Sep 17 00:00:00 2001 From: Bartuccio Antoine Date: Thu, 25 Apr 2019 15:40:49 +0200 Subject: [PATCH 4/8] clubs: fix membership form and add bulk mark as old tests --- club/tests.py | 191 ++++++++++++++++++++++++++++++++ club/views.py | 20 +++- locale/fr/LC_MESSAGES/django.po | 58 +++++----- 3 files changed, 239 insertions(+), 30 deletions(-) diff --git a/club/tests.py b/club/tests.py index b9130bb4..1a99ed52 100644 --- a/club/tests.py +++ b/club/tests.py @@ -177,3 +177,194 @@ class ClubTest(TestCase): "
        • Vous n'avez pas la permission de faire cela
        • " in str(response.content) ) + + def test_role_required_if_users_specified(self): + self.client.login(username="root", password="plop") + response = self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users": self.rbatsbak.id, "start_date": "12/06/2016"}, + ) + self.assertTrue( + '
          • Vous devez choisir un r' in str(response.content) + ) + + def test_mark_old_user_to_club_from_skia_ok(self): + self.client.login(username="root", password="plop") + self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + { + "users": "|%d|%d|" % (self.skia.id, self.rbatsbak.id), + "start_date": "12/06/2016", + "role": 3, + }, + ) + self.client.login(username="skia", password="plop") + response = self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users_old": self.rbatsbak.id}, + ) + self.assertTrue(response.status_code == 302) + + response = self.client.get( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}) + ) + self.assertTrue(response.status_code == 200) + content = str(response.content) + self.assertFalse( + "Richard Batsbak\\n Responsable info" + in content + ) + self.assertTrue( + "S' Kia\\n Responsable info" in content + ) + + # Skia is board member so he should be able to mark as old even without being in the club + response = self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users_old": self.skia.id}, + ) + self.client.login(username="root", password="plop") + self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users": self.rbatsbak.id, "start_date": "12/06/2016", "role": 3}, + ) + self.client.login(username="skia", password="plop") + response = self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users_old": self.rbatsbak.id}, + ) + self.assertFalse( + "Richard Batsbak\\n Responsable info" + in str(response.content) + ) + + def test_mark_old_multiple_users_from_skia_ok(self): + self.client.login(username="root", password="plop") + self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + { + "users": "|%d|%d|" % (self.skia.id, self.rbatsbak.id), + "start_date": "12/06/2016", + "role": 3, + }, + ) + self.client.login(username="skia", password="plop") + response = self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users_old": [self.rbatsbak.id, self.skia.id]}, + ) + self.assertTrue(response.status_code == 302) + + response = self.client.get( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}) + ) + self.assertTrue(response.status_code == 200) + content = str(response.content) + self.assertFalse( + "Richard Batsbak\\n Responsable info" + in content + ) + self.assertFalse( + "S' Kia\\n Responsable info" in content + ) + + def test_mark_old_user_to_club_from_richard_ok(self): + self.client.login(username="root", password="plop") + self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + { + "users": "|%d|%d|" % (self.skia.id, self.rbatsbak.id), + "start_date": "12/06/2016", + "role": 3, + }, + ) + + # Test with equal rights + self.client.login(username="rbatsbak", password="plop") + response = self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users_old": self.skia.id}, + ) + self.assertTrue(response.status_code == 302) + + response = self.client.get( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}) + ) + self.assertTrue(response.status_code == 200) + content = str(response.content) + self.assertTrue( + "Richard Batsbak\\n Responsable info" + in content + ) + self.assertFalse( + "S' Kia\\n Responsable info" in content + ) + + # Test with lower rights + self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users": self.skia.id, "start_date": "12/06/2016", "role": 0}, + ) + + self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users_old": self.skia.id}, + ) + response = self.client.get( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}) + ) + self.assertTrue(response.status_code == 200) + content = str(response.content) + self.assertTrue( + "Richard Batsbak\\n Responsable info" + in content + ) + self.assertFalse( + "S' Kia\\n Curieux" in content + ) + + def test_mark_old_user_to_club_from_richard_fail(self): + self.client.login(username="root", password="plop") + self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users": self.skia.id, "start_date": "12/06/2016", "role": 3}, + ) + + # Test with richard outside of the club + self.client.login(username="rbatsbak", password="plop") + response = self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users_old": self.skia.id}, + ) + self.assertTrue(response.status_code == 200) + + response = self.client.get( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}) + ) + self.assertTrue(response.status_code == 200) + self.assertTrue( + "S' Kia\\n Responsable info" + in str(response.content) + ) + + # Test with lower rights + self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users": self.rbatsbak.id, "start_date": "12/06/2016", "role": 0}, + ) + + self.client.post( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}), + {"users_old": self.skia.id}, + ) + response = self.client.get( + reverse("club:club_members", kwargs={"club_id": self.bdf.id}) + ) + self.assertTrue(response.status_code == 200) + content = str(response.content) + self.assertTrue( + "Richard Batsbak\\n Curieux" in content + ) + self.assertTrue( + "S' Kia\\n Responsable info" in content + ) diff --git a/club/views.py b/club/views.py index 82bd1ed2..d7299208 100644 --- a/club/views.py +++ b/club/views.py @@ -342,6 +342,14 @@ class ClubMemberForm(forms.Form): widgets={"start_date": SelectDate}, ) ) + + # Role is required only if users is specified + self.fields["role"].required = False + + # Start date and description are never really required + self.fields["start_date"].required = False + self.fields["description"].required = False + self.fields["users_old"] = forms.ModelMultipleChoiceField( User.objects.filter( id__in=[ @@ -385,9 +393,19 @@ class ClubMemberForm(forms.Form): def clean(self): """ - Check user rights + Check user rights for adding an user """ cleaned_data = super(ClubMemberForm, self).clean() + + if not cleaned_data.get("users"): + # No user to add equals no check needed + return cleaned_data + + if cleaned_data.get("role", "") == "": + # Role is required if users exists + self.add_error("role", _("You should specify a role")) + return cleaned_data + request_user = self.request_user membership = self.request_user_membership if not ( diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 3c29867c..9236b145 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-04-24 03:06+0200\n" +"POT-Creation-Date: 2019-04-25 14:45+0200\n" "PO-Revision-Date: 2016-07-18\n" "Last-Translator: Skia \n" "Language-Team: AE info \n" @@ -174,7 +174,7 @@ msgstr "étiquette" msgid "target type" msgstr "type de cible" -#: accounting/models.py:313 club/models.py:422 +#: accounting/models.py:313 club/models.py:413 #: club/templates/club/club_members.jinja:8 #: club/templates/club/club_old_members.jinja:8 #: club/templates/club/mailing.jinja:28 club/views.py:112 @@ -186,7 +186,7 @@ msgstr "type de cible" msgid "User" msgstr "Utilisateur" -#: accounting/models.py:314 club/models.py:329 +#: accounting/models.py:314 club/models.py:320 #: club/templates/club/club_detail.jinja:12 #: com/templates/com/mailing_admin.jinja:11 #: com/templates/com/news_admin_list.jinja:23 @@ -955,48 +955,40 @@ msgstr "rôle" msgid "description" msgstr "description" -#: club/models.py:282 -msgid "User must be subscriber to take part to a club" -msgstr "L'utilisateur doit être cotisant pour faire partie d'un club" - -#: club/models.py:289 -msgid "User is already member of that club" -msgstr "L'utilisateur est déjà membre de ce club" - -#: club/models.py:298 +#: club/models.py:286 msgid "past member" msgstr "Anciens membres" -#: club/models.py:332 club/models.py:427 +#: club/models.py:323 club/models.py:418 msgid "Email address" msgstr "Adresse email" -#: club/models.py:340 +#: club/models.py:331 msgid "Enter a valid address. Only the root of the address is needed." msgstr "" "Entrez une adresse valide. Seule la racine de l'adresse est nécessaire." -#: club/models.py:344 com/models.py:79 com/models.py:260 core/models.py:810 +#: club/models.py:335 com/models.py:79 com/models.py:260 core/models.py:810 msgid "is moderated" msgstr "est modéré" -#: club/models.py:346 com/models.py:81 com/models.py:264 +#: club/models.py:337 com/models.py:81 com/models.py:264 msgid "moderator" msgstr "modérateur" -#: club/models.py:415 club/templates/club/mailing.jinja:14 +#: club/models.py:406 club/templates/club/mailing.jinja:14 msgid "Mailing" msgstr "Liste de diffusion" -#: club/models.py:434 +#: club/models.py:425 msgid "At least user or email is required" msgstr "Au moins un utilisateur ou un email est nécessaire" -#: club/models.py:442 +#: club/models.py:433 msgid "This email is already suscribed in this mailing" msgstr "Cet email est déjà abonné à cette mailing" -#: club/models.py:471 club/templates/club/mailing.jinja:36 +#: club/models.py:462 club/templates/club/mailing.jinja:36 msgid "Unregistered user" msgstr "Désabonner un utilisateur" @@ -1045,7 +1037,7 @@ msgstr "Description" msgid "Since" msgstr "Depuis" -#: club/templates/club/club_members.jinja:21 +#: club/templates/club/club_members.jinja:21 club/views.py:363 #: core/templates/core/user_clubs.jinja:29 msgid "Mark as old" msgstr "Marquer comme ancien" @@ -1071,7 +1063,7 @@ msgid "To" msgstr "Au" #: club/templates/club/club_sellings.jinja:5 club/views.py:195 -#: club/views.py:507 counter/templates/counter/counter_main.jinja:19 +#: club/views.py:560 counter/templates/counter/counter_main.jinja:19 #: counter/templates/counter/last_ops.jinja:35 msgid "Sellings" msgstr "Ventes" @@ -1097,7 +1089,7 @@ msgstr "unités" msgid "Benefit: " msgstr "Bénéfice : " -#: club/templates/club/club_sellings.jinja:21 club/views.py:446 +#: club/templates/club/club_sellings.jinja:21 club/views.py:499 #: core/templates/core/user_account_detail.jinja:18 #: core/templates/core/user_account_detail.jinja:51 #: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:168 @@ -1289,28 +1281,36 @@ msgstr "Utilisateurs à ajouter" msgid "Search users to add (one or more)." msgstr "Recherche les utilisateurs à ajouter (un ou plus)." -#: club/views.py:348 +#: club/views.py:381 msgid "One of the selected users doesn't exist" msgstr "Un des utilisateurs sélectionné n'existe pas" -#: club/views.py:353 core/views/group.py:82 +#: club/views.py:385 +msgid "User must be subscriber to take part to a club" +msgstr "L'utilisateur doit être cotisant pour faire partie d'un club" + +#: club/views.py:389 core/views/group.py:82 msgid "You can not add the same user twice" msgstr "Vous ne pouvez pas ajouter deux fois le même utilisateur" -#: club/views.py:371 sas/views.py:129 sas/views.py:195 sas/views.py:286 +#: club/views.py:406 +msgid "You should specify a role" +msgstr "Vous devez choisir un rôle" + +#: club/views.py:417 sas/views.py:129 sas/views.py:195 sas/views.py:286 msgid "You do not have the permission to do that" msgstr "Vous n'avez pas la permission de faire cela" -#: club/views.py:435 counter/views.py:1481 +#: club/views.py:488 counter/views.py:1481 msgid "Begin date" msgstr "Date de début" -#: club/views.py:441 com/views.py:85 com/views.py:221 counter/views.py:1487 +#: club/views.py:494 com/views.py:85 com/views.py:221 counter/views.py:1487 #: election/views.py:190 subscription/views.py:52 msgid "End date" msgstr "Date de fin" -#: club/views.py:464 core/templates/core/user_stats.jinja:27 +#: club/views.py:517 core/templates/core/user_stats.jinja:27 #: counter/views.py:1635 msgid "Product" msgstr "Produit" From 3eb3565a63184a82796d84bd714f43ff77feddfa Mon Sep 17 00:00:00 2001 From: Bartuccio Antoine Date: Thu, 25 Apr 2019 16:36:20 +0200 Subject: [PATCH 5/8] clubs: nice display of bulk mark as old --- club/templates/club/club_members.jinja | 84 ++++++++++++++++++-------- 1 file changed, 60 insertions(+), 24 deletions(-) diff --git a/club/templates/club/club_members.jinja b/club/templates/club/club_members.jinja index d3db8542..d950c8b6 100644 --- a/club/templates/club/club_members.jinja +++ b/club/templates/club/club_members.jinja @@ -1,32 +1,68 @@ {% extends "core/base.jinja" %} -{% from 'core/macros.jinja' import user_profile_link %} +{% from 'core/macros.jinja' import user_profile_link, select_all_checkbox %} {% block content %}

            {% trans %}Club members{% endtrans %}

            - - - - - - - - - {% for m in members %} - - - - - - {% if m.can_be_edited_by(user) %} - - {% endif %} - - {% endfor %} - -
            {% trans %}User{% endtrans %}{% trans %}Role{% endtrans %}{% trans %}Description{% endtrans %}{% trans %}Since{% endtrans %}
            {{ user_profile_link(m.user) }}{{ settings.SITH_CLUB_ROLES[m.role] }}{{ m.description }}{{ m.start_date }}{% trans %}Mark as old{% endtrans %}
            -
            + {% csrf_token %} - {{ form.as_p() }} + {% set users_old = dict(form.users_old | groupby("choice_label")) %} + {% if users_old %} + {{ select_all_checkbox("users_old") }} +

            + {% endif %} + + + + + + + {% if users_old %} + + {% endif %} + + + {% for m in members %} + + + + + + {% if users_old %} + + {% endif %} + + {% endfor %} + +
            {% trans %}User{% endtrans %}{% trans %}Role{% endtrans %}{% trans %}Description{% endtrans %}{% trans %}Since{% endtrans %}{% trans %}Mark as old{% endtrans %}
            {{ user_profile_link(m.user) }}{{ settings.SITH_CLUB_ROLES[m.role] }}{{ m.description }}{{ m.start_date }} + {% set user_old = users_old[m.user.get_display_name()] %} + {% if user_old %} + {{ user_old[0].tag() }} + {% endif %} +
            + {{ form.users_old.errors }} + {% if users_old %} +

            + + {% endif %} +
            +
            + {% csrf_token %} +

            + {{ form.users.errors }} + + {{ form.users }} + {{ form.users.help_text }} +

            +

            + {{ form.role.errors }} + + {{ form.role }} +

            +

            + {{ form.description.errors }} + + {{ form.description }} +

            {% endblock %} From 68f61a432a90de96ceabd0788f02791968311c27 Mon Sep 17 00:00:00 2001 From: Bartuccio Antoine Date: Thu, 25 Apr 2019 17:31:42 +0200 Subject: [PATCH 6/8] clubs: adapt tests to new display and fix form validation issue for start_date --- club/templates/club/club_members.jinja | 8 +++++ club/tests.py | 41 +++++++++++++++----------- club/views.py | 4 +++ 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/club/templates/club/club_members.jinja b/club/templates/club/club_members.jinja index d950c8b6..22f609f8 100644 --- a/club/templates/club/club_members.jinja +++ b/club/templates/club/club_members.jinja @@ -47,6 +47,7 @@
            {% csrf_token %} + {{ form.non_field_errors() }}

            {{ form.users.errors }} @@ -58,6 +59,13 @@ {{ form.role }}

            + {% if form.start_date %} +

            + {{ form.start_date.errors }} + + {{ form.start_date }} +

            + {% endif %}

            {{ form.description.errors }} diff --git a/club/tests.py b/club/tests.py index 1a99ed52..25f6e019 100644 --- a/club/tests.py +++ b/club/tests.py @@ -51,7 +51,7 @@ class ClubTest(TestCase): ) self.assertTrue(response.status_code == 200) self.assertTrue( - "S' Kia\\n Responsable info" + "S' Kia\\n Responsable info" in str(response.content) ) @@ -71,10 +71,11 @@ class ClubTest(TestCase): self.assertTrue(response.status_code == 200) content = str(response.content) self.assertTrue( - "S' Kia\\n Responsable info" in content + "S' Kia\\n Responsable info" + in content ) self.assertTrue( - "Richard Batsbak\\n Responsable info" + "Richard Batsbak\\n Responsable info" in content ) @@ -90,7 +91,7 @@ class ClubTest(TestCase): reverse("club:club_members", kwargs={"club_id": self.bdf.id}) ) self.assertFalse( - "Guy Carlier\\n Responsable info" + "Guy Carlier\\n Responsable info" in str(response.content) ) @@ -104,7 +105,7 @@ class ClubTest(TestCase): reverse("club:club_members", kwargs={"club_id": self.bdf.id}) ) self.assertTrue( - "S' Kia\\n Responsable info" + "S' Kia\\n Responsable info" in str(response.content) ) response = self.client.post( @@ -157,7 +158,7 @@ class ClubTest(TestCase): ) self.assertTrue(response.status_code == 200) self.assertTrue( - """Richard Batsbak\\n Vice-Pr\\xc3\\xa9sident""" + """Richard Batsbak\\n Vice-Pr\\xc3\\xa9sident""" in str(response.content) ) @@ -211,11 +212,12 @@ class ClubTest(TestCase): self.assertTrue(response.status_code == 200) content = str(response.content) self.assertFalse( - "Richard Batsbak\\n Responsable info" + "Richard Batsbak\\n Responsable info" in content ) self.assertTrue( - "S' Kia\\n Responsable info" in content + "S' Kia\\n Responsable info" + in content ) # Skia is board member so he should be able to mark as old even without being in the club @@ -234,7 +236,7 @@ class ClubTest(TestCase): {"users_old": self.rbatsbak.id}, ) self.assertFalse( - "Richard Batsbak\\n Responsable info" + "Richard Batsbak\\n Responsable info" in str(response.content) ) @@ -261,11 +263,12 @@ class ClubTest(TestCase): self.assertTrue(response.status_code == 200) content = str(response.content) self.assertFalse( - "Richard Batsbak\\n Responsable info" + "Richard Batsbak\\n Responsable info" in content ) self.assertFalse( - "S' Kia\\n Responsable info" in content + "S' Kia\\n Responsable info" + in content ) def test_mark_old_user_to_club_from_richard_ok(self): @@ -293,11 +296,12 @@ class ClubTest(TestCase): self.assertTrue(response.status_code == 200) content = str(response.content) self.assertTrue( - "Richard Batsbak\\n Responsable info" + "Richard Batsbak\\n Responsable info" in content ) self.assertFalse( - "S' Kia\\n Responsable info" in content + "S' Kia\\n Responsable info" + in content ) # Test with lower rights @@ -316,11 +320,11 @@ class ClubTest(TestCase): self.assertTrue(response.status_code == 200) content = str(response.content) self.assertTrue( - "Richard Batsbak\\n Responsable info" + "Richard Batsbak\\n Responsable info" in content ) self.assertFalse( - "S' Kia\\n Curieux" in content + "S' Kia\\n Curieux" in content ) def test_mark_old_user_to_club_from_richard_fail(self): @@ -343,7 +347,7 @@ class ClubTest(TestCase): ) self.assertTrue(response.status_code == 200) self.assertTrue( - "S' Kia\\n Responsable info" + "S' Kia\\n Responsable info" in str(response.content) ) @@ -363,8 +367,9 @@ class ClubTest(TestCase): self.assertTrue(response.status_code == 200) content = str(response.content) self.assertTrue( - "Richard Batsbak\\n Curieux" in content + "Richard Batsbak\\n Curieux" in content ) self.assertTrue( - "S' Kia\\n Responsable info" in content + "S' Kia\\n Responsable info" + in content ) diff --git a/club/views.py b/club/views.py index d7299208..74be7b71 100644 --- a/club/views.py +++ b/club/views.py @@ -397,6 +397,10 @@ class ClubMemberForm(forms.Form): """ cleaned_data = super(ClubMemberForm, self).clean() + if "start_date" in cleaned_data and not cleaned_data["start_date"]: + # Drop start_date if allowed to edition but not specified + cleaned_data.pop("start_date") + if not cleaned_data.get("users"): # No user to add equals no check needed return cleaned_data From f72f0639ee04e2d4e9c0966606b01dd9f0aed225 Mon Sep 17 00:00:00 2001 From: Bartuccio Antoine Date: Thu, 25 Apr 2019 17:38:17 +0200 Subject: [PATCH 7/8] clubs: display a message instead of a table when no member in a club --- club/templates/club/club_members.jinja | 4 ++++ locale/fr/LC_MESSAGES/django.po | 33 +++++++++++++++----------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/club/templates/club/club_members.jinja b/club/templates/club/club_members.jinja index 22f609f8..7c378a7d 100644 --- a/club/templates/club/club_members.jinja +++ b/club/templates/club/club_members.jinja @@ -3,6 +3,7 @@ {% block content %}

            {% trans %}Club members{% endtrans %}

            + {% if members %} {% csrf_token %} {% set users_old = dict(form.users_old | groupby("choice_label")) %} @@ -45,6 +46,9 @@ {% endif %}
            + {% else %} +

            {% trans %}There are no members in this club.{% endtrans %}

            + {% endif %}
            {% csrf_token %} {{ form.non_field_errors() }} diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 9236b145..98409cfc 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-04-25 14:45+0200\n" +"POT-Creation-Date: 2019-04-25 17:35+0200\n" "PO-Revision-Date: 2016-07-18\n" "Last-Translator: Skia \n" "Language-Team: AE info \n" @@ -175,7 +175,7 @@ msgid "target type" msgstr "type de cible" #: accounting/models.py:313 club/models.py:413 -#: club/templates/club/club_members.jinja:8 +#: club/templates/club/club_members.jinja:16 #: club/templates/club/club_old_members.jinja:8 #: club/templates/club/mailing.jinja:28 club/views.py:112 #: counter/templates/counter/cash_summary_list.jinja:32 @@ -1013,7 +1013,7 @@ msgstr "Il n'y a pas de club dans ce site web." msgid "Club members" msgstr "Membres du club" -#: club/templates/club/club_members.jinja:9 +#: club/templates/club/club_members.jinja:17 #: club/templates/club/club_old_members.jinja:9 #: core/templates/core/user_clubs.jinja:16 #: core/templates/core/user_clubs.jinja:42 @@ -1023,7 +1023,7 @@ msgstr "Membres du club" msgid "Role" msgstr "Rôle" -#: club/templates/club/club_members.jinja:10 +#: club/templates/club/club_members.jinja:18 #: club/templates/club/club_old_members.jinja:10 #: core/templates/core/group_list.jinja:15 #: core/templates/core/user_clubs.jinja:17 @@ -1031,18 +1031,23 @@ msgstr "Rôle" msgid "Description" msgstr "Description" -#: club/templates/club/club_members.jinja:11 +#: club/templates/club/club_members.jinja:19 #: core/templates/core/user_clubs.jinja:18 #: launderette/templates/launderette/launderette_admin.jinja:45 msgid "Since" msgstr "Depuis" -#: club/templates/club/club_members.jinja:21 club/views.py:363 +#: club/templates/club/club_members.jinja:21 +#: club/templates/club/club_members.jinja:46 club/views.py:363 #: core/templates/core/user_clubs.jinja:29 msgid "Mark as old" msgstr "Marquer comme ancien" -#: club/templates/club/club_members.jinja:30 +#: club/templates/club/club_members.jinja:50 +msgid "There are no members in this club." +msgstr "Il n'y a pas de membres dans ce club." + +#: club/templates/club/club_members.jinja:78 #: core/templates/core/file_detail.jinja:19 core/views/forms.py:355 #: launderette/views.py:226 trombi/templates/trombi/detail.jinja:19 msgid "Add" @@ -1063,7 +1068,7 @@ msgid "To" msgstr "Au" #: club/templates/club/club_sellings.jinja:5 club/views.py:195 -#: club/views.py:560 counter/templates/counter/counter_main.jinja:19 +#: club/views.py:564 counter/templates/counter/counter_main.jinja:19 #: counter/templates/counter/last_ops.jinja:35 msgid "Sellings" msgstr "Ventes" @@ -1089,7 +1094,7 @@ msgstr "unités" msgid "Benefit: " msgstr "Bénéfice : " -#: club/templates/club/club_sellings.jinja:21 club/views.py:499 +#: club/templates/club/club_sellings.jinja:21 club/views.py:503 #: core/templates/core/user_account_detail.jinja:18 #: core/templates/core/user_account_detail.jinja:51 #: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:168 @@ -1293,24 +1298,24 @@ msgstr "L'utilisateur doit être cotisant pour faire partie d'un club" msgid "You can not add the same user twice" msgstr "Vous ne pouvez pas ajouter deux fois le même utilisateur" -#: club/views.py:406 +#: club/views.py:410 msgid "You should specify a role" msgstr "Vous devez choisir un rôle" -#: club/views.py:417 sas/views.py:129 sas/views.py:195 sas/views.py:286 +#: club/views.py:421 sas/views.py:129 sas/views.py:195 sas/views.py:286 msgid "You do not have the permission to do that" msgstr "Vous n'avez pas la permission de faire cela" -#: club/views.py:488 counter/views.py:1481 +#: club/views.py:492 counter/views.py:1481 msgid "Begin date" msgstr "Date de début" -#: club/views.py:494 com/views.py:85 com/views.py:221 counter/views.py:1487 +#: club/views.py:498 com/views.py:85 com/views.py:221 counter/views.py:1487 #: election/views.py:190 subscription/views.py:52 msgid "End date" msgstr "Date de fin" -#: club/views.py:517 core/templates/core/user_stats.jinja:27 +#: club/views.py:521 core/templates/core/user_stats.jinja:27 #: counter/views.py:1635 msgid "Product" msgstr "Produit" From 01803c8cf04ab6aeb9c7881fc978f0847a68e411 Mon Sep 17 00:00:00 2001 From: Bartuccio Antoine Date: Thu, 25 Apr 2019 19:51:30 +0200 Subject: [PATCH 8/8] clubs: remove useless self.request_user into ClubMemberView --- club/views.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/club/views.py b/club/views.py index 74be7b71..7f50be06 100644 --- a/club/views.py +++ b/club/views.py @@ -435,7 +435,7 @@ class ClubMembersView(ClubTabsMixin, CanViewMixin, DetailFormView): def get_form_kwargs(self): kwargs = super(ClubMembersView, self).get_form_kwargs() - kwargs["request_user"] = self.request_user + kwargs["request_user"] = self.request.user kwargs["club"] = self.get_object() kwargs["club_members"] = self.members return kwargs @@ -463,7 +463,6 @@ class ClubMembersView(ClubTabsMixin, CanViewMixin, DetailFormView): return resp def dispatch(self, request, *args, **kwargs): - self.request_user = request.user self.members = ( self.get_object().members.filter(end_date=None).order_by("-role").all() )