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