diff --git a/src/membership/admin.py b/src/membership/admin.py index d2daa27..22ab74b 100644 --- a/src/membership/admin.py +++ b/src/membership/admin.py @@ -1,11 +1,11 @@ """ Admin Interface to manage the memberships.""" # 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.models import Group +from django.core.exceptions import PermissionDenied from django.utils.translation import ugettext as _ from easy_thumbnails import fields, widgets - 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 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') -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. :param modeladmin: The ModelAdmin that triggered this action. @@ -38,6 +39,33 @@ cleanup_activation.short_description = _( "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): """A Proxy to list Usergroups from django.contrib.auth here.""" @@ -50,6 +78,8 @@ class ProxyGroup(Group): class MembershipAdmin(UserAdmin): """Admin interface to manage membership. e.g. users.""" + actions = [clear_personal_data, ] + formfield_overrides = { fields.ThumbnailerImageField: { 'widget': widgets.ImageClearableFileInput}, diff --git a/src/membership/locale/de/LC_MESSAGES/django.po b/src/membership/locale/de/LC_MESSAGES/django.po index dfb5e8d..a922f6c 100644 --- a/src/membership/locale/de/LC_MESSAGES/django.po +++ b/src/membership/locale/de/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: kasu.membership\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-04-30 10:57+0200\n" -"PO-Revision-Date: 2018-04-30 10:59+0105\n" +"POT-Creation-Date: 2018-05-03 09:36+0200\n" +"PO-Revision-Date: 2018-05-03 09:39+0105\n" "Last-Translator: b'Christian Berg '\n" "Language-Team: Kasu \n" "Language: de\n" @@ -31,27 +31,42 @@ msgstr "Weiblich" msgid "Activate selected User" msgstr "Ausgewählte Benutzer freischalten" -#: admin.py:38 +#: admin.py:39 msgid "Cleanup selected Activation Requests" 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" msgstr "Gruppe" -#: admin.py:48 +#: admin.py:76 msgid "Groups" msgstr "Gruppen" -#: admin.py:72 models.py:163 models.py:216 +#: admin.py:102 models.py:163 models.py:218 msgid "Membership" msgstr "Mitgliedschaft" -#: admin.py:77 +#: admin.py:107 msgid "Permissions" msgstr "Berechtigung" -#: admin.py:79 +#: admin.py:109 msgid "Important dates" msgstr "Wichtige Daten" @@ -159,7 +174,7 @@ msgstr "Bestätigt" msgid "This person has paid the membership fee." msgstr "Diese Person hat ihre Mitgliedschaft bezahlt" -#: models.py:217 +#: models.py:219 msgid "Memberships" msgstr "Mitgliedschaften" @@ -388,7 +403,6 @@ msgid "login" msgstr "Anmelden" #: templates/membership/register_form.html:26 -#| msgid "Membership" msgid "Club membership" msgstr "Vereinsmitgliedschaft" diff --git a/src/membership/models.py b/src/membership/models.py index 7b746d2..6aa9669 100644 --- a/src/membership/models.py +++ b/src/membership/models.py @@ -7,8 +7,8 @@ from os import path from django.conf import settings from django.contrib.auth.models import AbstractUser -from django.urls import reverse from django.db import models +from django.urls import reverse from django.utils import timezone from django.utils.translation import ugettext as _ from easy_thumbnails.fields import ThumbnailerImageField @@ -150,7 +150,7 @@ class Membership(AbstractUser): max_length=1, choices=GENDER_CHOICES, blank=True, - null=True + null=True, ) website = models.URLField(blank=True) avatar = ThumbnailerImageField( @@ -206,8 +206,10 @@ class Membership(AbstractUser): help_text=_('This person has paid the membership fee.') ) - # comment = models.TextField(blank=True) - # objects = MembershipManager() + nullable_personal_data = ( + 'gender', 'birthday', 'telephone', 'street_name', 'post_code', 'city') + blankable_personal_data = ( + 'email', 'password', 'first_name', 'last_name', 'website',) class Meta(object): """To manage object ordering and dispalynames on the admin interface."""