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

View file

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

View file

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

View file

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

View file

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