From c6caf5dbce1a516f6e717896f08008064866ec4f Mon Sep 17 00:00:00 2001 From: lsacienne Date: Wed, 20 Apr 2022 14:01:33 +0200 Subject: [PATCH 1/7] Add of restriction for refilling --- counter/models.py | 10 +++++++++- counter/templates/counter/counter_click.jinja | 2 +- counter/views.py | 3 ++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/counter/models.py b/counter/models.py index 3d3fef5b..6ec5796b 100644 --- a/counter/models.py +++ b/counter/models.py @@ -39,7 +39,7 @@ import os import base64 import datetime -from club.models import Club +from club.models import Club, Membership from accounting.models import CurrencyField from core.models import Group, User, Notification from subscription.models import Subscription @@ -342,6 +342,14 @@ class Counter(models.Model): """ return [b.id for b in self.get_barmen_list()] + def can_refill(self): + is_ae_member = False + ae = Club.objects.get(unix_name="ae") + for barman in self.get_barmen_list(): + if Membership.objects.filter(club=ae, user=barman): + is_ae_member = True + return is_ae_member + class Refilling(models.Model): """ diff --git a/counter/templates/counter/counter_click.jinja b/counter/templates/counter/counter_click.jinja index 06cb191b..b9238b89 100644 --- a/counter/templates/counter/counter_click.jinja +++ b/counter/templates/counter/counter_click.jinja @@ -107,7 +107,7 @@ - {% if counter.type == 'BAR' %} + {% if (counter.type == 'BAR' and barmens_can_refill) %}
{% trans %}Refilling{% endtrans %}
diff --git a/counter/views.py b/counter/views.py index e03831e1..2a46dc02 100644 --- a/counter/views.py +++ b/counter/views.py @@ -483,7 +483,7 @@ class CounterClick(CounterTabsMixin, CanViewMixin, DetailView): ]: return True else: - return False + return False def get_product(self, pid): return Product.objects.filter(pk=int(pid)).first() @@ -751,6 +751,7 @@ class CounterClick(CounterTabsMixin, CanViewMixin, DetailView): kwargs["basket_total"] = self.sum_basket(self.request) kwargs["refill_form"] = self.refill_form or RefillForm() kwargs["student_card_max_uid_size"] = StudentCard.UID_SIZE + kwargs["barmens_can_refill"] = self.object.can_refill() return kwargs From 15e2c8c7b3b211bb3048397e9165d9638fdab41d Mon Sep 17 00:00:00 2001 From: lsacienne Date: Wed, 27 Apr 2022 15:38:14 +0200 Subject: [PATCH 2/7] Fix the balck pipeline --- core/views/forms.py | 26 ++++++++++---------------- counter/views.py | 2 +- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/core/views/forms.py b/core/views/forms.py index 18081e01..955d3320 100644 --- a/core/views/forms.py +++ b/core/views/forms.py @@ -118,14 +118,11 @@ class SelectFile(TextInput): attrs["class"] = "select_file" else: attrs = {"class": "select_file"} - output = ( - '%(content)s
' - % { - "content": super(SelectFile, self).render(name, value, attrs, renderer), - "title": _("Choose file"), - "name": name, - } - ) + output = '%(content)s
' % { + "content": super(SelectFile, self).render(name, value, attrs, renderer), + "title": _("Choose file"), + "name": name, + } output += ( '
' - % { - "content": super(SelectUser, self).render(name, value, attrs, renderer), - "title": _("Choose user"), - "name": name, - } - ) + output = '%(content)s
' % { + "content": super(SelectUser, self).render(name, value, attrs, renderer), + "title": _("Choose user"), + "name": name, + } output += ( ' Date: Thu, 28 Apr 2022 11:13:07 +0200 Subject: [PATCH 4/7] Post request management --- counter/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/counter/views.py b/counter/views.py index a176ba6a..ff2ed6b1 100644 --- a/counter/views.py +++ b/counter/views.py @@ -725,7 +725,7 @@ class CounterClick(CounterTabsMixin, CanViewMixin, DetailView): def refill(self, request): """Refill the customer's account""" - if self.get_object().type == "BAR": + if self.get_object().type == "BAR" and self.object.can_refill(): form = RefillForm(request.POST) if form.is_valid(): form.instance.counter = self.object From b33839191d3d7aadfdf576247db7f90a8301a175 Mon Sep 17 00:00:00 2001 From: lsacienne Date: Thu, 28 Apr 2022 13:16:03 +0200 Subject: [PATCH 5/7] Fix black pipeline --- core/views/forms.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/core/views/forms.py b/core/views/forms.py index 955d3320..18081e01 100644 --- a/core/views/forms.py +++ b/core/views/forms.py @@ -118,11 +118,14 @@ class SelectFile(TextInput): attrs["class"] = "select_file" else: attrs = {"class": "select_file"} - output = '%(content)s
' % { - "content": super(SelectFile, self).render(name, value, attrs, renderer), - "title": _("Choose file"), - "name": name, - } + output = ( + '%(content)s
' + % { + "content": super(SelectFile, self).render(name, value, attrs, renderer), + "title": _("Choose file"), + "name": name, + } + ) output += ( '' + % { + "content": super(SelectUser, self).render(name, value, attrs, renderer), + "title": _("Choose user"), + "name": name, + } + ) output += ( ' Date: Thu, 5 May 2022 23:24:08 +0200 Subject: [PATCH 7/7] Add of tests --- core/management/commands/populate.py | 2 ++ counter/tests.py | 48 ++++++++++++++++++++++++++++ doc/devenv/populate.rst | 2 +- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/core/management/commands/populate.py b/core/management/commands/populate.py index 06c5d3f3..0c661b1d 100644 --- a/core/management/commands/populate.py +++ b/core/management/commands/populate.py @@ -611,6 +611,7 @@ Welcome to the wiki page! mde.products.add(cons) mde.products.add(dcons) mde.sellers.add(skia) + mde.save() eboutic = Counter.objects.filter(name="Eboutic").first() @@ -935,6 +936,7 @@ Welcome to the wiki page! # Add barman to counter c = Counter.objects.get(id=2) c.sellers.add(User.objects.get(pk=krophil.pk)) + mde.sellers.add(sli) c.save() # Create an election diff --git a/counter/tests.py b/counter/tests.py index c0a9b40e..70f75b06 100644 --- a/counter/tests.py +++ b/counter/tests.py @@ -36,7 +36,10 @@ class CounterTest(TestCase): def setUp(self): call_command("populate") self.skia = User.objects.filter(username="skia").first() + self.sli = User.objects.filter(username="sli").first() + self.krophil = User.objects.filter(username="krophil").first() self.mde = Counter.objects.filter(name="MDE").first() + self.foyer = Counter.objects.get(id=2) def test_full_click(self): response = self.client.post( @@ -93,6 +96,51 @@ class CounterTest(TestCase): in str(response_content) ) + response = self.client.post( + reverse("counter:login", kwargs={"counter_id": self.mde.id}), + {"username": self.sli.username, "password": "plop"}, + ) + + response = self.client.post( + location, + { + "action": "refill", + "amount": "5", + "payment_method": "CASH", + "bank": "OTHER", + }, + ) + + response = self.client.post( + reverse("counter:login", kwargs={"counter_id": self.foyer.id}), + {"username": self.krophil.username, "password": "plop"}, + ) + + response = self.client.get( + reverse("counter:details", kwargs={"counter_id": self.foyer.id}) + ) + + counter_token = re.search( + r'name="counter_token" value="([^"]*)"', str(response.content) + ).group(1) + + response = self.client.post( + reverse("counter:details", kwargs={"counter_id": self.foyer.id}), + {"code": "4000k", "counter_token": counter_token}, + ) + location = response.get("location") + + response = self.client.post( + location, + { + "action": "refill", + "amount": "5", + "payment_method": "CASH", + "bank": "OTHER", + }, + ) + self.assertTrue(response.status_code == 403) + class CounterStatsTest(TestCase): def setUp(self): diff --git a/doc/devenv/populate.rst b/doc/devenv/populate.rst index 53ea6de2..1fcd3dbf 100644 --- a/doc/devenv/populate.rst +++ b/doc/devenv/populate.rst @@ -45,7 +45,7 @@ Par défaut, la base de données du site de prod contient des données nécessai * **comptable** -> administrateur comptabilité * **guy** -> utilisateur non cotisant et sans groupe * **rbatsbak** -> utilisateur non cotisant et sans groupe - * **sli** -> cotisant avec carte étudiante attachée au compte + * **sli** -> cotisant avec carte étudiante attachée au compte, barmen MDE * **krophil** -> cotisant avec des plein d'écocups, barmen foyer * **comunity** -> administrateur communication * **tutu** -> administrateur pédagogie