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"
|
||||
)
|
||||
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}"
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
<ul>
|
||||
{% for order in grouped_order.order_set.all %}
|
||||
<li>
|
||||
{{ order }} : [prix total]
|
||||
{{ order }} : {{ order.articles_nb }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue