From 17b67cc5dea67a13f7c3de4fd9f65c24f1e840f0 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Thu, 12 Sep 2024 10:25:50 +0200 Subject: [PATCH 1/2] feat: very minimal CSV export of users and maps in admin fix #2020 --- umap/admin.py | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/umap/admin.py b/umap/admin.py index b92fb8e7..740aaa29 100644 --- a/umap/admin.py +++ b/umap/admin.py @@ -1,8 +1,31 @@ +import csv + +from django.contrib.auth.admin import UserAdmin as UserAdminBase +from django.contrib.auth.models import User from django.contrib.gis import admin +from django.http import HttpResponse +from django.utils.translation import gettext_lazy as _ from .models import DataLayer, Licence, Map, Pictogram, Team, TileLayer +class CSVExportMixin: + actions = ["as_csv"] + + @admin.action(description=_("CSV Export")) + def as_csv(self, request, queryset): + response = HttpResponse( + content_type="text/csv", + headers={"Content-Disposition": 'attachment; filename="export.csv"'}, + ) + + writer = csv.writer(response) + writer.writerow(self.csv_fields) + for user in queryset: + writer.writerow(getattr(user, field) for field in self.csv_fields) + return response + + class TileLayerAdmin(admin.ModelAdmin): list_display = ( "name", @@ -11,10 +34,22 @@ class TileLayerAdmin(admin.ModelAdmin): list_editable = ("rank",) -class MapAdmin(admin.GISModelAdmin): +class MapAdmin(CSVExportMixin, admin.GISModelAdmin): search_fields = ("name",) autocomplete_fields = ("owner", "editors") list_filter = ("share_status",) + csv_fields = ( + "pk", + "name", + "center", + "zoom", + "created_at", + "modified_at", + "edit_status", + "share_status", + "owner_id", + "team_id", + ) class PictogramAdmin(admin.ModelAdmin): @@ -30,9 +65,23 @@ class TeamAdmin(admin.ModelAdmin): filter_horizontal = ("users",) +class UserAdmin(CSVExportMixin, UserAdminBase): + csv_fields = [ + "pk", + "username", + "email", + "first_name", + "last_name", + "last_login", + "date_joined", + ] + + admin.site.register(Map, MapAdmin) admin.site.register(DataLayer) admin.site.register(Pictogram, PictogramAdmin) admin.site.register(TileLayer, TileLayerAdmin) admin.site.register(Licence) admin.site.register(Team, TeamAdmin) +admin.site.unregister(User) +admin.site.register(User, UserAdmin) From 9848abb3b1eaec92ad2836e69b4bf92e29276a2a Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Thu, 12 Sep 2024 15:23:26 +0200 Subject: [PATCH 2/2] wip: use model specific filename in admin CSV export --- umap/admin.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/umap/admin.py b/umap/admin.py index 740aaa29..29c43e60 100644 --- a/umap/admin.py +++ b/umap/admin.py @@ -1,4 +1,5 @@ import csv +from datetime import datetime from django.contrib.auth.admin import UserAdmin as UserAdminBase from django.contrib.auth.models import User @@ -14,9 +15,11 @@ class CSVExportMixin: @admin.action(description=_("CSV Export")) def as_csv(self, request, queryset): + modelname = queryset.model.__name__.lower() + filename = f"umap_{modelname}_{datetime.now().isoformat()}.csv" response = HttpResponse( content_type="text/csv", - headers={"Content-Disposition": 'attachment; filename="export.csv"'}, + headers={"Content-Disposition": f'attachment; filename="{filename}"'}, ) writer = csv.writer(response)