error when no article is ordered

This commit is contained in:
Laetitia Getti 2023-05-12 16:53:25 +02:00
parent 78b8d355d5
commit 3a27af2085
6 changed files with 99 additions and 23 deletions

View file

@ -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),
),
]

View file

@ -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}"

View file

@ -59,20 +59,21 @@
{% endfor %}
</tbody>
</table>
{% if error_message %}<p class="has-text-danger">{{ error_message }}</p>{% endif %}
<br>
<p class="title">Vos informations</p>
<div class="columns">
<div class="column">
<p><label for="first_name">Prénom : </label>
<input id="first_name" type="text" name="first_name" required></p>
<input id="first_name" type="text" name="first_name" placeholder="Votre prénom" required></p>
<p><label for="first_name">Nom : </label>
<input id="last_name" type="text" name="last_name" required></p>
<input id="last_name" type="text" name="last_name" placeholder="Votre nom" required></p>
</div>
<div class="column">
<p><label for="phone">Numéro de téléphone :</label>
<input id="phone" type="text" name="phone" required></p>
<input id="phone" type="text" placeholder="0601020304" name="phone" required></p>
<p><label for="email">Adresse mail : </label>
<input id="email" type="text" name="email" required></p>
<input id="email" type="email" placeholder="exemple@mail.fr" name="email" required></p>
</div>
</div>

View file

@ -24,7 +24,7 @@
<ul>
{% for order in grouped_order.order_set.all %}
<li>
{{ order }} : [prix total]
{{ order }} : {{ order.articles_nb }}
</li>
{% endfor %}
</ul>

View file

@ -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:

View file

@ -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()