diff --git a/la_chariotte/order/templates/order/grouped_order_overview.html b/la_chariotte/order/templates/order/grouped_order_overview.html index 02498a7..49432e1 100644 --- a/la_chariotte/order/templates/order/grouped_order_overview.html +++ b/la_chariotte/order/templates/order/grouped_order_overview.html @@ -137,9 +137,12 @@
- - Liste des mails - + +

Liste des commandes

{% if grouped_order.order_set.all %} @@ -281,6 +284,68 @@ navigator.clipboard.writeText(copyText.value); } + // Download emails list to csv + document.addEventListener('DOMContentLoaded', function () { + const downloadButton = document.getElementById('downloadButton'); + + downloadButton.addEventListener('click', function () { + fetch("{% url 'order:email_list' grouped_order.code %}") + .then(response => response.json()) + .then(data => { + + const orderName = data.order_name; + + const header = "Emails"; + const emailList = data.email_list; + const csvText = [header].concat(emailList).join('\n'); + + const blob = new Blob([csvText], { type: 'text/csv' }); + + const url = window.URL.createObjectURL(blob); + + const a = document.createElement('a'); + a.href = url; + a.download = orderName + '-mails.csv'; + document.body.appendChild(a); + + a.click(); + + document.body.removeChild(a); + + window.URL.revokeObjectURL(url); + }); + }); + }); + + // Copy emails list to clipboard + document.addEventListener('DOMContentLoaded', function () { + const copyButton = document.getElementById('copyButton'); + + copyButton.addEventListener('click', function () { + fetch("{% url 'order:email_list' grouped_order.code %}") + .then(response => response.json()) + .then(data => { + + const emailList = data.email_list; + + const emailText = emailList.join('\n'); + + const textArea = document.createElement('textarea'); + textArea.value = emailText; + + document.body.appendChild(textArea); + + textArea.select(); + + document.execCommand('copy'); + + document.body.removeChild(textArea); + + alert('Emails copiés depuis l\'URL dans le presse-papiers !'); + }); + }); + }); + // Tabs function openTab(idToOpen) { var i, tabcontent, tablinks; diff --git a/la_chariotte/order/tests/test_views/test_views_grouped_order.py b/la_chariotte/order/tests/test_views/test_views_grouped_order.py index 9d1b145..c208638 100644 --- a/la_chariotte/order/tests/test_views/test_views_grouped_order.py +++ b/la_chariotte/order/tests/test_views/test_views_grouped_order.py @@ -1396,7 +1396,10 @@ class TestExportGroupedOrderEmailAddressesToCSVView: ) response = client_log.get(email_list_view_url) assert response.status_code == 200 - assert response.content.decode() == "\r\n" + assert ( + response.content.decode() + == '{"order_name": "gr order test", "email_list": []}' + ) email = order_items_in_grouped_order(grouped_order).author.email response = client_log.get(email_list_view_url) diff --git a/la_chariotte/order/urls.py b/la_chariotte/order/urls.py index c6226e6..54d49ca 100644 --- a/la_chariotte/order/urls.py +++ b/la_chariotte/order/urls.py @@ -69,7 +69,7 @@ urlpatterns = [ ), path( "/gerer/liste-mails", - views.ExportGroupedOrderEmailAddressesToCSVView.as_view(), + views.ExportGroupOrderEmailAdressesToJSONView.as_view(), name="email_list", ), path( diff --git a/la_chariotte/order/views/__init__.py b/la_chariotte/order/views/__init__.py index 8e12745..1c5119b 100644 --- a/la_chariotte/order/views/__init__.py +++ b/la_chariotte/order/views/__init__.py @@ -1,7 +1,7 @@ from .grouped_order import ( DownloadGroupedOrderSheetView, - ExportGroupedOrderEmailAddressesToCSVView, ExportGroupedOrderToCSVView, + ExportGroupOrderEmailAdressesToJSONView, GroupedOrderAddItemsView, GroupedOrderCreateView, GroupedOrderDeleteView, diff --git a/la_chariotte/order/views/grouped_order.py b/la_chariotte/order/views/grouped_order.py index 54ea4fe..f0b9450 100644 --- a/la_chariotte/order/views/grouped_order.py +++ b/la_chariotte/order/views/grouped_order.py @@ -322,7 +322,7 @@ class DownloadGroupedOrderSheetView(WeasyTemplateResponseMixin, GroupedOrderExpo return f"{self.get_object().delivery_date} - {self.get_object().name}" -class ExportGroupedOrderEmailAddressesToCSVView(UserPassesTestMixin, generic.View): +class ExportGroupOrderEmailAdressesToJSONView(UserPassesTestMixin, generic.View): def test_func(self): # Restrict access to the manager origin = get_object_or_404(GroupedOrder, code=self.kwargs.get("code")) @@ -333,17 +333,11 @@ class ExportGroupedOrderEmailAddressesToCSVView(UserPassesTestMixin, generic.Vie participants = OrderAuthor.objects.filter( order__in=grouped_order.order_set.all() ) + email_list = [participant.email for participant in participants] - response = http.HttpResponse( - content_type="text/csv", - headers={ - "Content-Disposition": f'attachment; filename="{ grouped_order.name }-mails.csv"' - }, + return http.JsonResponse( + {"order_name": grouped_order.name, "email_list": email_list} ) - writer = csv.writer(response) - row = [participant.email for participant in participants] - writer.writerow(row) - return response class ExportGroupedOrderToCSVView(GroupedOrderExportView):