Added a admin action to cleanup personal data from inactive members.
This commit is contained in:
@@ -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},
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -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."""
|
||||||
|
|||||||
Reference in New Issue
Block a user