From 0bf680c74bd41c076673be69f38107b4f3c96f6e Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Thu, 6 Jul 2023 16:31:48 +0200 Subject: [PATCH] duplicate grouped order part 2 --- la_chariotte/order/urls.py | 5 +++ la_chariotte/order/views/__init__.py | 5 +-- la_chariotte/order/views/grouped_order.py | 41 +++++++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/la_chariotte/order/urls.py b/la_chariotte/order/urls.py index f31d2f8..397d6fe 100644 --- a/la_chariotte/order/urls.py +++ b/la_chariotte/order/urls.py @@ -35,6 +35,11 @@ urlpatterns = [ views.GroupedOrderDeleteView.as_view(), name="delete_grouped_order", ), + path( + "/dupliquer", + views.GroupedOrderDuplicateView.as_view(), + name="duplicate_grouped_order", + ), path( "/gerer-produits/nouveau", views.ItemCreateView.as_view(), diff --git a/la_chariotte/order/views/__init__.py b/la_chariotte/order/views/__init__.py index 7cceb7d..1acbe58 100644 --- a/la_chariotte/order/views/__init__.py +++ b/la_chariotte/order/views/__init__.py @@ -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 diff --git a/la_chariotte/order/views/grouped_order.py b/la_chariotte/order/views/grouped_order.py index 545d43f..935ad90 100644 --- a/la_chariotte/order/views/grouped_order.py +++ b/la_chariotte/order/views/grouped_order.py @@ -129,6 +129,47 @@ 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""" + + 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"""