From 05df89eefd1dfd3d2506d9c819fceefe607ed70b Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Wed, 5 Jul 2023 11:26:53 +0200 Subject: [PATCH] delete grouped order closes #59 --- .../order/grouped_order_add_items.html | 8 -- .../order/grouped_order_confirm_delete.html | 18 ++++ .../order/grouped_order_overview.html | 6 +- la_chariotte/order/tests/test_views.py | 85 +++++++++++++++++++ la_chariotte/order/urls.py | 5 ++ la_chariotte/order/views/__init__.py | 6 +- la_chariotte/order/views/grouped_order.py | 24 +++++- la_chariotte/settings.py | 2 +- 8 files changed, 140 insertions(+), 14 deletions(-) create mode 100644 la_chariotte/order/templates/order/grouped_order_confirm_delete.html 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 d886aa1..fb6e902 100644 --- a/la_chariotte/order/templates/order/grouped_order_add_items.html +++ b/la_chariotte/order/templates/order/grouped_order_add_items.html @@ -6,14 +6,6 @@

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

-
- - Retour - - - Mes commandes - -

Gestion des produits - {{ grouped_order.name }}

diff --git a/la_chariotte/order/templates/order/grouped_order_confirm_delete.html b/la_chariotte/order/templates/order/grouped_order_confirm_delete.html new file mode 100644 index 0000000..3d33745 --- /dev/null +++ b/la_chariotte/order/templates/order/grouped_order_confirm_delete.html @@ -0,0 +1,18 @@ +{% extends 'base.html' %} + +{% block title %}Supprimer la commande groupée{% endblock %} + +{% block content %} +

+ {% block content_title %}Supprimer la commande groupée{% endblock %} +

+
+

Voulez-vous vraiment supprimer la commande groupée {{ grouped_order }} définitivement ?

+

Cela supprimera toutes les commandes des participants et tous les produits de la commande.

+
+ {% csrf_token %} + + Non +
+
+{% endblock %} diff --git a/la_chariotte/order/templates/order/grouped_order_overview.html b/la_chariotte/order/templates/order/grouped_order_overview.html index 1a78d96..1d16f53 100644 --- a/la_chariotte/order/templates/order/grouped_order_overview.html +++ b/la_chariotte/order/templates/order/grouped_order_overview.html @@ -32,7 +32,11 @@

diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index 1227d32..a5012fd 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -1203,6 +1203,91 @@ class TestGroupedOrderAddItemsView: assert grouped_order.item_set.count() == 1 +class TestGroupedOrderDeleteView: + def test_delete_grouped_order(self, client_log): + """The orga of the GO deletes it. + The GO and related Order, OrderAuthor, OrderedItems, Items are deleted.""" + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=auth.get_user(client_log), + ) + assert models.GroupedOrder.objects.count() == 1 + order = order_items_in_grouped_order(grouped_order) + + assert models.Item.objects.count() == 2 + assert models.OrderedItem.objects.count() == 2 + assert models.OrderAuthor.objects.count() == 1 + + # get the delete view + delete_view_url = reverse( + "order:delete_grouped_order", kwargs={"pk": grouped_order.pk} + ) + response = client_log.get(delete_view_url) + assert response.status_code == 200 + + # post the delete view + response = client_log.post(delete_view_url) + assert response.status_code == 302 + assert response.url == reverse("order:index") + + # check everything is deleted + assert models.GroupedOrder.objects.count() == 0 + assert models.Order.objects.count() == 0 + assert models.OrderedItem.objects.count() == 0 + assert models.OrderAuthor.objects.count() == 0 + assert models.Item.objects.count() == 0 + + def test_delete_grouped_order__not_orga(self, client_log, other_user): + """A user that is not orga gets or posts the delete view. They get a 403 error.""" + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=other_user, + ) + assert models.GroupedOrder.objects.count() == 1 + + # get the delete view + delete_view_url = reverse( + "order:delete_grouped_order", kwargs={"pk": grouped_order.pk} + ) + response = client_log.get(delete_view_url) + assert response.status_code == 403 + + # post the delete view + response = client_log.post(delete_view_url) + assert response.status_code == 403 + + assert models.GroupedOrder.objects.count() == 1 + + def test_delete_grouped_order__anonymous(self, client, other_user): + """An anonymous user gets the delete view. They get redirected to login page""" + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=other_user, + ) + assert models.GroupedOrder.objects.count() == 1 + + # get the delete view + delete_view_url = reverse( + "order:delete_grouped_order", kwargs={"pk": grouped_order.pk} + ) + response = client.get(delete_view_url) + assert response.status_code == 302 + assert response.url == f"{reverse('accounts:login')}?next={delete_view_url}" + + # post the delete view + response = client.post(delete_view_url) + assert response.status_code == 302 + assert response.url == f"{reverse('accounts:login')}?next={delete_view_url}" + + assert models.GroupedOrder.objects.count() == 1 + + class TestItemCreateView: def test_create_item(self, client_log): """A user that has created a grouped order adds an item to it.""" diff --git a/la_chariotte/order/urls.py b/la_chariotte/order/urls.py index 33dda0e..f31d2f8 100644 --- a/la_chariotte/order/urls.py +++ b/la_chariotte/order/urls.py @@ -30,6 +30,11 @@ urlpatterns = [ views.GroupedOrderUpdateView.as_view(), name="update_grouped_order", ), + path( + "/supprimer", + views.GroupedOrderDeleteView.as_view(), + name="delete_grouped_order", + ), path( "/gerer-produits/nouveau", views.ItemCreateView.as_view(), diff --git a/la_chariotte/order/views/__init__.py b/la_chariotte/order/views/__init__.py index 17a0865..7cceb7d 100644 --- a/la_chariotte/order/views/__init__.py +++ b/la_chariotte/order/views/__init__.py @@ -1,9 +1,9 @@ # fmt: off from .grouped_order import (ExportGroupedOrderEmailAddressesToCSVView, GroupedOrderAddItemsView, GroupedOrderCreateView, - GroupedOrderDetailView, GroupedOrderOverview, - GroupedOrderSheetView, GroupedOrderUpdateView, - IndexView) + GroupedOrderDeleteView, GroupedOrderDetailView, + GroupedOrderOverview, GroupedOrderSheetView, + GroupedOrderUpdateView, IndexView) from .item import ItemCreateView, ItemDeleteView from .order import OrderDetailView, order diff --git a/la_chariotte/order/views/grouped_order.py b/la_chariotte/order/views/grouped_order.py index ec45eaa..545d43f 100644 --- a/la_chariotte/order/views/grouped_order.py +++ b/la_chariotte/order/views/grouped_order.py @@ -5,7 +5,7 @@ from django import http from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.shortcuts import get_object_or_404 from django.template.loader import get_template -from django.urls import reverse +from django.urls import reverse, reverse_lazy from django.utils import timezone from django.views import generic from xhtml2pdf import pisa @@ -129,6 +129,28 @@ class GroupedOrderUpdateView(UserPassesTestMixin, generic.UpdateView): return kwargs +class GroupedOrderDeleteView(UserPassesTestMixin, generic.DeleteView): + """View for deleting a grouped order""" + + model = GroupedOrder + template_name = "order/grouped_order_confirm_delete.html" + context_object_name = "grouped_order" + + def get_success_url(self): + return reverse_lazy("order:index") + + def test_func(self): + """Accessible only if the requesting user is the grouped order organizer""" + return self.get_object().orga == self.request.user + + def form_valid(self, form): + # Delete the related OrderAuthors + grouped_order = self.get_object() + for order in grouped_order.order_set.all(): + order.author.delete() + return super().form_valid(form) + + class GroupedOrderAddItemsView(UserPassesTestMixin, generic.ListView): """After creating grouped order, view for adding items to it""" diff --git a/la_chariotte/settings.py b/la_chariotte/settings.py index 8f52dce..679abb9 100644 --- a/la_chariotte/settings.py +++ b/la_chariotte/settings.py @@ -89,7 +89,7 @@ WSGI_APPLICATION = "la_chariotte.wsgi.application" DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", - "NAME": os.getenv("DB_NAME", "chariotte-db"), + "NAME": os.getenv("DB_NAME", "chariotte"), } }