we cannot order when there is no item available

This commit is contained in:
Laetitia Getti 2023-06-19 17:57:53 +02:00 committed by Laetitia Getti
parent e4fabc4671
commit 04d3ab69a2
4 changed files with 150 additions and 3 deletions

View file

@ -137,7 +137,7 @@ class Item(models.Model):
def get_remaining_nb(self):
"""Returns the number of remaining articles for this item in this grouped order"""
if self.max_limit:
if self.max_limit is not None:
return self.max_limit - self.ordered_nb
else:
return None

View file

@ -65,7 +65,7 @@
<td>{{ item.name }}</td>
<td>{{ item.price }} €</td>
<td><input name="quantity_{{ item.id }}" size="2" type="number" value="0" min="0"></input>
{% if item.get_remaining_nb %}<span class="is-italic"> {{ item.get_remaining_nb }} disponibles</span>{% endif %}</td>
{% if item.get_remaining_nb is not null %}<span class="is-italic"> {{ item.get_remaining_nb }} {% if item.get_remaining_nb <= 1 %}disponible{% else %}disponibles{% endif %}</span>{% endif %}</td>
</tr>
{% endfor %}
</tbody>

View file

@ -395,6 +395,153 @@ class TestGroupedOrderDetailView:
assert "gr order test" in response.content.decode()
assert "Cette commande groupée est terminée" in response.content.decode()
def test_order_too_many_items(self, client, other_user):
"""a user orders more items than what is available. They get an error"""
grouped_order = create_grouped_order(
days_before_delivery_date=5,
days_before_deadline=2,
name="gr order test",
orga_user=other_user,
)
item = models.Item.objects.create(
name="test item 1", grouped_order=grouped_order, price=1, max_limit=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}": 2,
"first_name": "Prénom",
"last_name": "Nom",
"phone": "0645632569",
"email": "test@mail.fr",
},
)
assert response.status_code == 200
assert (
response.context["error_message"]
== "Trop de test item 1 commandés pour la quantité disponible"
)
assert not models.Order.objects.first()
assert not models.OrderAuthor.objects.first()
def test_order_no_item_available(self, client, other_user):
"""a user an item that is not available. They get an error"""
grouped_order = create_grouped_order(
days_before_delivery_date=5,
days_before_deadline=2,
name="gr order test",
orga_user=other_user,
)
item = models.Item.objects.create(
name="test item 1", grouped_order=grouped_order, price=1, max_limit=0
)
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}": 1,
"first_name": "Prénom",
"last_name": "Nom",
"phone": "0645632569",
"email": "test@mail.fr",
},
)
assert response.status_code == 200
assert (
response.context["error_message"]
== "Trop de test item 1 commandés pour la quantité disponible"
)
assert not models.Order.objects.first()
assert not models.OrderAuthor.objects.first()
def test_order_no_item_available_anymore(self, client, other_user):
"""a user an item that is not available anymore. They get an error"""
grouped_order = create_grouped_order(
days_before_delivery_date=5,
days_before_deadline=2,
name="gr order test",
orga_user=other_user,
)
item = models.Item.objects.create(
name="test item 1", grouped_order=grouped_order, price=1, max_limit=2
)
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}": 2,
"first_name": "Prénom",
"last_name": "Nom",
"phone": "0645632569",
"email": "test@mail.fr",
},
)
assert response.status_code == 302 # success : first order
response = client.post(
order_url,
{
f"quantity_{item.pk}": 1,
"first_name": "Prénom",
"last_name": "Nom",
"phone": "0645632569",
"email": "test@mail.fr",
},
)
assert response.status_code == 200 # error
assert (
response.context["error_message"]
== "Trop de test item 1 commandés pour la quantité disponible"
)
class TestGroupedOrderOverview:
def test_get_overview(self, client_log):

View file

@ -245,7 +245,7 @@ def validate_item_ordered_nb(item, ordered_nb):
or if the ordered nb is negative"""
if ordered_nb < 0:
return f"Veuillez commander un nombre positif de {item.name}"
if item.get_remaining_nb() and item.get_remaining_nb() - ordered_nb < 0:
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 None