diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2023-11-16 16:24:51 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2024-04-16 16:38:33 +0200 |
commit | 01d3f76ea4f2bed48d71e78453ca2d0bd23b2342 (patch) | |
tree | 5327b984b465590b2bc81439bccb0fc7063a7ea6 /ishtar_common/admin.py | |
parent | ffd47cbfa1baa5eb2556e38253f548495b4189f1 (diff) | |
download | Ishtar-01d3f76ea4f2bed48d71e78453ca2d0bd23b2342.tar.bz2 Ishtar-01d3f76ea4f2bed48d71e78453ca2d0bd23b2342.zip |
✨ GDPR: admin - log (read only, export)
Diffstat (limited to 'ishtar_common/admin.py')
-rw-r--r-- | ishtar_common/admin.py | 70 |
1 files changed, 52 insertions, 18 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index af11be06c..803b5766a 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -18,6 +18,7 @@ # See the file COPYING for details. import csv +import datetime import json from io import TextIOWrapper, BytesIO import os @@ -160,29 +161,36 @@ def export_as_csv_action( based on http://djangosnippets.org/snippets/1697/ """ opts = modeladmin.model._meta - field_names = set([field.name for field in opts.fields]) - if fields: - fieldset = set(fields) - field_names = field_names & fieldset - elif exclude: - excludeset = set(exclude) - field_names = field_names - excludeset - - if hasattr(modeladmin, "CSV_FIELD_ORDER"): - field_order = modeladmin.CSV_FIELD_ORDER - field_names = sorted( - field_names, - key=lambda x: field_order.index(x) if x in field_order else 1000 - ) + if hasattr(modeladmin, "CSV_FIELDS"): + field_names = field_order = modeladmin.CSV_FIELDS + else: + field_names = set([field.name for field in opts.fields]) + if fields: + fieldset = set(fields) + field_names = field_names & fieldset + elif exclude: + excludeset = set(exclude) + field_names = field_names - excludeset + + if hasattr(modeladmin, "CSV_FIELD_ORDER"): + field_order = modeladmin.CSV_FIELD_ORDER + field_names = sorted( + field_names, + key=lambda x: field_order.index(x) if x in field_order else 1000 + ) response = HttpResponse(content_type="text/csv") - response["Content-Disposition"] = "attachment; filename=%s.csv" % str( - opts - ).replace(".", "_") + csv_name = str(opts).replace(".", "_") + if hasattr(modeladmin, "get_csv_name"): + csv_name = modeladmin.get_csv_name() + response["Content-Disposition"] = "attachment; filename=%s.csv" % csv_name writer = csv.writer(response) if header: - writer.writerow(list(field_names)) + if hasattr(modeladmin, "CSV_HEADER"): + writer.writerow(modeladmin.CSV_HEADER) + else: + writer.writerow(list(field_names)) for obj in queryset.order_by("pk"): row = [] for field in field_names: @@ -698,6 +706,32 @@ class PersonAdmin(HistorizedObjectAdmin): admin_site.register(models.Person, PersonAdmin) +@admin.register(models.GDPRLog, site=admin_site) +class GDPRLogAdmin(admin.ModelAdmin): + list_display = ("user", "date", "ip", "activity") + list_filter = ("activity",) + search_fields = ("user__username",) + actions = [ + export_as_csv_action(exclude=("id",)), + ] + CSV_HEADER = (_("Date"), _("User"), _("IP"), _("Activity"), _("Persons")) + CSV_FIELDS = ("date", "user", "ip", "activity_lbl", "persons_lbl") + + def has_add_permission(self, request, obj=None): + return False + + def has_change_permission(self, request, obj=None): + return False + + def has_delete_permission(self, request, obj=None): + return False + + def get_csv_name(self): + now = datetime.datetime.now() + lbl = str(_("export-gdpr")) + return f"{now.strftime('%Y-%m-%d-%H%M')}-{lbl}" + + class AuthorAdmin(admin.ModelAdmin): list_display = ["person", "author_type"] list_filter = ("author_type",) |