feat(emargement): ajoute un export csv
Parent
9c2f306c7a
révision
0209ad9aa4
|
@ -1,8 +1,10 @@
|
|||
import csv
|
||||
import datetime
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import PermissionDenied, ValidationError
|
||||
from django.db.models import Q
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import redirect
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.views.generic import FormView, RedirectView, detail
|
||||
|
@ -596,10 +598,54 @@ class ImportConfirm(AdminMixin, FormInvalidMixin, FormView):
|
|||
return "L'import n'a pas été poursuivi du fait d'erreurs."
|
||||
|
||||
|
||||
class ScrutinAttendees(detail.DetailView):
|
||||
class ScrutinAttendees(AdminMixin, detail.DetailView):
|
||||
model = models.Scrutin
|
||||
template_name = 'modeladmin/index_attendees.html'
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.is_csv_export = self.request.GET.get('action') == 'CSV'
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_csv_filename(self):
|
||||
""" Returns the filename for the generated CSV file """
|
||||
return 'export-{}.csv'.format(
|
||||
datetime.datetime.today().strftime('%Y-%m-%d')
|
||||
)
|
||||
|
||||
def get_csv_response(self, context):
|
||||
""" Returns a CSV response """
|
||||
filename = self.get_csv_filename()
|
||||
response = HttpResponse(content_type='text/csv; charset=utf-8')
|
||||
response['Content-Disposition'] = 'attachment;filename={}'.format(
|
||||
filename
|
||||
)
|
||||
|
||||
writer = csv.writer(response)
|
||||
attendees = self.object.get_attendees()
|
||||
writer.writerow(
|
||||
attendees['basic_fields']
|
||||
+ ['email']
|
||||
+ list(attendees['extended_fields'])
|
||||
)
|
||||
for pouvoir in attendees['emargement']:
|
||||
data_row = (
|
||||
[getattr(pouvoir, f) for f in attendees['basic_fields']]
|
||||
+ [", ".join(pouvoir.courriels_list())]
|
||||
+ [
|
||||
pouvoir.champ_perso.filter(intitule=f).first().contenu
|
||||
or ""
|
||||
for f in attendees['extended_fields']
|
||||
if pouvoir.champ_perso.filter(intitule=f).exists()
|
||||
]
|
||||
)
|
||||
writer.writerow(data_row)
|
||||
return response
|
||||
|
||||
def render_to_response(self, context, **response_kwargs):
|
||||
if self.is_csv_export:
|
||||
return self.get_csv_response(context)
|
||||
return super().render_to_response(context, **response_kwargs)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['attendees'] = self.object.get_attendees()
|
||||
|
|
|
@ -82,7 +82,7 @@
|
|||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="no-results-message">Il n'y a pas encore de répondant à ce scrutin.</p>
|
||||
<p class="no-results-message">Il n'y a pas encore de répondant à ce scrutin.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
Chargement…
Référencer dans un nouveau ticket