diff --git a/la_chariotte/order/templates/order/grouped_order_detail.html b/la_chariotte/order/templates/order/grouped_order_detail.html index 4656e42..fa9e947 100644 --- a/la_chariotte/order/templates/order/grouped_order_detail.html +++ b/la_chariotte/order/templates/order/grouped_order_detail.html @@ -98,7 +98,7 @@ diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index 1940b19..4acd77e 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -237,6 +237,9 @@ class TestGroupedOrderDetailView: item2 = models.Item.objects.create( name="test item 2", grouped_order=grouped_order, price=5 ) + item3 = models.Item.objects.create( + name="test item 3", grouped_order=grouped_order, price=5 + ) detail_url = reverse( "order:grouped_order_detail", kwargs={ @@ -250,6 +253,8 @@ class TestGroupedOrderDetailView: assert "20 disponibles" in response.content.decode() assert item.ordered_nb == 0 assert item2.ordered_nb == 0 + assert item3.ordered_nb == 0 + assert models.OrderedItem.objects.count() == 0 order_url = reverse( "order:order", kwargs={ @@ -259,8 +264,9 @@ class TestGroupedOrderDetailView: response = client.post( order_url, { - f"quantity_{item.pk}": 4, - f"quantity_{item2.pk}": 1, + f"quantity_{item.pk}": [4, 0], + f"quantity_{item2.pk}": [1, 0], + f"quantity_{item3.pk}": [0, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", @@ -288,6 +294,8 @@ class TestGroupedOrderDetailView: assert order.articles_nb == 5 assert order.price == 9 assert item.get_remaining_nb() == 16 + # OrderedItems are not created when the ordered quantity is 0 + assert models.OrderedItem.objects.count() == 2 def test_order_item__no_articles_ordered(self, client, other_user): """ @@ -324,7 +332,7 @@ class TestGroupedOrderDetailView: response = client.post( order_url, { - f"quantity_{item.pk}": 0, + f"quantity_{item.pk}": [0, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", @@ -645,7 +653,7 @@ class TestGroupedOrderOverview: client_log.post( order_url, { - f"quantity_{item.pk}": 4, + f"quantity_{item.pk}": [4, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", @@ -789,7 +797,7 @@ class TestOrder: response = client.post( order_url, { - f"quantity_{item.pk}": 4, + f"quantity_{item.pk}": [4, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", @@ -835,8 +843,8 @@ class TestOrder: response = client.post( order_url, { - f"quantity_{item.pk}": 4, - f"quantity_{item2.pk}": 25, + f"quantity_{item.pk}": [0, 4], + f"quantity_{item2.pk}": [0, 25], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", @@ -858,8 +866,8 @@ class TestOrder: def test_negative_nb_ordered(self, client, other_user): """If a user orders a negative nb of articles for an item, - the form is displayed again with an error. - The OrderedItems, OrderAuthor and Order are deleted.""" + we consider they ordered 0. + (but it is also blocked by fronted)""" grouped_order = create_grouped_order( days_before_delivery_date=5, days_before_deadline=2, @@ -893,26 +901,31 @@ class TestOrder: response = client.post( order_url, { - f"quantity_{item.pk}": 4, - f"quantity_{item2.pk}": -2, + f"quantity_{item.pk}": [4, 0], + f"quantity_{item2.pk}": [-2, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", "email": "test@mail.fr", }, ) - assert response.status_code == 200 - assert ( - response.context["error_message"] - == "Veuillez commander un nombre positif de test item 2" + assert response.status_code == 302 + order = models.Order.objects.get(grouped_order=grouped_order.pk) + assert response.url == reverse( + "order:order_confirm", + kwargs={ + "grouped_order_id": grouped_order.pk, + "pk": order.pk, + }, ) item.refresh_from_db() item2.refresh_from_db() - assert item.ordered_nb == 0 + assert models.OrderAuthor.objects.first().first_name == "Prénom" + assert models.OrderAuthor.objects.first().email == "test@mail.fr" + assert models.OrderAuthor.objects.first().phone == "0645632569" + assert item.ordered_nb == 4 assert item2.ordered_nb == 0 - assert not models.OrderAuthor.objects.first() - assert not models.Order.objects.first() - assert not models.OrderedItem.objects.first() + assert order.ordered_items.count() == 1 class TestGroupedOrderCreateView: diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index 61cafb0..603aad8 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -174,11 +174,22 @@ def order(request, grouped_order_id): if not grouped_order.is_ongoing(): return http.HttpResponseForbidden() - # get a dict with (quantity_{{item_id}}:{{quantity}}) + # get a dict with quantity_{{item_id}}:[ {{ quantity on phone }},{{ quantity on desktop }} ] orders_dict = { - key: value for key, value in request.POST.items() if key.startswith("quantity") + key: request.POST.getlist(key) + for key, value in request.POST.items() + if key.startswith("quantity") } + # transform it into quantity_{{item_id}}: {{ greatest of the two quantities }} + for i in orders_dict: + value = ( + orders_dict[i][0] + if orders_dict[i][0] >= orders_dict[i][1] + else orders_dict[i][1] + ) + orders_dict[i] = value + # create an order first_name = request.POST["first_name"] last_name = request.POST["last_name"] @@ -243,11 +254,8 @@ def order(request, grouped_order_id): def validate_item_ordered_nb(item, ordered_nb): - """Returns an error message if the ordered items are not available - 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() is not None and item.get_remaining_nb() - ordered_nb < 0: + """Returns an error message if the ordered items are not available""" + if item.get_remaining_nb() and item.get_remaining_nb() - ordered_nb < 0: return f"Trop de {item.name} commandés pour la quantité disponible" return None