diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b75b07a..170f92a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,10 @@ adhérents ni des cotisations. ses places pour pouvoir revendre. - On s'assure que les emails dans les demandes de petits cours sont valides. +### BDS + +- Le buro peut exporter la liste de membres avec email au format CSV depuis la page d'acceuil. + ### K-Fêt - On affiche les articles actuellement en vente en premier lors des inventaires diff --git a/bds/templates/bds/home.html b/bds/templates/bds/home.html index 4a3e95f6..9ccaa364 100644 --- a/bds/templates/bds/home.html +++ b/bds/templates/bds/home.html @@ -7,7 +7,7 @@
-

{{ member_count }}

+

{{ member_count }}

adhérent·e·s
@@ -34,6 +34,11 @@

+ Télécharger la liste des membres (CSV) + +
+
+ Le site est encore en développement.
Suivez notre avancement sur @@ -52,4 +57,4 @@ {% endblock layout %} - + diff --git a/bds/urls.py b/bds/urls.py index f0877e3f..93c60b0d 100644 --- a/bds/urls.py +++ b/bds/urls.py @@ -14,4 +14,5 @@ urlpatterns = [ name="user.create.fromclipper", ), path("user/delete/", views.UserDeleteView.as_view(), name="user.delete"), + path("members", views.export_members, name="export.members"), ] diff --git a/bds/views.py b/bds/views.py index 0318d1e6..540865b1 100644 --- a/bds/views.py +++ b/bds/views.py @@ -1,5 +1,9 @@ +import csv + from django.contrib import messages from django.contrib.auth import get_user_model +from django.contrib.auth.decorators import permission_required +from django.http import HttpResponse from django.shortcuts import get_object_or_404 from django.urls import reverse, reverse_lazy from django.utils.translation import gettext_lazy as _ @@ -128,3 +132,21 @@ class UserDeleteView(StaffRequiredMixin, DeleteView): messages.success(request, self.success_message) return super().delete(request, *args, **kwargs) + + +@permission_required("bds.is_team") +def export_members(request): + response = HttpResponse(content_type="text/csv") + response["Content-Disposition"] = "attachment; filename=membres_bds.csv" + + writer = csv.writer(response) + for profile in BDSProfile.objects.filter(is_member=True).all(): + user = profile.user + bits = [ + user.username, + user.get_full_name(), + user.email, + ] + writer.writerow([str(bit) for bit in bits]) + + return response