From 4268caf36ae5b4990ef464909ede6b418d995235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carles=20Barrobe=CC=81s?= Date: Thu, 18 Apr 2024 16:59:47 +0200 Subject: [PATCH] Add ability to export members as CSV file --- shipanaro/urls.py | 1 + shipanaro/views.py | 46 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/shipanaro/urls.py b/shipanaro/urls.py index 2991dbe..fe6aafe 100644 --- a/shipanaro/urls.py +++ b/shipanaro/urls.py @@ -6,6 +6,7 @@ urlpatterns = [ url(r"^$", views.index, name="index"), + url(r"^afiliats.csv", views.csv_export, name="csv"), url(r"^accounts/", include("shipanaro.auth.urls")), url(r"^__capitania__/", admin.site.urls), url(r"^sso/", include("shipanaro.sso.urls")), diff --git a/shipanaro/views.py b/shipanaro/views.py index 0b85979..720cbf1 100644 --- a/shipanaro/views.py +++ b/shipanaro/views.py @@ -1,18 +1,25 @@ -from django.contrib.auth.decorators import login_required +import csv + +from django.contrib.auth.decorators import login_required, user_passes_test from django.conf import settings +from django.http import HttpResponse from django.utils.translation import gettext as _ from django.views.generic import TemplateView +from shipanaro.models import Membership + class IndexView(TemplateView): - template_name = 'shipanaro/index.html' + template_name = "shipanaro/index.html" extra_context = None def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context.update({ - 'title': _('Home'), - }) + context.update( + { + "title": _("Home"), + } + ) context.update(self.extra_context or {}) return context @@ -24,9 +31,34 @@ def index(request, extra_context=None): def view_defaults(extra_context=None, **kwargs): extra_context = extra_context or {} - extra_context['site_title'] = _(settings.SHIPANARO_SITE_NAME) + extra_context["site_title"] = _(settings.SHIPANARO_SITE_NAME) context = { - 'extra_context': extra_context, + "extra_context": extra_context, } context.update(kwargs) return context + + +@user_passes_test(lambda user: user.is_staff) +def csv_export(request): + # Create the HttpResponse object with the appropriate CSV header. + response = HttpResponse( + content_type="text/csv", + headers={"Content-Disposition": 'attachment; filename="afiliats.csv"'}, + ) + + writer = csv.writer(response) + writer.writerow(["First Name", "Last Name", "Email Address", "ID", "Active"]) + + for member in Membership.objects.filter(drop_out=False): + writer.writerow( + [ + member.user.first_name, + member.user.last_name, + member.user.email, + member.nid, + str(not member.drop_out).lower(), + ] + ) + + return response