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">
{% block content_title %}Ajouter des produits à votre commande groupée{% endblock %}
</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">
<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>
<div class="buttons">
<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>

View file

@ -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."""

View file

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

View file

@ -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

View file

@ -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"""

View file

@ -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"),
}
}