From 3a27af20854ff99ec57b91667d4568f73b67d1e8 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Fri, 12 May 2023 16:53:25 +0200 Subject: [PATCH] error when no article is ordered --- .../migrations/0018_order_articles_nb.py | 17 +++++++ la_chariotte/order/models.py | 1 + .../templates/order/grouped_order_detail.html | 9 ++-- .../order/grouped_order_overview.html | 2 +- la_chariotte/order/tests/test_views.py | 50 +++++++++++++++++++ la_chariotte/order/views.py | 43 +++++++++------- 6 files changed, 99 insertions(+), 23 deletions(-) create mode 100644 la_chariotte/order/migrations/0018_order_articles_nb.py diff --git a/la_chariotte/order/migrations/0018_order_articles_nb.py b/la_chariotte/order/migrations/0018_order_articles_nb.py new file mode 100644 index 0000000..01379d7 --- /dev/null +++ b/la_chariotte/order/migrations/0018_order_articles_nb.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2 on 2023-05-12 14:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("order", "0017_orderauthor_alter_order_author"), + ] + + operations = [ + migrations.AddField( + model_name="order", + name="articles_nb", + field=models.PositiveIntegerField(default=0), + ), + ] diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index c3d7e77..c9a1f19 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -78,6 +78,7 @@ class Order(models.Model): GroupedOrder, on_delete=models.CASCADE, related_name="order_set" ) author = models.ForeignKey(OrderAuthor, on_delete=models.CASCADE) + articles_nb = models.PositiveIntegerField(default=0) def __str__(self): # pragma: no cover return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}" diff --git a/la_chariotte/order/templates/order/grouped_order_detail.html b/la_chariotte/order/templates/order/grouped_order_detail.html index 1fef291..cee5cd3 100644 --- a/la_chariotte/order/templates/order/grouped_order_detail.html +++ b/la_chariotte/order/templates/order/grouped_order_detail.html @@ -59,20 +59,21 @@ {% endfor %} + {% if error_message %}

{{ error_message }}

{% endif %}

Vos informations

-

+

-

+

-

+

-

+

diff --git a/la_chariotte/order/templates/order/grouped_order_overview.html b/la_chariotte/order/templates/order/grouped_order_overview.html index 6539404..08293a5 100644 --- a/la_chariotte/order/templates/order/grouped_order_overview.html +++ b/la_chariotte/order/templates/order/grouped_order_overview.html @@ -24,7 +24,7 @@ diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index d7c7777..00d7d5e 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -262,6 +262,56 @@ class TestGroupedOrderDetailView: assert item2.ordered_nb == 1 order = Order.objects.first() assert order.ordered_items.count() == 2 + assert order.articles_nb == 5 + + def test_order_item__no_articles_ordered(self, client, other_user): + """ + From the OrderDetailView, we order without having changed any item quantity. + An error is raised. + """ + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=other_user, + ) + item = Item.objects.create( + name="test item 1", grouped_order=grouped_order, price=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}": 0, + "first_name": "Prénom", + "last_name": "Nom", + "phone": "0645632569", + "email": "test@mail.fr", + }, + ) + order = Order.objects.first() + order.articles_nb == 0 + assert response.status_code == 200 + assert ( + response.context["error_message"] + == "Veuillez commander au moins un produit" + ) class TestGroupedOrderOverview: diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index 90fd1eb..3348de2 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -127,33 +127,31 @@ class ItemCreateView(UserPassesTestMixin, generic.CreateView): def order(request, grouped_order_id): """Creates an AnonymousUser, and an Order for this GroupedOrder, with related OrderedItems""" grouped_order = get_object_or_404(GroupedOrder, pk=grouped_order_id) - try: - # get a dict with (quantity_{{item_id}}:{{quantity}}) - orders_dict = { - k: v for k, v in request.POST.items() if k.startswith("quantity") - } - first_name = request.POST["first_name"] - last_name = request.POST["last_name"] - phone = request.POST["phone"] - email = request.POST["email"] - # selected_item = grouped_order.item_set.get(pk=request.POST["item"]) - except (KeyError, Item.DoesNotExist): + # get a dict with (quantity_{{item_id}}:{{quantity}}) + orders_dict = {k: v for k, v in request.POST.items() if k.startswith("quantity")} + first_name = request.POST["first_name"] + last_name = request.POST["last_name"] + phone = request.POST["phone"] + email = request.POST["email"] + # selected_item = grouped_order.item_set.get(pk=request.POST["item"]) + author = OrderAuthor.objects.create(first_name=first_name, last_name=last_name) + order = Order.objects.create(author=author, grouped_order=grouped_order) + for k, v in orders_dict.items(): + item = grouped_order.item_set.get(pk=k.split("_")[1]) + OrderedItem.objects.create(nb=v, order=order, item=item) + compute_ordered_nb(item) + compute_order_articles_nb(order) + if order.articles_nb == 0: # Redisplay the order form for this grouped order. return render( request, "order/grouped_order_detail.html", { "grouped_order": grouped_order, - "error_message": "Veuillez remplir tous les champs", + "error_message": "Veuillez commander au moins un produit", }, ) else: - author = OrderAuthor.objects.create(first_name=first_name, last_name=last_name) - order = Order.objects.create(author=author, grouped_order=grouped_order) - for k, v in orders_dict.items(): - item = grouped_order.item_set.get(pk=k.split("_")[1]) - OrderedItem.objects.create(nb=v, order=order, item=item) - compute_ordered_nb(item) # Always return an HttpResponseRedirect after successfully dealing # with POST data. This prevents data from being posted twice if a # user hits the Back button. @@ -169,3 +167,12 @@ def compute_ordered_nb(item): ordered_nb += order.nb item.ordered_nb = ordered_nb item.save() + + +def compute_order_articles_nb(order): + """Computes the number of articles in a given order""" + articles_nb = 0 + for ord_item in order.ordered_items.all(): + articles_nb += ord_item.nb + order.articles_nb = articles_nb + order.save()