Added a admin action to cleanup personal data from inactive members.

This commit is contained in:
2018-05-03 09:45:06 +02:00
parent ac9b3e06c0
commit 121167f1fe
4 changed files with 64 additions and 18 deletions

View File

@@ -1,11 +1,11 @@
""" Admin Interface to manage the memberships.""" """ Admin Interface to manage the memberships."""
# import stuff we need from django # import stuff we need from django
from django.contrib import admin from django.contrib import admin, messages
from django.contrib.auth.admin import UserAdmin, GroupAdmin from django.contrib.auth.admin import UserAdmin, GroupAdmin
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.core.exceptions import PermissionDenied
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from easy_thumbnails import fields, widgets from easy_thumbnails import fields, widgets
from membership.models import Membership, ActivationRequest from membership.models import Membership, ActivationRequest
@@ -16,13 +16,14 @@ def activate_user(modeladmin, request, queryset):
:param request: An HttpRequest representing the current request. :param request: An HttpRequest representing the current request.
:param queryset: A QuerySet containing the objects selected by the user. :param queryset: A QuerySet containing the objects selected by the user.
""" """
[activation.activate() for activation in queryset ] [activation.activate() for activation in queryset]
activate_user.short_description = _('Activate selected User') activate_user.short_description = _('Activate selected User')
def cleanup_activation(modeladmin, request, queryset): # Ignore PyLintBear (W0613) def cleanup_activation(modeladmin, request,
queryset): # Ignore PyLintBear (W0613)
"""Delete every selected activation request that has been expired. """Delete every selected activation request that has been expired.
:param modeladmin: The ModelAdmin that triggered this action. :param modeladmin: The ModelAdmin that triggered this action.
@@ -38,6 +39,33 @@ cleanup_activation.short_description = _(
"Cleanup selected Activation Requests") "Cleanup selected Activation Requests")
def clear_personal_data(modeladmin, request, queryset):
"""deactivates the account and removes all personal user information.
:param modeladmin: The ModelAdmin that triggered this action.
:param request: An HttpRequest representing the current request.
:param queryset: A QuerySet containing the objects selected by the user.
"""
cleared_memberships = 0
if not modeladmin.has_delete_permission(request):
raise PermissionDenied
for membership in queryset:
if membership.membership == False:
[ setattr(membership, fieldname, None) for fieldname in membership.nullable_personal_data ]
[ setattr(membership, fieldname, "") for fieldname in membership.blankable_personal_data ]
membership.is_active = False
membership.confirmed = False
membership.membership = False
membership.save()
cleared_memberships += 1
else:
modeladmin.message_user(request, _("Can't remove personal data from active member %s.") % membership.username, messages.ERROR)
if cleared_memberships > 0:
modeladmin.message_user(request, _("Cleared %d personal data profiles.") % cleared_memberships, messages.INFO)
clear_personal_data.short_description = _("Clear personal Data")
class ProxyGroup(Group): class ProxyGroup(Group):
"""A Proxy to list Usergroups from django.contrib.auth here.""" """A Proxy to list Usergroups from django.contrib.auth here."""
@@ -50,6 +78,8 @@ class ProxyGroup(Group):
class MembershipAdmin(UserAdmin): class MembershipAdmin(UserAdmin):
"""Admin interface to manage membership. e.g. users.""" """Admin interface to manage membership. e.g. users."""
actions = [clear_personal_data, ]
formfield_overrides = { formfield_overrides = {
fields.ThumbnailerImageField: { fields.ThumbnailerImageField: {
'widget': widgets.ImageClearableFileInput}, 'widget': widgets.ImageClearableFileInput},

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kasu.membership\n" "Project-Id-Version: kasu.membership\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-04-30 10:57+0200\n" "POT-Creation-Date: 2018-05-03 09:36+0200\n"
"PO-Revision-Date: 2018-04-30 10:59+0105\n" "PO-Revision-Date: 2018-05-03 09:39+0105\n"
"Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n" "Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n"
"Language-Team: Kasu <verein@kasu.at>\n" "Language-Team: Kasu <verein@kasu.at>\n"
"Language: de\n" "Language: de\n"
@@ -31,27 +31,42 @@ msgstr "Weiblich"
msgid "Activate selected User" msgid "Activate selected User"
msgstr "Ausgewählte Benutzer freischalten" msgstr "Ausgewählte Benutzer freischalten"
#: admin.py:38 #: admin.py:39
msgid "Cleanup selected Activation Requests" msgid "Cleanup selected Activation Requests"
msgstr "Ausgewählte Aktivierungsanfragen bereinigen" msgstr "Ausgewählte Aktivierungsanfragen bereinigen"
#: admin.py:47 #: admin.py:62
#, python-format
msgid "Can't remove personal data from active member %s."
msgstr ""
"Persönliche Daten von aktiven Mitglied %s können nicht entfernt werden."
#: admin.py:64
#, python-format
msgid "Cleared %d personal data profiles."
msgstr "Persönliche Daten in %d Profilen entfernt."
#: admin.py:66
msgid "Clear personal Data"
msgstr "Persönliche Daten bereinigen"
#: admin.py:75
msgid "Group" msgid "Group"
msgstr "Gruppe" msgstr "Gruppe"
#: admin.py:48 #: admin.py:76
msgid "Groups" msgid "Groups"
msgstr "Gruppen" msgstr "Gruppen"
#: admin.py:72 models.py:163 models.py:216 #: admin.py:102 models.py:163 models.py:218
msgid "Membership" msgid "Membership"
msgstr "Mitgliedschaft" msgstr "Mitgliedschaft"
#: admin.py:77 #: admin.py:107
msgid "Permissions" msgid "Permissions"
msgstr "Berechtigung" msgstr "Berechtigung"
#: admin.py:79 #: admin.py:109
msgid "Important dates" msgid "Important dates"
msgstr "Wichtige Daten" msgstr "Wichtige Daten"
@@ -159,7 +174,7 @@ msgstr "Bestätigt"
msgid "This person has paid the membership fee." msgid "This person has paid the membership fee."
msgstr "Diese Person hat ihre Mitgliedschaft bezahlt" msgstr "Diese Person hat ihre Mitgliedschaft bezahlt"
#: models.py:217 #: models.py:219
msgid "Memberships" msgid "Memberships"
msgstr "Mitgliedschaften" msgstr "Mitgliedschaften"
@@ -388,7 +403,6 @@ msgid "login"
msgstr "Anmelden" msgstr "Anmelden"
#: templates/membership/register_form.html:26 #: templates/membership/register_form.html:26
#| msgid "Membership"
msgid "Club membership" msgid "Club membership"
msgstr "Vereinsmitgliedschaft" msgstr "Vereinsmitgliedschaft"

View File

@@ -7,8 +7,8 @@ from os import path
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
from django.urls import reverse
from django.db import models from django.db import models
from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from easy_thumbnails.fields import ThumbnailerImageField from easy_thumbnails.fields import ThumbnailerImageField
@@ -150,7 +150,7 @@ class Membership(AbstractUser):
max_length=1, max_length=1,
choices=GENDER_CHOICES, choices=GENDER_CHOICES,
blank=True, blank=True,
null=True null=True,
) )
website = models.URLField(blank=True) website = models.URLField(blank=True)
avatar = ThumbnailerImageField( avatar = ThumbnailerImageField(
@@ -206,8 +206,10 @@ class Membership(AbstractUser):
help_text=_('This person has paid the membership fee.') help_text=_('This person has paid the membership fee.')
) )
# comment = models.TextField(blank=True) nullable_personal_data = (
# objects = MembershipManager() 'gender', 'birthday', 'telephone', 'street_name', 'post_code', 'city')
blankable_personal_data = (
'email', 'password', 'first_name', 'last_name', 'website',)
class Meta(object): class Meta(object):
"""To manage object ordering and dispalynames on the admin interface.""" """To manage object ordering and dispalynames on the admin interface."""