delete grouped order

closes #59
This commit is contained in:
Laetitia Getti 2023-07-05 11:26:53 +02:00
parent afea416d42
commit 05df89eefd
8 changed files with 140 additions and 14 deletions

View file

@ -6,14 +6,6 @@
<p class="desktop-hidden mobile-content-title"> <p class="desktop-hidden mobile-content-title">
{% block content_title %}Ajouter des produits à votre commande groupée{% endblock %} {% block content_title %}Ajouter des produits à votre commande groupée{% endblock %}
</p> </p>
<div class="buttons">
<a class="button is-light" href={% url 'order:grouped_order_overview' grouped_order.id %}>
<i class="fa fa-arrow-left mr-3" aria-hidden="true"></i>Retour
</a>
<a class="button is-primary" href="{% url 'order:index' %}">
<i class="fa fa-shopping-basket mr-3" aria-hidden="true"></i>Mes commandes
</a>
</div>
<div class="box"> <div class="box">
<p class="title">Gestion des produits - {{ grouped_order.name }}</p> <p class="title">Gestion des produits - {{ grouped_order.name }}</p>

View file

@ -0,0 +1,18 @@
{% extends 'base.html' %}
{% block title %}Supprimer la commande groupée{% endblock %}
{% block content %}
<p class="desktop-hidden mobile-content-title">
{% block content_title %}Supprimer la commande groupée{% endblock %}
</p>
<div class="box">
<p>Voulez-vous vraiment supprimer la commande groupée {{ grouped_order }} définitivement ?</p>
<p>Cela supprimera toutes les commandes des participants et tous les produits de la commande.</p>
<form action="{% url 'order:delete_grouped_order' grouped_order.pk %}" method="post">
{% csrf_token %}
<input type="submit" name="{{ item.id }}" value="Oui" class="button is-danger"/>
<a class="button is-light" href="{% url 'order:grouped_order_overview' grouped_order.pk %}">Non</a>
</form>
</div>
{% endblock %}

View file

@ -32,7 +32,11 @@
</p> </p>
<div class="buttons"> <div class="buttons">
<a class="button is-light" href="{% url 'order:update_grouped_order' grouped_order.id %}"> <a class="button is-light" href="{% url 'order:update_grouped_order' grouped_order.id %}">
<i class="fa fa-pencil mr-3" aria-hidden="true"></i>Modifier la commande</a> <i class="fa fa-pencil mr-3" aria-hidden="true"></i>Modifier la commande
</a>
<a class="button is-light" href="{% url 'order:delete_grouped_order' grouped_order.id %}">
<i class="fa fa-trash mr-3" aria-hidden="true"></i>Supprimer la commande
</a>
</div> </div>
</div> </div>
</div> </div>

View file

@ -1203,6 +1203,91 @@ class TestGroupedOrderAddItemsView:
assert grouped_order.item_set.count() == 1 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: class TestItemCreateView:
def test_create_item(self, client_log): def test_create_item(self, client_log):
"""A user that has created a grouped order adds an item to it.""" """A user that has created a grouped order adds an item to it."""

View file

@ -30,6 +30,11 @@ urlpatterns = [
views.GroupedOrderUpdateView.as_view(), views.GroupedOrderUpdateView.as_view(),
name="update_grouped_order", name="update_grouped_order",
), ),
path(
"<int:pk>/supprimer",
views.GroupedOrderDeleteView.as_view(),
name="delete_grouped_order",
),
path( path(
"<int:pk>/gerer-produits/nouveau", "<int:pk>/gerer-produits/nouveau",
views.ItemCreateView.as_view(), views.ItemCreateView.as_view(),

View file

@ -1,9 +1,9 @@
# fmt: off # fmt: off
from .grouped_order import (ExportGroupedOrderEmailAddressesToCSVView, from .grouped_order import (ExportGroupedOrderEmailAddressesToCSVView,
GroupedOrderAddItemsView, GroupedOrderCreateView, GroupedOrderAddItemsView, GroupedOrderCreateView,
GroupedOrderDetailView, GroupedOrderOverview, GroupedOrderDeleteView, GroupedOrderDetailView,
GroupedOrderSheetView, GroupedOrderUpdateView, GroupedOrderOverview, GroupedOrderSheetView,
IndexView) GroupedOrderUpdateView, IndexView)
from .item import ItemCreateView, ItemDeleteView from .item import ItemCreateView, ItemDeleteView
from .order import OrderDetailView, order from .order import OrderDetailView, order

View file

@ -5,7 +5,7 @@ from django import http
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.template.loader import get_template 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.utils import timezone
from django.views import generic from django.views import generic
from xhtml2pdf import pisa from xhtml2pdf import pisa
@ -129,6 +129,28 @@ class GroupedOrderUpdateView(UserPassesTestMixin, generic.UpdateView):
return kwargs 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): class GroupedOrderAddItemsView(UserPassesTestMixin, generic.ListView):
"""After creating grouped order, view for adding items to it""" """After creating grouped order, view for adding items to it"""

View file

@ -89,7 +89,7 @@ WSGI_APPLICATION = "la_chariotte.wsgi.application"
DATABASES = { DATABASES = {
"default": { "default": {
"ENGINE": "django.db.backends.postgresql", "ENGINE": "django.db.backends.postgresql",
"NAME": os.getenv("DB_NAME", "chariotte-db"), "NAME": os.getenv("DB_NAME", "chariotte"),
} }
} }