Rafał Pitoń 10 лет назад
Родитель
Сommit
ff5d0bc180

+ 9 - 4
misago/users/management/commands/bansmaintenance.py

@@ -1,7 +1,9 @@
 from django.core.management.base import BaseCommand
 from django.utils import timezone
 
-from misago.users.models import BanCache
+from misago.core import cachebuster
+
+from misago.users.models import Ban, BanCache
 
 
 class Command(BaseCommand):
@@ -22,10 +24,13 @@ class Command(BaseCommand):
         queryset = BanCache.objects.filter(valid_until__isnull=False)
         queryset = queryset.filter(valid_until__lte=timezone.now().date())
 
-        expired_count = queryset.delete()
+        expired_count = queryset.count()
+        queryset.delete()
 
-        bans_version = get_version('misago_bans')
+        bans_version = cachebuster.get_version('misago_bans')
         queryset = BanCache.objects.filter(bans_version__lt=bans_version)
-        expired_count += queryset.delete()
+
+        expired_count += queryset.count()
+        queryset.delete()
 
         self.stdout.write('Ban caches emptied: %s' % expired_count)

+ 1 - 1
misago/users/models/__init__.py

@@ -1,5 +1,5 @@
 # flake8: noqa
 from misago.users.models.rank import *
 from misago.users.models.user import *
-from misago.users.models.bans import *
+from misago.users.models.ban import *
 from misago.users.models.warnings import *

+ 0 - 0
misago/users/models/bans.py → misago/users/models/ban.py


+ 72 - 0
misago/users/tests/test_bansmaintenance.py

@@ -0,0 +1,72 @@
+from datetime import timedelta
+
+from django.contrib.auth import get_user_model
+from django.test import TestCase
+from django.utils import timezone
+from django.utils.six import StringIO
+
+from misago.users import bans
+from misago.users.management.commands import bansmaintenance
+from misago.users.models import Ban, BanCache
+
+
+class BansMaintenanceTests(TestCase):
+    def test_expired_bans_handling(self):
+        """expired bans are flagged as such"""
+        # create 5 bans then update their valid date to past one
+        for i in xrange(5):
+            Ban.objects.create(banned_value="abcd")
+        bans_expired = (timezone.now() - timedelta(days=10)).date()
+        Ban.objects.all().update(valid_until=bans_expired, is_valid=True)
+
+        self.assertEqual(Ban.objects.filter(is_valid=True).count(), 5)
+
+        command = bansmaintenance.Command()
+
+        out = StringIO()
+        command.execute(stdout=out)
+        command_output = out.getvalue().splitlines()[0].strip()
+
+        self.assertEqual(command_output, 'Bans invalidated: 5')
+
+        self.assertEqual(Ban.objects.filter(is_valid=True).count(), 0)
+
+    def test_bans_caches(self):
+        """ban caches are updated"""
+        # create user
+        User = get_user_model()
+        user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
+
+        # ban user
+        Ban.objects.create(banned_value="bob")
+        user_ban = bans.get_user_ban(user)
+
+        self.assertIsNotNone(user_ban)
+        self.assertEqual(Ban.objects.filter(is_valid=True).count(), 1)
+
+        # first call didn't touch ban
+        command = bansmaintenance.Command()
+
+        out = StringIO()
+        command.execute(stdout=out)
+        command_output = out.getvalue().splitlines()[1].strip()
+
+        self.assertEqual(command_output, 'Ban caches emptied: 0')
+        self.assertEqual(Ban.objects.filter(is_valid=True).count(), 1)
+
+        # expire bans
+        bans_expired = (timezone.now() - timedelta(days=10)).date()
+        Ban.objects.all().update(valid_until=bans_expired, is_valid=True)
+        BanCache.objects.all().update(valid_until=bans_expired)
+
+        # invalidate expired ban cache
+        out = StringIO()
+        command.execute(stdout=out)
+        command_output = out.getvalue().splitlines()[1].strip()
+
+        self.assertEqual(command_output, 'Ban caches emptied: 1')
+        self.assertEqual(Ban.objects.filter(is_valid=True).count(), 0)
+
+        # see if user is banned anymore
+        user = User.objects.get(id=user.id)
+        self.assertIsNone(bans.get_user_ban(user))