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>Fin des commandes</th>
|
||||
<th>Nombre de commandes</th>
|
||||
<th>Voir</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -34,12 +34,17 @@
|
|||
<td>{{ gr_order.delivery_date }}</td>
|
||||
<td>{{ gr_order.deadline }}</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>
|
||||
</a>
|
||||
<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>
|
||||
</a></td>
|
||||
</a>
|
||||
<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>
|
||||
</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>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
@ -54,7 +59,7 @@
|
|||
<th>Livraison</th>
|
||||
<th>Fin des commandes</th>
|
||||
<th>Nombre de commandes</th>
|
||||
<th>Voir</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -67,12 +72,17 @@
|
|||
<td>{{ gr_order.delivery_date }}</td>
|
||||
<td>{{ gr_order.deadline }}</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>
|
||||
</a>
|
||||
<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>
|
||||
</a></td>
|
||||
</a>
|
||||
<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>
|
||||
</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>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
@ -87,7 +97,7 @@
|
|||
<th>Livraison</th>
|
||||
<th>Fin des commandes</th>
|
||||
<th>Nombre de commandes</th>
|
||||
<th>Voir</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -100,12 +110,17 @@
|
|||
<td>{{ gr_order.delivery_date }}</td>
|
||||
<td>{{ gr_order.deadline }}</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>
|
||||
</a>
|
||||
<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>
|
||||
</a></td>
|
||||
</a>
|
||||
<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>
|
||||
</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>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
|
|
@ -1288,6 +1288,90 @@ class TestGroupedOrderDeleteView:
|
|||
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:
|
||||
def test_create_item(self, client_log):
|
||||
"""A user that has created a grouped order adds an item to it."""
|
||||
|
|
|
@ -35,6 +35,11 @@ urlpatterns = [
|
|||
views.GroupedOrderDeleteView.as_view(),
|
||||
name="delete_grouped_order",
|
||||
),
|
||||
path(
|
||||
"<int:pk>/dupliquer",
|
||||
views.GroupedOrderDuplicateView.as_view(),
|
||||
name="duplicate_grouped_order",
|
||||
),
|
||||
path(
|
||||
"<int:pk>/gerer-produits/nouveau",
|
||||
views.ItemCreateView.as_view(),
|
||||
|
|
|
@ -2,8 +2,9 @@
|
|||
from .grouped_order import (ExportGroupedOrderEmailAddressesToCSVView,
|
||||
GroupedOrderAddItemsView, GroupedOrderCreateView,
|
||||
GroupedOrderDeleteView, GroupedOrderDetailView,
|
||||
GroupedOrderOverview, GroupedOrderSheetView,
|
||||
GroupedOrderUpdateView, IndexView)
|
||||
GroupedOrderDuplicateView, GroupedOrderOverview,
|
||||
GroupedOrderSheetView, GroupedOrderUpdateView,
|
||||
IndexView)
|
||||
from .item import ItemCreateView, ItemDeleteView
|
||||
from .order import OrderDetailView, order
|
||||
|
||||
|
|
|
@ -129,6 +129,49 @@ class GroupedOrderUpdateView(UserPassesTestMixin, generic.UpdateView):
|
|||
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):
|
||||
"""View for deleting a grouped order"""
|
||||
|
||||
|
|
Loading…
Reference in a new issue