From 04d3ab69a25161414020c111872a36d9f947fdc8 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Mon, 19 Jun 2023 17:57:53 +0200 Subject: [PATCH] we cannot order when there is no item available --- la_chariotte/order/models.py | 2 +- .../templates/order/grouped_order_detail.html | 2 +- la_chariotte/order/tests/test_views.py | 147 ++++++++++++++++++ la_chariotte/order/views.py | 2 +- 4 files changed, 150 insertions(+), 3 deletions(-) diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index 70bc93b..7329c72 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -137,7 +137,7 @@ class Item(models.Model): def get_remaining_nb(self): """Returns the number of remaining articles for this item in this grouped order""" - if self.max_limit: + if self.max_limit is not None: return self.max_limit - self.ordered_nb else: return None diff --git a/la_chariotte/order/templates/order/grouped_order_detail.html b/la_chariotte/order/templates/order/grouped_order_detail.html index f2366d2..e9fb726 100644 --- a/la_chariotte/order/templates/order/grouped_order_detail.html +++ b/la_chariotte/order/templates/order/grouped_order_detail.html @@ -65,7 +65,7 @@ {{ item.name }} {{ item.price }} € - {% if item.get_remaining_nb %} {{ item.get_remaining_nb }} disponibles{% endif %} + {% if item.get_remaining_nb is not null %} {{ item.get_remaining_nb }} {% if item.get_remaining_nb <= 1 %}disponible{% else %}disponibles{% endif %}{% endif %} {% endfor %} diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index 643b718..fb0a01f 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -395,6 +395,153 @@ class TestGroupedOrderDetailView: assert "gr order test" in response.content.decode() assert "Cette commande groupée est terminée" in response.content.decode() + def test_order_too_many_items(self, client, other_user): + """a user orders more items than what is available. They get an error""" + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=other_user, + ) + item = models.Item.objects.create( + name="test item 1", grouped_order=grouped_order, price=1, max_limit=1 + ) + detail_url = reverse( + "order:grouped_order_detail", + kwargs={ + "pk": grouped_order.pk, + }, + ) + response = client.get(detail_url) + assert response.status_code == 200 + assert "test item" in response.content.decode() + assert "gr order test" in response.content.decode() + assert item.ordered_nb == 0 + order_url = reverse( + "order:order", + kwargs={ + "grouped_order_id": grouped_order.pk, + }, + ) + response = client.post( + order_url, + { + f"quantity_{item.pk}": 2, + "first_name": "Prénom", + "last_name": "Nom", + "phone": "0645632569", + "email": "test@mail.fr", + }, + ) + assert response.status_code == 200 + assert ( + response.context["error_message"] + == "Trop de test item 1 commandés pour la quantité disponible" + ) + assert not models.Order.objects.first() + assert not models.OrderAuthor.objects.first() + + def test_order_no_item_available(self, client, other_user): + """a user an item that is not available. They get an error""" + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=other_user, + ) + item = models.Item.objects.create( + name="test item 1", grouped_order=grouped_order, price=1, max_limit=0 + ) + detail_url = reverse( + "order:grouped_order_detail", + kwargs={ + "pk": grouped_order.pk, + }, + ) + response = client.get(detail_url) + assert response.status_code == 200 + assert "test item" in response.content.decode() + assert "gr order test" in response.content.decode() + assert item.ordered_nb == 0 + order_url = reverse( + "order:order", + kwargs={ + "grouped_order_id": grouped_order.pk, + }, + ) + response = client.post( + order_url, + { + f"quantity_{item.pk}": 1, + "first_name": "Prénom", + "last_name": "Nom", + "phone": "0645632569", + "email": "test@mail.fr", + }, + ) + assert response.status_code == 200 + assert ( + response.context["error_message"] + == "Trop de test item 1 commandés pour la quantité disponible" + ) + assert not models.Order.objects.first() + assert not models.OrderAuthor.objects.first() + + def test_order_no_item_available_anymore(self, client, other_user): + """a user an item that is not available anymore. They get an error""" + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=other_user, + ) + item = models.Item.objects.create( + name="test item 1", grouped_order=grouped_order, price=1, max_limit=2 + ) + detail_url = reverse( + "order:grouped_order_detail", + kwargs={ + "pk": grouped_order.pk, + }, + ) + response = client.get(detail_url) + assert response.status_code == 200 + assert "test item" in response.content.decode() + assert "gr order test" in response.content.decode() + assert item.ordered_nb == 0 + order_url = reverse( + "order:order", + kwargs={ + "grouped_order_id": grouped_order.pk, + }, + ) + response = client.post( + order_url, + { + f"quantity_{item.pk}": 2, + "first_name": "Prénom", + "last_name": "Nom", + "phone": "0645632569", + "email": "test@mail.fr", + }, + ) + assert response.status_code == 302 # success : first order + response = client.post( + order_url, + { + f"quantity_{item.pk}": 1, + "first_name": "Prénom", + "last_name": "Nom", + "phone": "0645632569", + "email": "test@mail.fr", + }, + ) + assert response.status_code == 200 # error + assert ( + response.context["error_message"] + == "Trop de test item 1 commandés pour la quantité disponible" + ) + class TestGroupedOrderOverview: def test_get_overview(self, client_log): diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index 68a0544..1fa091b 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -245,7 +245,7 @@ def validate_item_ordered_nb(item, ordered_nb): or if the ordered nb is negative""" if ordered_nb < 0: return f"Veuillez commander un nombre positif de {item.name}" - if item.get_remaining_nb() and item.get_remaining_nb() - ordered_nb < 0: + if item.get_remaining_nb() is not None and item.get_remaining_nb() - ordered_nb < 0: return f"Trop de {item.name} commandés pour la quantité disponible" return None