Browse Source

Delete users from admin

Rafał Pitoń 11 years ago
parent
commit
da4e8e4416

+ 7 - 1
misago/users/models/user.py

@@ -15,7 +15,7 @@ from misago.core.utils import slugify
 
 
 from misago.users.models.rank import Rank
 from misago.users.models.rank import Rank
 from misago.users import avatars
 from misago.users import avatars
-from misago.users.signals import username_changed
+from misago.users.signals import delete_user_content, username_changed
 from misago.users.signatures import is_user_signature_valid
 from misago.users.signatures import is_user_signature_valid
 from misago.users.utils import hash_email
 from misago.users.utils import hash_email
 
 
@@ -214,7 +214,13 @@ class User(AbstractBaseUser, PermissionsMixin):
     objects = UserManager()
     objects = UserManager()
 
 
     def delete(self, *args, **kwargs):
     def delete(self, *args, **kwargs):
+        if kwargs.pop('delete_content', False):
+            self.delete_content()
         avatars.delete_avatar(self)
         avatars.delete_avatar(self)
+        return super(User, self).delete(*args, **kwargs)
+
+    def delete_content(self):
+        delete_user_content.send(sender=self)
 
 
     @property
     @property
     def acl(self):
     def acl(self):

+ 1 - 0
misago/users/signals.py

@@ -1,4 +1,5 @@
 import django.dispatch
 import django.dispatch
 
 
 
 
+delete_user_content = django.dispatch.Signal()
 username_changed = django.dispatch.Signal()
 username_changed = django.dispatch.Signal()

+ 38 - 2
misago/users/tests/test_useradmin_views.py

@@ -59,7 +59,7 @@ class UserAdminViewsTests(AdminTestCase):
         self.assertFalse(user_b.username in response.content)
         self.assertFalse(user_b.username in response.content)
 
 
     def test_mass_activation(self):
     def test_mass_activation(self):
-        """adminview activates multiple users"""
+        """users list activates multiple users"""
         User = get_user_model()
         User = get_user_model()
 
 
         user_pks = []
         user_pks = []
@@ -81,7 +81,7 @@ class UserAdminViewsTests(AdminTestCase):
         self.assertIn("has been activated", mail.outbox[0].subject)
         self.assertIn("has been activated", mail.outbox[0].subject)
 
 
     def test_mass_ban(self):
     def test_mass_ban(self):
-        """adminview bans multiple users"""
+        """users list bans multiple users"""
         User = get_user_model()
         User = get_user_model()
 
 
         user_pks = []
         user_pks = []
@@ -103,6 +103,42 @@ class UserAdminViewsTests(AdminTestCase):
         self.assertEqual(response.status_code, 302)
         self.assertEqual(response.status_code, 302)
         self.assertEqual(Ban.objects.count(), 10)
         self.assertEqual(Ban.objects.count(), 10)
 
 
+    def test_mass_delete_accounts(self):
+        """users list deletes users"""
+        User = get_user_model()
+
+        user_pks = []
+        for i in xrange(10):
+            test_user = User.objects.create_user('Bob%s' % i,
+                                                 'bob%s@test.com' % i,
+                                                 'pass123',
+                                                 requires_activation=1)
+            user_pks.append(test_user.pk)
+
+        response = self.client.post(
+            reverse('misago:admin:users:accounts:index'),
+            data={'action': 'delete_accounts', 'selected_items': user_pks})
+        self.assertEqual(response.status_code, 302)
+        self.assertEqual(User.objects.count(), 1)
+
+    def test_mass_delete_all(self):
+        """users list deletes users and their content"""
+        User = get_user_model()
+
+        user_pks = []
+        for i in xrange(10):
+            test_user = User.objects.create_user('Bob%s' % i,
+                                                 'bob%s@test.com' % i,
+                                                 'pass123',
+                                                 requires_activation=1)
+            user_pks.append(test_user.pk)
+
+        response = self.client.post(
+            reverse('misago:admin:users:accounts:index'),
+            data={'action': 'delete_accounts', 'selected_items': user_pks})
+        self.assertEqual(response.status_code, 302)
+        self.assertEqual(User.objects.count(), 1)
+
     def test_new_view(self):
     def test_new_view(self):
         """new user view creates account"""
         """new user view creates account"""
         response = self.client.get(
         response = self.client.get(

+ 39 - 3
misago/users/views/admin/users.py

@@ -57,9 +57,17 @@ class UsersList(UserAdmin, generic.ListView):
             'icon': 'fa fa-lock',
             'icon': 'fa fa-lock',
         },
         },
         {
         {
-            'action': 'delete',
-            'name': _("Delete users"),
-            'icon': 'fa fa-times',
+            'action': 'delete_accounts',
+            'name': _("Delete accounts"),
+            'icon': 'fa fa-times-circle',
+            'confirmation': _("Are you sure you want to delete those users?"),
+        },
+        {
+            'action': 'delete_all',
+            'name': _("Delete all"),
+            'icon': 'fa fa-eraser',
+            'confirmation': _("Are you sure you want to delete both "
+                              "selected users and their content?"),
         }
         }
     ]
     ]
 
 
@@ -127,6 +135,34 @@ class UsersList(UserAdmin, generic.ListView):
                 'form': form,
                 'form': form,
             })
             })
 
 
+    def action_delete_accounts(self, request, users):
+        inactive_users = []
+        for user in users:
+            if user.is_staff or user.is_superuser:
+                message = _("%(username)s is admin and can't be deleted.")
+                mesage = message % {'username': user.username}
+                raise generic.MassActionError(mesage)
+
+        for user in users:
+            user.delete()
+
+        message = _("Selected users have been deleted.")
+        messages.success(request, message)
+
+    def action_delete_all(self, request, users):
+        inactive_users = []
+        for user in users:
+            if user.is_staff or user.is_superuser:
+                message = _("%(username)s is admin and can't be deleted.")
+                mesage = message % {'username': user.username}
+                raise generic.MassActionError(mesage)
+
+        for user in users:
+            user.delete(delete_content=True)
+
+        message = _("Selected users have been deleted with their content.")
+        messages.success(request, message)
+
 
 
 class NewUser(UserAdmin, generic.ModelFormView):
 class NewUser(UserAdmin, generic.ModelFormView):
     Form = NewUserForm
     Form = NewUserForm