mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-02 20:01:51 +02:00
feature copy emails list to clipboard
This commit is contained in:
parent
e41c817faa
commit
c4d46acd20
5 changed files with 78 additions and 16 deletions
|
@ -137,9 +137,12 @@
|
||||||
|
|
||||||
<div id="commandes" class="box tabcontent">
|
<div id="commandes" class="box tabcontent">
|
||||||
<div class="buttons is-pulled-right">
|
<div class="buttons is-pulled-right">
|
||||||
<a class="button is-info" href="{% url 'order:email_list' grouped_order.code %}" title="Télécharger la liste des mails des participants">
|
<button id="downloadButton" class="button is-info" title="Télécharger la liste des e-mails dans le presse-papiers">
|
||||||
<i class="fa fa-download mr-3" aria-hidden="true"></i>Liste des mails
|
<i class="fa fa-download mr-3" aria-hidden="true"></i>Télécharger la liste des e-mails
|
||||||
</a>
|
</button>
|
||||||
|
<button id="copyButton" class="button is-info" title="Copier la liste des e-mails dans le presse-papiers">
|
||||||
|
<i class="fa fa-copy mr-3" aria-hidden="true"></i>Copier la liste des e-mails
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<p class="title">Liste des commandes</p>
|
<p class="title">Liste des commandes</p>
|
||||||
{% if grouped_order.order_set.all %}
|
{% if grouped_order.order_set.all %}
|
||||||
|
@ -281,6 +284,68 @@
|
||||||
navigator.clipboard.writeText(copyText.value);
|
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
|
// Tabs
|
||||||
function openTab(idToOpen) {
|
function openTab(idToOpen) {
|
||||||
var i, tabcontent, tablinks;
|
var i, tabcontent, tablinks;
|
||||||
|
|
|
@ -1396,7 +1396,10 @@ class TestExportGroupedOrderEmailAddressesToCSVView:
|
||||||
)
|
)
|
||||||
response = client_log.get(email_list_view_url)
|
response = client_log.get(email_list_view_url)
|
||||||
assert response.status_code == 200
|
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
|
email = order_items_in_grouped_order(grouped_order).author.email
|
||||||
response = client_log.get(email_list_view_url)
|
response = client_log.get(email_list_view_url)
|
||||||
|
|
|
@ -69,7 +69,7 @@ urlpatterns = [
|
||||||
),
|
),
|
||||||
path(
|
path(
|
||||||
"<str:code>/gerer/liste-mails",
|
"<str:code>/gerer/liste-mails",
|
||||||
views.ExportGroupedOrderEmailAddressesToCSVView.as_view(),
|
views.ExportGroupOrderEmailAdressesToJSONView.as_view(),
|
||||||
name="email_list",
|
name="email_list",
|
||||||
),
|
),
|
||||||
path(
|
path(
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from .grouped_order import (
|
from .grouped_order import (
|
||||||
DownloadGroupedOrderSheetView,
|
DownloadGroupedOrderSheetView,
|
||||||
ExportGroupedOrderEmailAddressesToCSVView,
|
|
||||||
ExportGroupedOrderToCSVView,
|
ExportGroupedOrderToCSVView,
|
||||||
|
ExportGroupOrderEmailAdressesToJSONView,
|
||||||
GroupedOrderAddItemsView,
|
GroupedOrderAddItemsView,
|
||||||
GroupedOrderCreateView,
|
GroupedOrderCreateView,
|
||||||
GroupedOrderDeleteView,
|
GroupedOrderDeleteView,
|
||||||
|
|
|
@ -322,7 +322,7 @@ class DownloadGroupedOrderSheetView(WeasyTemplateResponseMixin, GroupedOrderExpo
|
||||||
return f"{self.get_object().delivery_date} - {self.get_object().name}"
|
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):
|
def test_func(self):
|
||||||
# Restrict access to the manager
|
# Restrict access to the manager
|
||||||
origin = get_object_or_404(GroupedOrder, code=self.kwargs.get("code"))
|
origin = get_object_or_404(GroupedOrder, code=self.kwargs.get("code"))
|
||||||
|
@ -333,17 +333,11 @@ class ExportGroupedOrderEmailAddressesToCSVView(UserPassesTestMixin, generic.Vie
|
||||||
participants = OrderAuthor.objects.filter(
|
participants = OrderAuthor.objects.filter(
|
||||||
order__in=grouped_order.order_set.all()
|
order__in=grouped_order.order_set.all()
|
||||||
)
|
)
|
||||||
|
email_list = [participant.email for participant in participants]
|
||||||
|
|
||||||
response = http.HttpResponse(
|
return http.JsonResponse(
|
||||||
content_type="text/csv",
|
{"order_name": grouped_order.name, "email_list": email_list}
|
||||||
headers={
|
|
||||||
"Content-Disposition": f'attachment; filename="{ grouped_order.name }-mails.csv"'
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
writer = csv.writer(response)
|
|
||||||
row = [participant.email for participant in participants]
|
|
||||||
writer.writerow(row)
|
|
||||||
return response
|
|
||||||
|
|
||||||
|
|
||||||
class ExportGroupedOrderToCSVView(GroupedOrderExportView):
|
class ExportGroupedOrderToCSVView(GroupedOrderExportView):
|
||||||
|
|
Loading…
Reference in a new issue