mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-01 19:32:26 +02:00
the orga can delete orders
This commit is contained in:
parent
5839be7e7a
commit
a02d748ccb
6 changed files with 112 additions and 3 deletions
|
@ -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>
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue