Skip to content

Commit 0bbfea5

Browse files
committed
Export csv evenements
1 parent 518af26 commit 0bbfea5

3 files changed

Lines changed: 66 additions & 1 deletion

File tree

orgues/templates/orgues/orgue_list.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ <h5>Quelques conseils pour éditer la photo principale d'une fiche d'orgue</h5>
4747
{% endif %}
4848
<hr>
4949

50+
{% if perms.orgues.view_user %}
51+
<a href="{% url 'orgues:evenement-csv' %}" class="btn btn-warning rounded-pill mt-3 btn-block">
52+
Export des événements en csv</a>
53+
{% endif %}
54+
<hr>
55+
5056
{% if perms.orgues.add_orgue %}
5157
<a href="{% url 'orgues:orgue-create' %}" class="btn btn-info rounded-pill mt-3 btn-block">
5258
Créer un nouvel orgue</a>

orgues/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
urlpatterns = [
77
path('orgues/', v.OrgueList.as_view(), name='orgue-list'),
88
path('orgues/csv/', v.OrgueExport.as_view(), name='orgue-csv'),
9+
path('evenements/csv/', v.EvenementExport.as_view(), name='evenement-csv'),
910
path('recherche/', v.OrgueSearch.as_view(), name='orgue-search'),
1011
path('stats.json', v.Stats.as_view(), name='orgue-stats-js'),
1112
path('carte/', v.OrgueCarte.as_view(), name='orgue-carte'),

orgues/views.py

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
from django.core import serializers
1414
from django.core.paginator import Paginator
1515
from django.db import connection, transaction
16-
from django.db.models import Q, Count, Case, When, IntegerField, Value
16+
from django.db.models import Q, Count, Case, When, IntegerField, Value, F, Aggregate, CharField
17+
from django.db.models.functions import Concat
1718
from django.forms import modelformset_factory
1819
from django.http import JsonResponse, Http404, HttpResponse
1920
from django.shortcuts import get_object_or_404, redirect, render
@@ -1684,6 +1685,63 @@ def get(self, request, *args, **kwargs):
16841685
return response
16851686

16861687

1688+
class GroupConcat(Aggregate):
1689+
function = 'GROUP_CONCAT'
1690+
template = "%(function)s(%(expressions)s, '%(separator)s')"
1691+
1692+
def __init__(self, expression, separator=', ', **extra):
1693+
super().__init__(
1694+
expression,
1695+
separator=separator,
1696+
output_field=CharField(),
1697+
**extra
1698+
)
1699+
1700+
class EvenementExport(FabView):
1701+
permission_required = 'orgues.view_user'
1702+
1703+
def get(self, request, *args, **kwargs):
1704+
response = HttpResponse(content_type='text/csv')
1705+
response.write(u'\ufeff'.encode('utf8'))
1706+
response['Content-Disposition'] = 'attachment;filename=evenements_orgue_{}.csv'.format(
1707+
datetime.today().strftime("%Y-%m-%d"))
1708+
columns = [
1709+
"annee",
1710+
"annee_fin",
1711+
"nom_orgue",
1712+
"circa",
1713+
"type",
1714+
"nom_facteurs",
1715+
"nom_manufactures",
1716+
]
1717+
writer = csv.DictWriter(response, delimiter=';', fieldnames=columns)
1718+
1719+
# header from verbose_names
1720+
row = {}
1721+
for column in columns:
1722+
try:
1723+
field = Evenement._meta.get_field(column)
1724+
row[column] = field.verbose_name
1725+
except:
1726+
# Pour les colonnes "virtuelles", on met un nom lisible par défaut
1727+
row[column] = column.replace('_', ' ').capitalize()
1728+
writer.writerow(row)
1729+
writer.writerows(
1730+
Evenement.objects.annotate(
1731+
nom_orgue = Concat(
1732+
F('orgue__designation'),
1733+
Value(' '),
1734+
F('orgue__edifice'),
1735+
Value(' '),
1736+
F('orgue__commune')
1737+
),
1738+
nom_facteurs = GroupConcat('facteurs__nom', separator=', '),
1739+
nom_manufactures = GroupConcat('manufactures__nom', separator=', '),
1740+
).values(*columns).order_by("annee")
1741+
)
1742+
return response
1743+
1744+
16871745
class Dashboard(FabView):
16881746
"""
16891747
Dashboard d'avancement réservé aux admins

0 commit comments

Comments
 (0)