mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-01 11:22:24 +02:00
error when no article is ordered
This commit is contained in:
parent
78b8d355d5
commit
3a27af2085
6 changed files with 99 additions and 23 deletions
17
la_chariotte/order/migrations/0018_order_articles_nb.py
Normal file
17
la_chariotte/order/migrations/0018_order_articles_nb.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -78,6 +78,7 @@ class Order(models.Model):
|
||||||
GroupedOrder, on_delete=models.CASCADE, related_name="order_set"
|
GroupedOrder, on_delete=models.CASCADE, related_name="order_set"
|
||||||
)
|
)
|
||||||
author = models.ForeignKey(OrderAuthor, on_delete=models.CASCADE)
|
author = models.ForeignKey(OrderAuthor, on_delete=models.CASCADE)
|
||||||
|
articles_nb = models.PositiveIntegerField(default=0)
|
||||||
|
|
||||||
def __str__(self): # pragma: no cover
|
def __str__(self): # pragma: no cover
|
||||||
return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}"
|
return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}"
|
||||||
|
|
|
@ -59,20 +59,21 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
{% if error_message %}<p class="has-text-danger">{{ error_message }}</p>{% endif %}
|
||||||
<br>
|
<br>
|
||||||
<p class="title">Vos informations</p>
|
<p class="title">Vos informations</p>
|
||||||
<div class="columns">
|
<div class="columns">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<p><label for="first_name">Prénom : </label>
|
<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>
|
<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>
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<p><label for="phone">Numéro de téléphone :</label>
|
<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>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<ul>
|
<ul>
|
||||||
{% for order in grouped_order.order_set.all %}
|
{% for order in grouped_order.order_set.all %}
|
||||||
<li>
|
<li>
|
||||||
{{ order }} : [prix total]
|
{{ order }} : {{ order.articles_nb }}
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -262,6 +262,56 @@ class TestGroupedOrderDetailView:
|
||||||
assert item2.ordered_nb == 1
|
assert item2.ordered_nb == 1
|
||||||
order = Order.objects.first()
|
order = Order.objects.first()
|
||||||
assert order.ordered_items.count() == 2
|
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:
|
class TestGroupedOrderOverview:
|
||||||
|
|
|
@ -127,33 +127,31 @@ class ItemCreateView(UserPassesTestMixin, generic.CreateView):
|
||||||
def order(request, grouped_order_id):
|
def order(request, grouped_order_id):
|
||||||
"""Creates an AnonymousUser, and an Order for this GroupedOrder, with related OrderedItems"""
|
"""Creates an AnonymousUser, and an Order for this GroupedOrder, with related OrderedItems"""
|
||||||
grouped_order = get_object_or_404(GroupedOrder, pk=grouped_order_id)
|
grouped_order = get_object_or_404(GroupedOrder, pk=grouped_order_id)
|
||||||
try:
|
# get a dict with (quantity_{{item_id}}:{{quantity}})
|
||||||
# get a dict with (quantity_{{item_id}}:{{quantity}})
|
orders_dict = {k: v for k, v in request.POST.items() if k.startswith("quantity")}
|
||||||
orders_dict = {
|
first_name = request.POST["first_name"]
|
||||||
k: v for k, v in request.POST.items() if k.startswith("quantity")
|
last_name = request.POST["last_name"]
|
||||||
}
|
phone = request.POST["phone"]
|
||||||
first_name = request.POST["first_name"]
|
email = request.POST["email"]
|
||||||
last_name = request.POST["last_name"]
|
# selected_item = grouped_order.item_set.get(pk=request.POST["item"])
|
||||||
phone = request.POST["phone"]
|
author = OrderAuthor.objects.create(first_name=first_name, last_name=last_name)
|
||||||
email = request.POST["email"]
|
order = Order.objects.create(author=author, grouped_order=grouped_order)
|
||||||
# selected_item = grouped_order.item_set.get(pk=request.POST["item"])
|
for k, v in orders_dict.items():
|
||||||
except (KeyError, Item.DoesNotExist):
|
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.
|
# Redisplay the order form for this grouped order.
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"order/grouped_order_detail.html",
|
"order/grouped_order_detail.html",
|
||||||
{
|
{
|
||||||
"grouped_order": grouped_order,
|
"grouped_order": grouped_order,
|
||||||
"error_message": "Veuillez remplir tous les champs",
|
"error_message": "Veuillez commander au moins un produit",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
else:
|
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
|
# Always return an HttpResponseRedirect after successfully dealing
|
||||||
# with POST data. This prevents data from being posted twice if a
|
# with POST data. This prevents data from being posted twice if a
|
||||||
# user hits the Back button.
|
# user hits the Back button.
|
||||||
|
@ -169,3 +167,12 @@ def compute_ordered_nb(item):
|
||||||
ordered_nb += order.nb
|
ordered_nb += order.nb
|
||||||
item.ordered_nb = ordered_nb
|
item.ordered_nb = ordered_nb
|
||||||
item.save()
|
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()
|
||||||
|
|
Loading…
Reference in a new issue