fix for orders with cards on mobile

This commit is contained in:
Laetitia Getti 2023-06-16 17:24:11 +02:00
parent e87511a266
commit ef00d0b367
3 changed files with 48 additions and 27 deletions

View file

@ -98,7 +98,7 @@
</div> </div>
<div class="card-footer-item"> <div class="card-footer-item">
<input name="quantity_{{ item.id }}" size="2" type="number" value="0" min="0"></input> <input name="quantity_{{ item.id }}" size="2" type="number" value="0" min="0"></input>
{% if item.get_remaining_nb %}<span class="is-italic mini-title"> {{ item.get_remaining_nb }} disponibles</span>{% endif %} {% if item.get_remaining_nb %}<span class="is-italic mini-title"> {{ item.get_remaining_nb }} {% if item.get_remaining_nb == 1 %}disponible{% else %}disponibles{% endif %}</span>{% endif %}
</div> </div>
</div> </div>
</div> </div>

View file

@ -237,6 +237,9 @@ class TestGroupedOrderDetailView:
item2 = models.Item.objects.create( item2 = models.Item.objects.create(
name="test item 2", grouped_order=grouped_order, price=5 name="test item 2", grouped_order=grouped_order, price=5
) )
item3 = models.Item.objects.create(
name="test item 3", grouped_order=grouped_order, price=5
)
detail_url = reverse( detail_url = reverse(
"order:grouped_order_detail", "order:grouped_order_detail",
kwargs={ kwargs={
@ -250,6 +253,8 @@ class TestGroupedOrderDetailView:
assert "20 disponibles" in response.content.decode() assert "20 disponibles" in response.content.decode()
assert item.ordered_nb == 0 assert item.ordered_nb == 0
assert item2.ordered_nb == 0 assert item2.ordered_nb == 0
assert item3.ordered_nb == 0
assert models.OrderedItem.objects.count() == 0
order_url = reverse( order_url = reverse(
"order:order", "order:order",
kwargs={ kwargs={
@ -259,8 +264,9 @@ class TestGroupedOrderDetailView:
response = client.post( response = client.post(
order_url, order_url,
{ {
f"quantity_{item.pk}": 4, f"quantity_{item.pk}": [4, 0],
f"quantity_{item2.pk}": 1, f"quantity_{item2.pk}": [1, 0],
f"quantity_{item3.pk}": [0, 0],
"first_name": "Prénom", "first_name": "Prénom",
"last_name": "Nom", "last_name": "Nom",
"phone": "0645632569", "phone": "0645632569",
@ -288,6 +294,8 @@ class TestGroupedOrderDetailView:
assert order.articles_nb == 5 assert order.articles_nb == 5
assert order.price == 9 assert order.price == 9
assert item.get_remaining_nb() == 16 assert item.get_remaining_nb() == 16
# OrderedItems are not created when the ordered quantity is 0
assert models.OrderedItem.objects.count() == 2
def test_order_item__no_articles_ordered(self, client, other_user): def test_order_item__no_articles_ordered(self, client, other_user):
""" """
@ -324,7 +332,7 @@ class TestGroupedOrderDetailView:
response = client.post( response = client.post(
order_url, order_url,
{ {
f"quantity_{item.pk}": 0, f"quantity_{item.pk}": [0, 0],
"first_name": "Prénom", "first_name": "Prénom",
"last_name": "Nom", "last_name": "Nom",
"phone": "0645632569", "phone": "0645632569",
@ -645,7 +653,7 @@ class TestGroupedOrderOverview:
client_log.post( client_log.post(
order_url, order_url,
{ {
f"quantity_{item.pk}": 4, f"quantity_{item.pk}": [4, 0],
"first_name": "Prénom", "first_name": "Prénom",
"last_name": "Nom", "last_name": "Nom",
"phone": "0645632569", "phone": "0645632569",
@ -789,7 +797,7 @@ class TestOrder:
response = client.post( response = client.post(
order_url, order_url,
{ {
f"quantity_{item.pk}": 4, f"quantity_{item.pk}": [4, 0],
"first_name": "Prénom", "first_name": "Prénom",
"last_name": "Nom", "last_name": "Nom",
"phone": "0645632569", "phone": "0645632569",
@ -835,8 +843,8 @@ class TestOrder:
response = client.post( response = client.post(
order_url, order_url,
{ {
f"quantity_{item.pk}": 4, f"quantity_{item.pk}": [0, 4],
f"quantity_{item2.pk}": 25, f"quantity_{item2.pk}": [0, 25],
"first_name": "Prénom", "first_name": "Prénom",
"last_name": "Nom", "last_name": "Nom",
"phone": "0645632569", "phone": "0645632569",
@ -858,8 +866,8 @@ class TestOrder:
def test_negative_nb_ordered(self, client, other_user): def test_negative_nb_ordered(self, client, other_user):
"""If a user orders a negative nb of articles for an item, """If a user orders a negative nb of articles for an item,
the form is displayed again with an error. we consider they ordered 0.
The OrderedItems, OrderAuthor and Order are deleted.""" (but it is also blocked by fronted)"""
grouped_order = create_grouped_order( grouped_order = create_grouped_order(
days_before_delivery_date=5, days_before_delivery_date=5,
days_before_deadline=2, days_before_deadline=2,
@ -893,26 +901,31 @@ class TestOrder:
response = client.post( response = client.post(
order_url, order_url,
{ {
f"quantity_{item.pk}": 4, f"quantity_{item.pk}": [4, 0],
f"quantity_{item2.pk}": -2, f"quantity_{item2.pk}": [-2, 0],
"first_name": "Prénom", "first_name": "Prénom",
"last_name": "Nom", "last_name": "Nom",
"phone": "0645632569", "phone": "0645632569",
"email": "test@mail.fr", "email": "test@mail.fr",
}, },
) )
assert response.status_code == 200 assert response.status_code == 302
assert ( order = models.Order.objects.get(grouped_order=grouped_order.pk)
response.context["error_message"] assert response.url == reverse(
== "Veuillez commander un nombre positif de test item 2" "order:order_confirm",
kwargs={
"grouped_order_id": grouped_order.pk,
"pk": order.pk,
},
) )
item.refresh_from_db() item.refresh_from_db()
item2.refresh_from_db() item2.refresh_from_db()
assert item.ordered_nb == 0 assert models.OrderAuthor.objects.first().first_name == "Prénom"
assert models.OrderAuthor.objects.first().email == "test@mail.fr"
assert models.OrderAuthor.objects.first().phone == "0645632569"
assert item.ordered_nb == 4
assert item2.ordered_nb == 0 assert item2.ordered_nb == 0
assert not models.OrderAuthor.objects.first() assert order.ordered_items.count() == 1
assert not models.Order.objects.first()
assert not models.OrderedItem.objects.first()
class TestGroupedOrderCreateView: class TestGroupedOrderCreateView:

View file

@ -174,11 +174,22 @@ def order(request, grouped_order_id):
if not grouped_order.is_ongoing(): if not grouped_order.is_ongoing():
return http.HttpResponseForbidden() return http.HttpResponseForbidden()
# get a dict with (quantity_{{item_id}}:{{quantity}}) # get a dict with quantity_{{item_id}}:[ {{ quantity on phone }},{{ quantity on desktop }} ]
orders_dict = { orders_dict = {
key: value for key, value in request.POST.items() if key.startswith("quantity") key: request.POST.getlist(key)
for key, value in request.POST.items()
if key.startswith("quantity")
} }
# transform it into quantity_{{item_id}}: {{ greatest of the two quantities }}
for i in orders_dict:
value = (
orders_dict[i][0]
if orders_dict[i][0] >= orders_dict[i][1]
else orders_dict[i][1]
)
orders_dict[i] = value
# create an order # create an order
first_name = request.POST["first_name"] first_name = request.POST["first_name"]
last_name = request.POST["last_name"] last_name = request.POST["last_name"]
@ -243,11 +254,8 @@ def order(request, grouped_order_id):
def validate_item_ordered_nb(item, ordered_nb): def validate_item_ordered_nb(item, ordered_nb):
"""Returns an error message if the ordered items are not available """Returns an error message if the ordered items are not available"""
or if the ordered nb is negative""" if item.get_remaining_nb() and item.get_remaining_nb() - ordered_nb < 0:
if ordered_nb < 0:
return f"Veuillez commander un nombre positif de {item.name}"
if item.get_remaining_nb() is not None and item.get_remaining_nb() - ordered_nb < 0:
return f"Trop de {item.name} commandés pour la quantité disponible" return f"Trop de {item.name} commandés pour la quantité disponible"
return None return None