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 @@
{% for order in grouped_order.order_set.all %}
-
- {{ order }} : [prix total]
+ {{ order }} : {{ order.articles_nb }}
{% endfor %}
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()