duplicate grouped order

closes #7
This commit is contained in:
Laetitia Getti 2023-07-05 16:47:40 +02:00
parent a32ebe529c
commit f4c08a3a23
5 changed files with 168 additions and 20 deletions

View file

@ -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>

View file

@ -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."""

View file

@ -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(),

View file

@ -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

View file

@ -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"""