diff --git a/la_chariotte/order/templates/order/grouped_order_sheet.html b/la_chariotte/order/templates/order/grouped_order_sheet.html index 4b8f5bc..117d2f6 100644 --- a/la_chariotte/order/templates/order/grouped_order_sheet.html +++ b/la_chariotte/order/templates/order/grouped_order_sheet.html @@ -3,57 +3,59 @@ - {{ name }} - Liste des commandes + {{ grouped_order.name }} - Liste des commandes -

- {{ name }} - {{ delivery_date }} -

+

+ {{ grouped_order.name }} - {{ grouped_order.delivery_date }} +

{% if items %} @@ -69,12 +71,13 @@ - + {% for item in items %} - {% endfor %} + @@ -83,21 +86,21 @@ {{ item.ordered_nb }} {% endfor %} - + {% for order, ordered_items in orders_dict.items %} - {% for ordered_item in ordered_items %} - {% endfor %} - {% endfor %} @@ -106,11 +109,5 @@ Aucun produit n'a été commandé {% endif %} - diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index 6a092a5..0854560 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -1445,7 +1445,7 @@ class TestItemCreateView: class TestGroupedOrderSheetView: def test_get__not_orga(self, client_log, other_user): - """A user that is not organiszer of the GO accesses the sheet view. + """A user that is not organizer of the GO accesses the sheet view. They get a 403 error""" grouped_order = create_grouped_order( days_before_delivery_date=5, @@ -1497,17 +1497,18 @@ class TestGroupedOrderSheetView: ) response = client_log.get(generate_sheet_url) assert response.status_code == 200 - assert response.context["name"] == "gr order test" - assert response.context["delivery_date"] == grouped_order.delivery_date + assert response.context["grouped_order"] == grouped_order assert response.context["items"].count() == 0 + assert len(response.context["orders_dict"]) == 0 + + # we order some items in the grouped order order = order_items_in_grouped_order(grouped_order) response = client_log.get(generate_sheet_url) assert response.status_code == 200 - assert response.context["name"] == "gr order test" - assert response.context["delivery_date"] == grouped_order.delivery_date + assert response.context["grouped_order"] == grouped_order assert response.context["items"].count() == 2 assert response.context["orders_dict"][order] == [3, 2] - assert response.context["total_price"] == 24 + assert response.context["grouped_order"].total_price == 24 class TestExportGroupedOrderEmailAddressesToCSVView: diff --git a/la_chariotte/order/urls.py b/la_chariotte/order/urls.py index 397d6fe..c3b73b7 100644 --- a/la_chariotte/order/urls.py +++ b/la_chariotte/order/urls.py @@ -52,7 +52,7 @@ urlpatterns = [ ), path( "/gerer/imprimer", - views.GroupedOrderSheetView.as_view(), + views.DownloadGroupedOrderSheetView.as_view(), name="grouped_order_sheet", ), path( diff --git a/la_chariotte/order/views/__init__.py b/la_chariotte/order/views/__init__.py index 1acbe58..6b7883d 100644 --- a/la_chariotte/order/views/__init__.py +++ b/la_chariotte/order/views/__init__.py @@ -1,5 +1,6 @@ # fmt: off -from .grouped_order import (ExportGroupedOrderEmailAddressesToCSVView, +from .grouped_order import (DownloadGroupedOrderSheetView, + ExportGroupedOrderEmailAddressesToCSVView, GroupedOrderAddItemsView, GroupedOrderCreateView, GroupedOrderDeleteView, GroupedOrderDetailView, GroupedOrderDuplicateView, GroupedOrderOverview, diff --git a/la_chariotte/order/views/grouped_order.py b/la_chariotte/order/views/grouped_order.py index 080b206..adee9fe 100644 --- a/la_chariotte/order/views/grouped_order.py +++ b/la_chariotte/order/views/grouped_order.py @@ -8,6 +8,8 @@ from django.template.loader import get_template from django.urls import reverse, reverse_lazy from django.utils import timezone from django.views import generic +from django_weasyprint import WeasyTemplateResponseMixin +from django_weasyprint.views import WeasyTemplateResponse, WeasyTemplateView from xhtml2pdf import pisa from ..forms import GroupedOrderForm, Item @@ -217,11 +219,21 @@ class GroupedOrderAddItemsView(UserPassesTestMixin, generic.ListView): return GroupedOrder.objects.get(pk=grouped_order_id).orga == self.request.user -class GroupedOrderSheetMixin: - """Mixin for grouped order info export (pdf sheet and csv)""" +class GroupedOrderSheetView(UserPassesTestMixin, generic.DetailView): + """View for gathering information about the groupedorder, in order to download it + in the DownloadGroupedOrderSheetView""" - def get_grouped_order_infos(self, grouped_order_id): - grouped_order = get_object_or_404(GroupedOrder, id=grouped_order_id) + model = GroupedOrder + template_name = "order/grouped_order_sheet.html" + context_object_name = "grouped_order" + + def test_func(self): + """Accessible only if the requesting user is the grouped order organizer""" + return self.get_object().orga == self.request.user + + def get_context_data(self, **kwargs): + context = super(GroupedOrderSheetView, self).get_context_data(**kwargs) + grouped_order = self.get_object() # Get ordered items items = grouped_order.item_set.filter(ordered_nb__gt=0).order_by("name") @@ -238,30 +250,19 @@ class GroupedOrderSheetMixin: ordered_values.append(value) orders_dict[order] = ordered_values # order as key of the dict - return { - "name": grouped_order.name, - "delivery_date": grouped_order.delivery_date, - "items": items, - "orders_dict": orders_dict, - "total_price": grouped_order.total_price, - } + context["items"] = items + context["orders_dict"] = orders_dict + + return context -class GroupedOrderSheetView(GroupedOrderOverview, GroupedOrderSheetMixin): - """View to get a pdf sheet summing up the grouped order for delivery""" +class DownloadGroupedOrderSheetView(WeasyTemplateResponseMixin, GroupedOrderSheetView): + """View for downloading the grouped order sheet, + using django-weasyprint : https://pypi.org/project/django-weasyprint/""" - template_name = "order/grouped_order_sheet.html" - - def get(self, request, pk): - grouped_order_sheet_info = self.get_grouped_order_infos(pk) - # should_include_prices = True if request.GET.get("with_prices", False) else False - # delivery_sheet_info["include_prices"] = should_include_prices - à ajouter plus tard - template = get_template(self.template_name) - html = template.render(grouped_order_sheet_info) - - result = BytesIO() - pdf = pisa.pisaDocument(BytesIO(html.encode("UTF-8")), result) - return http.HttpResponse(result.getvalue(), content_type="application/pdf") + def get_pdf_filename(self): + # filename for download + return f"{self.get_object().delivery_date} - {self.get_object().name}" class ExportGroupedOrderEmailAddressesToCSVView(UserPassesTestMixin, generic.View): diff --git a/requirements.txt b/requirements.txt index 4a94e9b..5aac60a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -100,5 +100,7 @@ webencodings==0.5.1 # cssselect2 # html5lib # tinycss2 +weasyprint==58.0 #django-weasyprint doesn't work with weasyprint 59.0 +django-weasyprint==2.2.0 xhtml2pdf==0.2.11 # via la-chariotte (pyproject.toml)
Prix unitairePrix unitaire + {{ item.price }} € - +
TOTAL{{ total_price }} €{{ grouped_order.total_price }} €
+ {{ order.author }} - + + {{ ordered_item }} - + + {{ order.price }} € - +