From cbc0a3b11968e65a9cdfcaf3b217674a36fa2371 Mon Sep 17 00:00:00 2001 From: PierreDubrulle Date: Tue, 16 Jan 2024 00:16:26 +0100 Subject: [PATCH] Refactor emails download --- .../order/grouped_order_overview.html | 81 ++++++------------- la_chariotte/order/urls.py | 2 +- la_chariotte/order/views/__init__.py | 2 +- la_chariotte/order/views/grouped_order.py | 19 ++++- la_chariotte/templates/base.html | 1 + 5 files changed, 42 insertions(+), 63 deletions(-) diff --git a/la_chariotte/order/templates/order/grouped_order_overview.html b/la_chariotte/order/templates/order/grouped_order_overview.html index 49432e1..0e97afb 100644 --- a/la_chariotte/order/templates/order/grouped_order_overview.html +++ b/la_chariotte/order/templates/order/grouped_order_overview.html @@ -284,68 +284,35 @@ 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); - }); + // Download emails list + function downloadEmailToCSV() { + fetch("{% url 'order:email_list' grouped_order.code %}?format=csv") + .then(response => response.text()) + .then(data => { + var blob = new Blob([data], {type: "text/csv;charset=utf-8"}); + saveAs(blob, "liste_emails.csv"); }); - }); + } // 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 !'); - }); - }); + function copyEmailsToClipboard() { + fetch("{% url 'order:email_list' grouped_order.code %}") + .then(response => response.json()) + .then(data => { + var emailList = data.email_list; + console.log(emailList); + navigator.clipboard.writeText(emailList).then(function() { + alert("La liste des e-mails a été copiée dans le presse-papiers !\nUtilisez Ctrl+V pour la coller."); + }, function(err) { + console.error('Erreur lors de la copie des emails : ', err); + console.error('Liste des emails : ', emailList); }); + }); + } + document.getElementById("copyButton").addEventListener("click", copyEmailsToClipboard); + + document.getElementById("downloadButton").addEventListener("click", downloadEmailToCSV); // Tabs function openTab(idToOpen) { var i, tabcontent, tablinks; diff --git a/la_chariotte/order/urls.py b/la_chariotte/order/urls.py index 54d49ca..e49629d 100644 --- a/la_chariotte/order/urls.py +++ b/la_chariotte/order/urls.py @@ -69,7 +69,7 @@ urlpatterns = [ ), path( "/gerer/liste-mails", - views.ExportGroupOrderEmailAdressesToJSONView.as_view(), + views.ExportGroupOrderEmailAdressesToDownloadView.as_view(), name="email_list", ), path( diff --git a/la_chariotte/order/views/__init__.py b/la_chariotte/order/views/__init__.py index 1c5119b..7522900 100644 --- a/la_chariotte/order/views/__init__.py +++ b/la_chariotte/order/views/__init__.py @@ -1,7 +1,7 @@ from .grouped_order import ( DownloadGroupedOrderSheetView, ExportGroupedOrderToCSVView, - ExportGroupOrderEmailAdressesToJSONView, + ExportGroupOrderEmailAdressesToDownloadView, GroupedOrderAddItemsView, GroupedOrderCreateView, GroupedOrderDeleteView, diff --git a/la_chariotte/order/views/grouped_order.py b/la_chariotte/order/views/grouped_order.py index f0b9450..ea832ad 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 ExportGroupOrderEmailAdressesToJSONView(UserPassesTestMixin, generic.View): +class ExportGroupOrderEmailAdressesToDownloadView(UserPassesTestMixin, generic.View): def test_func(self): # Restrict access to the manager origin = get_object_or_404(GroupedOrder, code=self.kwargs.get("code")) @@ -335,9 +335,20 @@ class ExportGroupOrderEmailAdressesToJSONView(UserPassesTestMixin, generic.View) ) email_list = [participant.email for participant in participants] - return http.JsonResponse( - {"order_name": grouped_order.name, "email_list": email_list} - ) + format = self.request.GET.get("format", "json") + if format == "csv": + response = http.HttpResponse(content_type="text/csv") + response['Content-Disposition'] = 'attachment; filename="emails.csv"' + writer = csv.writer(response) + writer.writerow(['order_name', 'email']) + for email in email_list: + writer.writerow([grouped_order.name, email]) + return response + else: + email_list = ";\n".join(email_list) + return http.JsonResponse( + {"order_name": grouped_order.name, "email_list": email_list} + ) class ExportGroupedOrderToCSVView(GroupedOrderExportView): diff --git a/la_chariotte/templates/base.html b/la_chariotte/templates/base.html index 6dc3fb2..252c38e 100644 --- a/la_chariotte/templates/base.html +++ b/la_chariotte/templates/base.html @@ -11,6 +11,7 @@ + {% block title %}{% endblock %} - La Chariotte {% block css %}