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 }}">
|
<button class="button is-info is-small js-modal-trigger" data-target="order-detail-{{ order.id }}">
|
||||||
Voir
|
Voir
|
||||||
</button>
|
</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>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
@ -193,6 +200,48 @@
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</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 %}
|
{% endfor %}
|
||||||
|
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
|
@ -1027,6 +1027,44 @@ class TestOrder:
|
||||||
assert item2.ordered_nb == 0
|
assert item2.ordered_nb == 0
|
||||||
assert order.ordered_items.count() == 1
|
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:
|
class TestGroupedOrderCreateView:
|
||||||
def test_create_grouped_order(self, client_log):
|
def test_create_grouped_order(self, client_log):
|
||||||
|
|
|
@ -19,6 +19,11 @@ urlpatterns = [
|
||||||
views.OrderDetailView.as_view(),
|
views.OrderDetailView.as_view(),
|
||||||
name="order_confirm",
|
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("creer", views.GroupedOrderCreateView.as_view(), name="create_grouped_order"),
|
||||||
path(
|
path(
|
||||||
"<int:pk>/gerer-produits",
|
"<int:pk>/gerer-produits",
|
||||||
|
|
|
@ -7,6 +7,6 @@ from .grouped_order import (DownloadGroupedOrderSheetView,
|
||||||
GroupedOrderSheetView, GroupedOrderUpdateView,
|
GroupedOrderSheetView, GroupedOrderUpdateView,
|
||||||
IndexView)
|
IndexView)
|
||||||
from .item import ItemCreateView, ItemDeleteView
|
from .item import ItemCreateView, ItemDeleteView
|
||||||
from .order import OrderDetailView, order
|
from .order import OrderDeleteView, OrderDetailView, order
|
||||||
|
|
||||||
# fmt: on
|
# fmt: on
|
||||||
|
|
|
@ -98,6 +98,7 @@ class GroupedOrderOverview(UserPassesTestMixin, generic.DetailView):
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
# Compute grouped order total price before display
|
# Compute grouped order total price before display
|
||||||
self.get_object().compute_total_price()
|
self.get_object().compute_total_price()
|
||||||
|
self.get_object().compute_items_ordered_nb()
|
||||||
return super().get(self, request, *args, **kwargs)
|
return super().get(self, request, *args, **kwargs)
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from django import http
|
from django import http
|
||||||
|
from django.contrib.auth.mixins import UserPassesTestMixin
|
||||||
from django.shortcuts import get_object_or_404, render
|
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 django.views import generic
|
||||||
|
|
||||||
from ..models import GroupedOrder, Order, OrderAuthor, OrderedItem
|
from ..models import GroupedOrder, Order, OrderAuthor, OrderedItem
|
||||||
|
@ -127,3 +128,18 @@ class OrderDetailView(generic.DetailView):
|
||||||
"""Confirmation page after a user orders"""
|
"""Confirmation page after a user orders"""
|
||||||
|
|
||||||
model = Order
|
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