mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-01 11:22:24 +02:00
parent
afea416d42
commit
05df89eefd
8 changed files with 140 additions and 14 deletions
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
|
@ -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>
|
||||
|
|
|
@ -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."""
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"""
|
||||
|
||||
|
|
|
@ -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"),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue