diff --git a/la_chariotte/order/templates/order/grouped_order_add_items.html b/la_chariotte/order/templates/order/grouped_order_add_items.html index 654e8c4..cc3a1dd 100644 --- a/la_chariotte/order/templates/order/grouped_order_add_items.html +++ b/la_chariotte/order/templates/order/grouped_order_add_items.html @@ -6,43 +6,124 @@

{% block content_title %}Ajouter des produits à votre commande groupée{% endblock %}

- -

Commande groupée "{{ grouped_order.name }}", le {{ grouped_order.delivery_date }}

-

Limite de commande : {{ grouped_order.deadline }}

-

Sur cette page, vous pouvez voir et modifier les produits qui sont inscrits à votre commande groupée.

- -{% url 'order:item_create' pk=grouped_order.pk as create_item_url %} - - - - - - - - - - - - - - {% csrf_token %} - - - - - - {% for item in item_list %} - - - - - - - {% endfor %} - -
NomPrix unitaireQuantité max (optionnel)Action
{{ item.name }}{{ item.price }}{% if item.max_limit %}{{ item.max_limit }}{% else %}---{% endif %}Supprimer (pas possible pour l'instant)
- -
- Valider +
+ Retour + Mes commandes
+
+ +

Gestion des produits - {{ grouped_order.name }}

+

Sur cette page, vous pouvez voir et modifier les produits qui sont inscrits à votre commande groupée.

+ + {% url 'order:item_create' pk=grouped_order.pk as create_item_url %} + + + + + + + + + + + + + + {% csrf_token %} + + + + + + + {% for item in item_list %} + + + + + + + + + {% endfor %} + +
NomPrix unitaireQuantité max (optionnel)Action
{{ item.name }}{{ item.price }}{% if item.max_limit %}{{ item.max_limit }}{% else %}---{% endif %} + {% if item.ordered_nb == 0 %} + + {% else %} + Produit déjà commandé + {% endif %} +
+ +
+ Valider +
+ +
+ {% endblock %} + + \ No newline at end of file diff --git a/la_chariotte/order/templates/order/grouped_order_overview.html b/la_chariotte/order/templates/order/grouped_order_overview.html index 3b4005a..f67b974 100644 --- a/la_chariotte/order/templates/order/grouped_order_overview.html +++ b/la_chariotte/order/templates/order/grouped_order_overview.html @@ -22,7 +22,9 @@ {% endif %}

Date de livraison : {{ grouped_order.delivery_date }}

Date limite de commande : {{ grouped_order.deadline }}

- Retour à la page de commande +
+ Retour à la page de commande +
@@ -54,6 +56,7 @@
+ Gérer les produits

Produits commandés

{% if grouped_order.item_set.all %} diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index a753116..643b718 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -779,6 +779,67 @@ class TestGroupedOrderAddItemsView: ) ) + def test_delete_item(self, client_log): + """ + A user on the manage item page creates and then deletes an item + """ + assert models.GroupedOrder.objects.count() == 0 + create_gorder_url = reverse("order:create_grouped_order") + response = client_log.get(create_gorder_url) + assert response.status_code == 200 + date = timezone.now().date() + datetime.timedelta(days=42) + deadline = timezone.now() + datetime.timedelta(days=32) + response = client_log.post( + create_gorder_url, + {"name": "titre test", "deadline": deadline, "delivery_date": date}, + ) + assert response.status_code == 302 + assert response.url.endswith("gerer-produits") + assert models.GroupedOrder.objects.count() == 1 + + # Create an item + grouped_order = models.GroupedOrder.objects.first() + create_item_url = reverse("order:item_create", args=[grouped_order.id]) + response = client_log.post(create_item_url, {"name": "Pain test", "price": "2"}) + response.status_code == 302 + response.url == reverse("order:manage_items", args=[grouped_order.pk]) + assert grouped_order.item_set.count() == 1 + + # Delete the item + item = grouped_order.item_set.first() + delete_item_url = reverse("order:item_delete", args=[grouped_order.id, item.id]) + response = client_log.post(delete_item_url) + assert response.status_code == 302 + assert response.url == reverse("order:manage_items", args=[grouped_order.pk]) + assert grouped_order.item_set.count() == 0 + + def test_create_or_delete_item__not_orga(self, client_log, other_user): + """ + A user that is not orga delete or create an item + They get a 403 forbidden error + """ + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=other_user, + ) + + # Create an item + grouped_order = models.GroupedOrder.objects.first() + create_item_url = reverse("order:item_create", args=[grouped_order.id]) + response = client_log.post(create_item_url, {"name": "Pain test", "price": "2"}) + response.status_code == 403 + assert grouped_order.item_set.count() == 0 + + # Delete an item + item = grouped_order.item_set.create(name="Pain test", price="2") + assert grouped_order.item_set.count() == 1 + delete_item_url = reverse("order:item_delete", args=[grouped_order.id, item.id]) + response = client_log.post(delete_item_url) + assert response.status_code == 403 + assert grouped_order.item_set.count() == 1 + class TestItemCreateView: def test_create_item(self, client_log): diff --git a/la_chariotte/order/urls.py b/la_chariotte/order/urls.py index fadbcee..11df9b9 100644 --- a/la_chariotte/order/urls.py +++ b/la_chariotte/order/urls.py @@ -30,6 +30,11 @@ urlpatterns = [ views.ItemCreateView.as_view(), name="item_create", ), + path( + "/gerer-produits//supprimer", + views.ItemDeleteView.as_view(), + name="item_delete", + ), path( "/gerer/imprimer", views.GroupedOrderSheetView.as_view(), diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index f65881d..6b5751d 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -130,6 +130,7 @@ class GroupedOrderAddItemsView(UserPassesTestMixin, generic.ListView): def test_func(self): """Accessible only if the requesting user is the grouped order organizer""" grouped_order_id = self.kwargs.get("pk") + # breakpoint() return GroupedOrder.objects.get(pk=grouped_order_id).orga == self.request.user @@ -150,6 +151,21 @@ class ItemCreateView(UserPassesTestMixin, generic.CreateView): return GroupedOrder.objects.get(pk=grouped_order_id).orga == self.request.user +class ItemDeleteView(UserPassesTestMixin, generic.DeleteView): + """DeleteView for an item + The form does a GET to this view - it displays a confirmation page - then we post this view + """ + + model = Item + + def get_success_url(self): + return reverse_lazy("order:manage_items", args=[self.object.grouped_order.id]) + + def test_func(self): + """Accessible only if the requesting user is the grouped order organizer""" + return self.get_object().grouped_order.orga == self.request.user + + 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)