mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-01 19:32:26 +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">
|
<p class="desktop-hidden mobile-content-title">
|
||||||
{% block content_title %}Ajouter des produits à votre commande groupée{% endblock %}
|
{% block content_title %}Ajouter des produits à votre commande groupée{% endblock %}
|
||||||
</p>
|
</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">
|
<div class="box">
|
||||||
|
|
||||||
<p class="title">Gestion des produits - {{ grouped_order.name }}</p>
|
<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>
|
</p>
|
||||||
<div class="buttons">
|
<div class="buttons">
|
||||||
<a class="button is-light" href="{% url 'order:update_grouped_order' grouped_order.id %}">
|
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1203,6 +1203,91 @@ class TestGroupedOrderAddItemsView:
|
||||||
assert grouped_order.item_set.count() == 1
|
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:
|
class TestItemCreateView:
|
||||||
def test_create_item(self, client_log):
|
def test_create_item(self, client_log):
|
||||||
"""A user that has created a grouped order adds an item to it."""
|
"""A user that has created a grouped order adds an item to it."""
|
||||||
|
|
|
@ -30,6 +30,11 @@ urlpatterns = [
|
||||||
views.GroupedOrderUpdateView.as_view(),
|
views.GroupedOrderUpdateView.as_view(),
|
||||||
name="update_grouped_order",
|
name="update_grouped_order",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"<int:pk>/supprimer",
|
||||||
|
views.GroupedOrderDeleteView.as_view(),
|
||||||
|
name="delete_grouped_order",
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"<int:pk>/gerer-produits/nouveau",
|
"<int:pk>/gerer-produits/nouveau",
|
||||||
views.ItemCreateView.as_view(),
|
views.ItemCreateView.as_view(),
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
# fmt: off
|
# fmt: off
|
||||||
from .grouped_order import (ExportGroupedOrderEmailAddressesToCSVView,
|
from .grouped_order import (ExportGroupedOrderEmailAddressesToCSVView,
|
||||||
GroupedOrderAddItemsView, GroupedOrderCreateView,
|
GroupedOrderAddItemsView, GroupedOrderCreateView,
|
||||||
GroupedOrderDetailView, GroupedOrderOverview,
|
GroupedOrderDeleteView, GroupedOrderDetailView,
|
||||||
GroupedOrderSheetView, GroupedOrderUpdateView,
|
GroupedOrderOverview, GroupedOrderSheetView,
|
||||||
IndexView)
|
GroupedOrderUpdateView, IndexView)
|
||||||
from .item import ItemCreateView, ItemDeleteView
|
from .item import ItemCreateView, ItemDeleteView
|
||||||
from .order import OrderDetailView, order
|
from .order import OrderDetailView, order
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django import http
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.template.loader import get_template
|
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.utils import timezone
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
from xhtml2pdf import pisa
|
from xhtml2pdf import pisa
|
||||||
|
@ -129,6 +129,28 @@ class GroupedOrderUpdateView(UserPassesTestMixin, generic.UpdateView):
|
||||||
return kwargs
|
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):
|
class GroupedOrderAddItemsView(UserPassesTestMixin, generic.ListView):
|
||||||
"""After creating grouped order, view for adding items to it"""
|
"""After creating grouped order, view for adding items to it"""
|
||||||
|
|
||||||
|
|
|
@ -89,7 +89,7 @@ WSGI_APPLICATION = "la_chariotte.wsgi.application"
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
"default": {
|
"default": {
|
||||||
"ENGINE": "django.db.backends.postgresql",
|
"ENGINE": "django.db.backends.postgresql",
|
||||||
"NAME": os.getenv("DB_NAME", "chariotte-db"),
|
"NAME": os.getenv("DB_NAME", "chariotte"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue