Pour vous aider à distribuer les produits le jour J, vous pouvez imprimer la liste des commandes :
diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py
index b5c2cff..869bae0 100644
--- a/la_chariotte/order/tests/test_views.py
+++ b/la_chariotte/order/tests/test_views.py
@@ -336,6 +336,62 @@ class TestGroupedOrderDetailView:
== "Veuillez commander au moins un produit"
)
+ def test_deadline_passed(self, client, other_user):
+ """
+ If the deadline is passed, the user sees a message but cannot order
+ """
+ grouped_order = create_grouped_order(
+ days_before_delivery_date=5,
+ days_before_deadline=-1,
+ name="gr order test",
+ orga_user=other_user,
+ )
+ item = models.Item.objects.create(
+ name="test item 1", grouped_order=grouped_order, price=1
+ )
+ item2 = models.Item.objects.create(
+ name="test item 2", grouped_order=grouped_order, price=5
+ )
+ 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" not in response.content.decode()
+ assert "gr order test" in response.content.decode()
+ assert "La période de commande est terminée" in response.content.decode()
+
+ def test_delivery_passed(self, client, other_user):
+ """
+ If the delivery date is passed, the user sees a message but cannot order
+ """
+ grouped_order = create_grouped_order(
+ days_before_delivery_date=-1,
+ 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
+ )
+ item2 = models.Item.objects.create(
+ name="test item 2", grouped_order=grouped_order, price=5
+ )
+ 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" not in response.content.decode()
+ assert "gr order test" in response.content.decode()
+ assert "Cette commande groupée est terminée" in response.content.decode()
+
class TestGroupedOrderOverview:
def test_get_overview(self, client_log):
@@ -432,6 +488,95 @@ class TestGroupedOrderOverview:
response = client_log.get(orga_view_url)
assert response.status_code == 403
+ def test_deadline_passed(self, client_log):
+ """
+ If the deadline is passed, the user sees a message but cannot share link
+ """
+ grouped_order = create_grouped_order(
+ days_before_delivery_date=5,
+ days_before_deadline=-1,
+ name="gr order test",
+ orga_user=auth.get_user(client_log),
+ )
+ item = models.Item.objects.create(
+ name="test item 1", grouped_order=grouped_order, price=1
+ )
+ item2 = models.Item.objects.create(
+ name="test item 2", grouped_order=grouped_order, price=5
+ )
+ orga_view_url = reverse(
+ "order:grouped_order_overview",
+ kwargs={
+ "pk": grouped_order.pk,
+ },
+ )
+ response = client_log.get(orga_view_url)
+ assert response.status_code == 200
+ assert "Pour partager cette commande" not in response.content.decode()
+ assert "gr order test" in response.content.decode()
+ assert "La période de commande est terminée" in response.content.decode()
+
+ def test_delivery_passed(self, client_log):
+ """
+ If the delivery date is passed, the user sees a message but cannot share link
+ """
+ grouped_order = create_grouped_order(
+ days_before_delivery_date=-1,
+ days_before_deadline=-2,
+ name="gr order test",
+ orga_user=auth.get_user(client_log),
+ )
+ item = models.Item.objects.create(
+ name="test item 1", grouped_order=grouped_order, price=1
+ )
+ item2 = models.Item.objects.create(
+ name="test item 2", grouped_order=grouped_order, price=5
+ )
+ orga_view_url = reverse(
+ "order:grouped_order_overview",
+ kwargs={
+ "pk": grouped_order.pk,
+ },
+ )
+ response = client_log.get(orga_view_url)
+ assert response.status_code == 200
+ assert "Pour partager cette commande" not in response.content.decode()
+ assert "gr order test" in response.content.decode()
+ assert "Cette commande groupée est terminée" in response.content.decode()
+
+
+class TestOrder:
+ def test_order_deadline_passed(self, client, other_user):
+ """A user orders when the deadline is passed. They get a 403 error"""
+ grouped_order = create_grouped_order(
+ days_before_delivery_date=5,
+ days_before_deadline=-1,
+ name="gr order test",
+ orga_user=other_user,
+ )
+ item = models.Item.objects.create(
+ name="test item 1", grouped_order=grouped_order, price=2
+ )
+
+ # some items are ordered
+ order_url = reverse(
+ "order:order",
+ kwargs={
+ "grouped_order_id": grouped_order.pk,
+ },
+ )
+ response = client.post(
+ order_url,
+ {
+ f"quantity_{item.pk}": 4,
+ "first_name": "Prénom",
+ "last_name": "Nom",
+ "phone": "0645632569",
+ "email": "test@mail.fr",
+ },
+ )
+ assert response.status_code == 403
+
class TestGroupedOrderCreateView:
def test_create_grouped_order(self, client_log):
diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py
index edd0e23..59de77f 100644
--- a/la_chariotte/order/views.py
+++ b/la_chariotte/order/views.py
@@ -1,7 +1,7 @@
from io import BytesIO
+from django import http
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
-from django.http import FileResponse, HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.template.loader import get_template
from django.urls import reverse, reverse_lazy
@@ -144,6 +144,8 @@ 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)
+ if not grouped_order.is_ongoing():
+ return http.HttpResponseForbidden()
# get a dict with (quantity_{{item_id}}:{{quantity}})
orders_dict = {
key: value for key, value in request.POST.items() if key.startswith("quantity")
@@ -176,10 +178,10 @@ def order(request, grouped_order_id):
)
else:
order.compute_order_price()
- # Always return an HttpResponseRedirect after successfully dealing
+ # Always return an http.HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted twice if a
# user hits the Back button.
- return HttpResponseRedirect(
+ return http.HttpResponseRedirect(
reverse("order:order_confirm", args=(grouped_order.pk, order.pk))
)
@@ -234,4 +236,4 @@ class GroupedOrderSheetView(GroupedOrderOverview, GroupedOrderSheetMixin):
result = BytesIO()
pdf = pisa.pisaDocument(BytesIO(html.encode("UTF-8")), result)
- return HttpResponse(result.getvalue(), content_type="application/pdf")
+ return http.HttpResponse(result.getvalue(), content_type="application/pdf")