mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-01 19:32:26 +02:00
parent
a32ebe529c
commit
f4c08a3a23
5 changed files with 168 additions and 20 deletions
|
@ -21,7 +21,7 @@
|
||||||
<th>Livraison</th>
|
<th>Livraison</th>
|
||||||
<th>Fin des commandes</th>
|
<th>Fin des commandes</th>
|
||||||
<th>Nombre de commandes</th>
|
<th>Nombre de commandes</th>
|
||||||
<th>Voir</th>
|
<th> </th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
@ -34,12 +34,17 @@
|
||||||
<td>{{ gr_order.delivery_date }}</td>
|
<td>{{ gr_order.delivery_date }}</td>
|
||||||
<td>{{ gr_order.deadline }}</td>
|
<td>{{ gr_order.deadline }}</td>
|
||||||
<td>{{ gr_order.order_set.count }}</td>
|
<td>{{ gr_order.order_set.count }}</td>
|
||||||
<td><a title="Détail de la commande groupée" href="{% url 'order:grouped_order_detail' gr_order.id %}">
|
<td>
|
||||||
|
<a title="Détail de la commande groupée" href="{% url 'order:grouped_order_detail' gr_order.id %}">
|
||||||
<i class="fa fa-eye mr-3" aria-hidden="true"></i>
|
<i class="fa fa-eye mr-3" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
<a title="Gestion de la commande groupée" href="{% url 'order:grouped_order_overview' gr_order.id %}">
|
<a title="Gestion de la commande groupée" href="{% url 'order:grouped_order_overview' gr_order.id %}">
|
||||||
<i class="fa fa-list-ul mr-3" aria-hidden="true"></i>
|
<i class="fa fa-list-ul mr-3" aria-hidden="true"></i>
|
||||||
</a></td>
|
</a>
|
||||||
|
<a title="Dupliquer la commande groupée" href="{% url 'order:duplicate_grouped_order' gr_order.id %}">
|
||||||
|
<i class="fa fa-files-o mr-3" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
@ -54,7 +59,7 @@
|
||||||
<th>Livraison</th>
|
<th>Livraison</th>
|
||||||
<th>Fin des commandes</th>
|
<th>Fin des commandes</th>
|
||||||
<th>Nombre de commandes</th>
|
<th>Nombre de commandes</th>
|
||||||
<th>Voir</th>
|
<th> </th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
@ -67,12 +72,17 @@
|
||||||
<td>{{ gr_order.delivery_date }}</td>
|
<td>{{ gr_order.delivery_date }}</td>
|
||||||
<td>{{ gr_order.deadline }}</td>
|
<td>{{ gr_order.deadline }}</td>
|
||||||
<td>{{ gr_order.order_set.count }}</td>
|
<td>{{ gr_order.order_set.count }}</td>
|
||||||
<td><a title="Détail de la commande groupée" href="{% url 'order:grouped_order_detail' gr_order.id %}">
|
<td>
|
||||||
|
<a title="Détail de la commande groupée" href="{% url 'order:grouped_order_detail' gr_order.id %}">
|
||||||
<i class="fa fa-eye mr-3" aria-hidden="true"></i>
|
<i class="fa fa-eye mr-3" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
<a title="Gestion de la commande groupée" href="{% url 'order:grouped_order_overview' gr_order.id %}">
|
<a title="Gestion de la commande groupée" href="{% url 'order:grouped_order_overview' gr_order.id %}">
|
||||||
<i class="fa fa-list-ul mr-3" aria-hidden="true"></i>
|
<i class="fa fa-list-ul mr-3" aria-hidden="true"></i>
|
||||||
</a></td>
|
</a>
|
||||||
|
<a title="Dupliquer la commande groupée" href="{% url 'order:duplicate_grouped_order' gr_order.id %}">
|
||||||
|
<i class="fa fa-files-o mr-3" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
@ -87,7 +97,7 @@
|
||||||
<th>Livraison</th>
|
<th>Livraison</th>
|
||||||
<th>Fin des commandes</th>
|
<th>Fin des commandes</th>
|
||||||
<th>Nombre de commandes</th>
|
<th>Nombre de commandes</th>
|
||||||
<th>Voir</th>
|
<th> </th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
@ -100,12 +110,17 @@
|
||||||
<td>{{ gr_order.delivery_date }}</td>
|
<td>{{ gr_order.delivery_date }}</td>
|
||||||
<td>{{ gr_order.deadline }}</td>
|
<td>{{ gr_order.deadline }}</td>
|
||||||
<td>{{ gr_order.order_set.count }}</td>
|
<td>{{ gr_order.order_set.count }}</td>
|
||||||
<td><a title="Détail de la commande groupée" href="{% url 'order:grouped_order_detail' gr_order.id %}">
|
<td>
|
||||||
|
<a title="Détail de la commande groupée" href="{% url 'order:grouped_order_detail' gr_order.id %}">
|
||||||
<i class="fa fa-eye mr-3" aria-hidden="true"></i>
|
<i class="fa fa-eye mr-3" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
<a title="Gestion de la commande groupée" href="{% url 'order:grouped_order_overview' gr_order.id %}">
|
<a title="Gestion de la commande groupée" href="{% url 'order:grouped_order_overview' gr_order.id %}">
|
||||||
<i class="fa fa-list-ul mr-3" aria-hidden="true"></i>
|
<i class="fa fa-list-ul mr-3" aria-hidden="true"></i>
|
||||||
</a></td>
|
</a>
|
||||||
|
<a title="Dupliquer la commande groupée" href="{% url 'order:duplicate_grouped_order' gr_order.id %}">
|
||||||
|
<i class="fa fa-files-o mr-3" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
|
@ -1288,6 +1288,90 @@ class TestGroupedOrderDeleteView:
|
||||||
assert models.GroupedOrder.objects.count() == 1
|
assert models.GroupedOrder.objects.count() == 1
|
||||||
|
|
||||||
|
|
||||||
|
class TestGroupedOrderDuplicateView:
|
||||||
|
def test_duplicate_grouped_order(self, client_log):
|
||||||
|
"""The orga of the GO duplicates it.
|
||||||
|
A new GO is created without any order but with the same item_set.
|
||||||
|
The user gets redirected to the update view. The old GO remains the same"""
|
||||||
|
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
|
||||||
|
assert grouped_order.item_set.first().ordered_nb == 3
|
||||||
|
|
||||||
|
# duplicate
|
||||||
|
duplicate_view_url = reverse(
|
||||||
|
"order:duplicate_grouped_order", kwargs={"pk": grouped_order.pk}
|
||||||
|
)
|
||||||
|
response = client_log.get(duplicate_view_url)
|
||||||
|
assert models.GroupedOrder.objects.count() == 2
|
||||||
|
new_grouped_order = models.GroupedOrder.objects.all()[1]
|
||||||
|
assert new_grouped_order.name == "gr order test - copie"
|
||||||
|
assert new_grouped_order.delivery_date == grouped_order.delivery_date
|
||||||
|
assert new_grouped_order.deadline == grouped_order.deadline
|
||||||
|
assert new_grouped_order.place == grouped_order.place
|
||||||
|
assert new_grouped_order.orga == auth.get_user(client_log)
|
||||||
|
assert new_grouped_order.description == grouped_order.description
|
||||||
|
assert new_grouped_order.item_set.count() == grouped_order.item_set.count()
|
||||||
|
assert new_grouped_order.item_set.first().ordered_nb == 0
|
||||||
|
assert models.GroupedOrder.objects.count() == 2
|
||||||
|
|
||||||
|
# redirection
|
||||||
|
assert response.status_code == 302
|
||||||
|
assert response.url == reverse(
|
||||||
|
"order:update_grouped_order", kwargs={"pk": new_grouped_order.pk}
|
||||||
|
)
|
||||||
|
|
||||||
|
# The initial grouped order did not change
|
||||||
|
assert grouped_order.item_set.first().ordered_nb == 3
|
||||||
|
|
||||||
|
def test_duplicate_grouped_order__not_orga(self, client_log, other_user):
|
||||||
|
"""A user that is not orga gets the duplicate 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 duplicate view
|
||||||
|
duplicate_view_url = reverse(
|
||||||
|
"order:duplicate_grouped_order", kwargs={"pk": grouped_order.pk}
|
||||||
|
)
|
||||||
|
response = client_log.get(duplicate_view_url)
|
||||||
|
assert response.status_code == 403
|
||||||
|
|
||||||
|
assert models.GroupedOrder.objects.count() == 1
|
||||||
|
|
||||||
|
def test_duplicate_grouped_order__anonymous(self, client, other_user):
|
||||||
|
"""An anonymous user gets the duplicate 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 duplicate view
|
||||||
|
duplicate_view_url = reverse(
|
||||||
|
"order:duplicate_grouped_order", kwargs={"pk": grouped_order.pk}
|
||||||
|
)
|
||||||
|
response = client.get(duplicate_view_url)
|
||||||
|
assert response.status_code == 302
|
||||||
|
assert response.url == f"{reverse('accounts:login')}?next={duplicate_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."""
|
||||||
|
|
|
@ -35,6 +35,11 @@ urlpatterns = [
|
||||||
views.GroupedOrderDeleteView.as_view(),
|
views.GroupedOrderDeleteView.as_view(),
|
||||||
name="delete_grouped_order",
|
name="delete_grouped_order",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"<int:pk>/dupliquer",
|
||||||
|
views.GroupedOrderDuplicateView.as_view(),
|
||||||
|
name="duplicate_grouped_order",
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"<int:pk>/gerer-produits/nouveau",
|
"<int:pk>/gerer-produits/nouveau",
|
||||||
views.ItemCreateView.as_view(),
|
views.ItemCreateView.as_view(),
|
||||||
|
|
|
@ -2,8 +2,9 @@
|
||||||
from .grouped_order import (ExportGroupedOrderEmailAddressesToCSVView,
|
from .grouped_order import (ExportGroupedOrderEmailAddressesToCSVView,
|
||||||
GroupedOrderAddItemsView, GroupedOrderCreateView,
|
GroupedOrderAddItemsView, GroupedOrderCreateView,
|
||||||
GroupedOrderDeleteView, GroupedOrderDetailView,
|
GroupedOrderDeleteView, GroupedOrderDetailView,
|
||||||
GroupedOrderOverview, GroupedOrderSheetView,
|
GroupedOrderDuplicateView, GroupedOrderOverview,
|
||||||
GroupedOrderUpdateView, IndexView)
|
GroupedOrderSheetView, GroupedOrderUpdateView,
|
||||||
|
IndexView)
|
||||||
from .item import ItemCreateView, ItemDeleteView
|
from .item import ItemCreateView, ItemDeleteView
|
||||||
from .order import OrderDetailView, order
|
from .order import OrderDetailView, order
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,49 @@ class GroupedOrderUpdateView(UserPassesTestMixin, generic.UpdateView):
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
|
|
||||||
|
class GroupedOrderDuplicateView(UserPassesTestMixin, generic.RedirectView):
|
||||||
|
"""View for duplicating an existing grouped order : the groupedOrder is duplicated
|
||||||
|
and the user is redirected to the new grouped order update view"""
|
||||||
|
|
||||||
|
# url = reverse_lazy("order:update_grouped_order", args=(self.get_object().pk,))
|
||||||
|
|
||||||
|
def test_func(self):
|
||||||
|
"""Accessible only if the requesting user is the grouped order organizer"""
|
||||||
|
initial_grouped_order_id = self.kwargs.get("pk")
|
||||||
|
return (
|
||||||
|
GroupedOrder.objects.get(pk=initial_grouped_order_id).orga
|
||||||
|
== self.request.user
|
||||||
|
)
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
# overwrite the get function to copy the initial grouped order before redirecting to
|
||||||
|
# the update view of the new grouped order
|
||||||
|
initial_grouped_order = GroupedOrder.objects.get(pk=self.kwargs.get("pk"))
|
||||||
|
new_grouped_order = GroupedOrder.objects.create(
|
||||||
|
name=f"{initial_grouped_order.name} - copie",
|
||||||
|
orga=self.request.user,
|
||||||
|
delivery_date=initial_grouped_order.delivery_date,
|
||||||
|
deadline=initial_grouped_order.deadline,
|
||||||
|
place=initial_grouped_order.place,
|
||||||
|
description=initial_grouped_order.description,
|
||||||
|
)
|
||||||
|
# duplicate each item and add it to new_grouped_order
|
||||||
|
for item in initial_grouped_order.item_set.all():
|
||||||
|
item.pk = None
|
||||||
|
item.ordered_nb = 0
|
||||||
|
item.save()
|
||||||
|
new_grouped_order.item_set.add(item)
|
||||||
|
|
||||||
|
self.kwargs["new_go_id"] = new_grouped_order.pk
|
||||||
|
|
||||||
|
return super().get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def get_redirect_url(self, *args, **kwargs):
|
||||||
|
return reverse_lazy(
|
||||||
|
"order:update_grouped_order", kwargs={"pk": self.kwargs["new_go_id"]}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class GroupedOrderDeleteView(UserPassesTestMixin, generic.DeleteView):
|
class GroupedOrderDeleteView(UserPassesTestMixin, generic.DeleteView):
|
||||||
"""View for deleting a grouped order"""
|
"""View for deleting a grouped order"""
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue