the orga can delete orders

This commit is contained in:
Laetitia Getti 2023-07-27 09:56:47 +02:00 committed by Laetitia Getti
parent 5839be7e7a
commit a02d748ccb
6 changed files with 112 additions and 3 deletions

View file

@ -157,7 +157,14 @@
<button class="button is-info is-small js-modal-trigger" data-target="order-detail-{{ order.id }}">
Voir
</button>
{% if order.note %}<i class="fa fa-comment ml-3" title="{{ order.note }}" aria-hidden="true"></i>{% endif %}
{% if order.note %}
<i class="fa fa-comment ml-3 mr-2" title="{{ order.note }}" aria-hidden="true"></i>
{% else %}
<span class="ml-5 mr-4"></span>
{% endif %}
<button class="button is-light is-small js-modal-trigger" data-target="confirm-delete-{{ order.id }}">
Supprimer
</button>
</td>
</tr>
@ -193,6 +200,48 @@
</footer>
</div>
</div>
<!-- Confirm delete order modal -->
<div id="confirm-delete-{{ order.id }}" class="modal">
<div class="modal-background"></div>
<div class="modal-card ">
<header class="modal-card-head">
<div class="modal-card-title-container">
<p class="modal-card-title">Supprimer la commande de {{ order.author }} ?</p>
</div>
</header>
<section class="modal-card-body">
<div class="columns">
<div class="column">
{% for item in order.ordered_items.all %}
{{ item.nb }} x {{ item.item.name }}
<hr class="mb-0 mt-1">
{% endfor %}
</div>
{% if order.note %}
<div class="column is-4">
<p class="mini-title">Note à l'organisateur·ice</p>
<p>{{ order.note }}</p>
</div>
</div>
{% endif %}
</section>
<footer class="modal-card-foot">
<div class="columns">
<div class="column is-8">
<p class="mini-title">Total à payer</p>
<p>{{ order.price }} €</p>
</div>
<div class="column">
<form action="{% url 'order:order_delete' grouped_order.id order.id %}" method="post">
{% csrf_token %}
<input type="submit" name="{{ item.id }}" value="Oui" class="button is-danger"/>
<a class="button is-light" aria-label="close">Non</a>
</form>
</div>
</footer>
</div>
</div>
{% endfor %}
</tbody>

View file

@ -1027,6 +1027,44 @@ class TestOrder:
assert item2.ordered_nb == 0
assert order.ordered_items.count() == 1
def test_delete_order(self, client_log):
"""The orga user deletes an order. The grouped order is updated"""
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),
)
order = order_items_in_grouped_order(grouped_order)
author = order.author
order_price = order.price
item = order.ordered_items.first().item
assert (
models.OrderedItem.objects.all().count() == 4
) # 4 orderedItem, 2 are in the order 'order'
assert grouped_order.order_set.all().count() == 3
assert grouped_order.total_price == 35
assert item.ordered_nb == 4
delete_url = reverse(
"order:order_delete",
kwargs={"grouped_order_id": grouped_order.id, "pk": order.id},
)
response = client_log.post(delete_url)
assert response.status_code == 302
assert response.url == reverse(
"order:grouped_order_overview",
kwargs={
"pk": grouped_order.pk,
},
)
client_log.get(response.url)
grouped_order.refresh_from_db()
item.refresh_from_db()
assert models.OrderedItem.objects.all().count() == 2
assert grouped_order.order_set.all().count() == 2
assert grouped_order.total_price == 35 - order_price
assert item.ordered_nb == 1
class TestGroupedOrderCreateView:
def test_create_grouped_order(self, client_log):

View file

@ -19,6 +19,11 @@ urlpatterns = [
views.OrderDetailView.as_view(),
name="order_confirm",
),
path(
"<int:grouped_order_id>/gerer/<int:pk>/supprimer",
views.OrderDeleteView.as_view(),
name="order_delete",
),
path("creer", views.GroupedOrderCreateView.as_view(), name="create_grouped_order"),
path(
"<int:pk>/gerer-produits",

View file

@ -7,6 +7,6 @@ from .grouped_order import (DownloadGroupedOrderSheetView,
GroupedOrderSheetView, GroupedOrderUpdateView,
IndexView)
from .item import ItemCreateView, ItemDeleteView
from .order import OrderDetailView, order
from .order import OrderDeleteView, OrderDetailView, order
# fmt: on

View file

@ -98,6 +98,7 @@ class GroupedOrderOverview(UserPassesTestMixin, generic.DetailView):
def get(self, request, *args, **kwargs):
# Compute grouped order total price before display
self.get_object().compute_total_price()
self.get_object().compute_items_ordered_nb()
return super().get(self, request, *args, **kwargs)
def get_context_data(self, **kwargs):

View file

@ -1,6 +1,7 @@
from django import http
from django.contrib.auth.mixins import UserPassesTestMixin
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.urls import reverse, reverse_lazy
from django.views import generic
from ..models import GroupedOrder, Order, OrderAuthor, OrderedItem
@ -127,3 +128,18 @@ class OrderDetailView(generic.DetailView):
"""Confirmation page after a user orders"""
model = Order
class OrderDeleteView(UserPassesTestMixin, generic.DeleteView):
"""DeleteView for an order"""
model = Order
def get_success_url(self):
return reverse_lazy(
"order:grouped_order_overview", 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