Browse Source

move ban constants under ban model

Rafał Pitoń 8 years ago
parent
commit
1345d70029

+ 5 - 5
misago/faker/management/commands/createfakebans.py

@@ -9,7 +9,7 @@ from django.utils import timezone
 from django.utils.six.moves import range
 
 from misago.core.management.progressbar import show_progress
-from misago.users.models import BAN_EMAIL, BAN_IP, BAN_USERNAME, Ban
+from misago.users.models import Ban
 
 
 def fake_username_ban(fake):
@@ -69,11 +69,11 @@ def fake_ip_ban(fake):
 
 
 def create_fake_test(fake, test_type):
-    if test_type == BAN_USERNAME:
+    if test_type == Ban.BAN_USERNAME:
         return fake_username_ban(fake)
-    elif test_type == BAN_EMAIL:
+    elif test_type == Ban.BAN_EMAIL:
         return fake_email_ban(fake)
-    elif test_type == BAN_IP:
+    elif test_type == Ban.BAN_IP:
         return fake_ip_ban(fake)
 
 
@@ -99,7 +99,7 @@ class Command(BaseCommand):
         created_count = 0
         show_progress(self, created_count, fake_bans_to_create)
         for i in range(fake_bans_to_create):
-            ban = Ban(check_type=random.randint(BAN_USERNAME, BAN_IP))
+            ban = Ban(check_type=random.randint(Ban.BAN_USERNAME, Ban.BAN_IP))
             ban.banned_value = create_fake_test(fake, ban.check_type)
 
             if random.randint(0, 10) == 0:

+ 2 - 2
misago/users/api/rest_permissions.py

@@ -6,7 +6,7 @@ from rest_framework.permissions import BasePermission
 from misago.core.exceptions import Banned
 
 from ..bans import get_request_ip_ban
-from ..models import BAN_IP, Ban
+from ..models import Ban
 
 
 __all__ = [
@@ -20,7 +20,7 @@ class UnbannedOnly(BasePermission):
         ban = get_request_ip_ban(request)
         if ban:
             hydrated_ban = Ban(
-                check_type=BAN_IP,
+                check_type=Ban.BAN_IP,
                 user_message=ban['message'],
                 expires_on=ban['expires_on'])
             raise Banned(hydrated_ban)

+ 2 - 2
misago/users/bans.py

@@ -12,7 +12,7 @@ from django.utils.dateparse import parse_datetime
 
 from misago.core import cachebuster
 
-from .models import BAN_IP, Ban, BanCache
+from .models import Ban, BanCache
 
 
 BAN_CACHE_SESSION_KEY = 'misago_ip_check'
@@ -177,7 +177,7 @@ def ban_ip(ip, user_message=None, staff_message=None, length=None,
         expires_on = timezone.now() + timedelta(**length)
 
     ban = Ban.objects.create(
-        check_type=BAN_IP,
+        check_type=Ban.BAN_IP,
         banned_value=ip,
         user_message=user_message,
         staff_message=staff_message,

+ 4 - 3
misago/users/decorators.py

@@ -5,7 +5,7 @@ from django.utils.translation import gettext as _
 from misago.core.exceptions import Banned
 
 from .bans import get_request_ip_ban
-from .models import BAN_IP, Ban
+from .models import Ban
 
 
 def deny_authenticated(f):
@@ -33,9 +33,10 @@ def deny_banned_ips(f):
         ban = get_request_ip_ban(request)
         if ban:
             hydrated_ban = Ban(
-                check_type=BAN_IP,
+                check_type=Ban.BAN_IP,
                 user_message=ban['message'],
-                expires_on=ban['expires_on'])
+                expires_on=ban['expires_on']
+            )
             raise Banned(hydrated_ban)
         else:
             return f(request, *args, **kwargs)

+ 9 - 10
misago/users/forms/admin.py

@@ -10,7 +10,7 @@ from misago.core import threadstore
 from misago.core.forms import IsoDateTimeField, YesNoSwitch
 from misago.core.validators import validate_sluggable
 
-from ..models import BANS_CHOICES, Ban, Rank
+from ..models import Ban, Rank
 from ..validators import validate_email, validate_username
 
 
@@ -489,7 +489,7 @@ class BanForm(forms.ModelForm):
     check_type = forms.TypedChoiceField(
         label=_("Check type"),
         coerce=int,
-        choices=BANS_CHOICES
+        choices=Ban.BANS_CHOICES
     )
     banned_value = forms.CharField(
         label=_("Banned value"),
@@ -551,15 +551,14 @@ class BanForm(forms.ModelForm):
         return data
 
 
-SARCH_BANS_CHOICES = (
-    ('', _('All bans')),
-    ('names', _('Usernames')),
-    ('emails', _('E-mails')),
-    ('ips', _('IPs')),
-)
-
-
 class SearchBansForm(forms.Form):
+    SARCH_BANS_CHOICES = (
+        ('', _('All bans')),
+        ('names', _('Usernames')),
+        ('emails', _('E-mails')),
+        ('ips', _('IPs')),
+    )
+
     check_type = forms.ChoiceField(
         label=_("Type"),
         required=False,

+ 19 - 28
misago/users/models/ban.py

@@ -8,27 +8,9 @@ from django.utils.translation import ugettext_lazy as _
 from misago.core import cachebuster
 
 
-__all__ = [
-    'BAN_USERNAME', 'BAN_EMAIL', 'BAN_IP', 'BANS_CHOICES',
-    'Ban', 'BanCache'
-]
-
-
 BAN_CACHEBUSTER = 'misago_bans'
 
 
-BAN_USERNAME = 0
-BAN_EMAIL = 1
-BAN_IP = 2
-
-
-BANS_CHOICES = (
-    (BAN_USERNAME, _('Username')),
-    (BAN_EMAIL, _('E-mail address')),
-    (BAN_IP, _('IP address')),
-)
-
-
 class BansManager(models.Manager):
     def get_ip_ban(self, ip):
         return self.get_ban(ip=ip)
@@ -47,12 +29,12 @@ class BansManager(models.Manager):
 
         if username:
             username = username.lower()
-            checks.append(BAN_USERNAME)
+            checks.append(self.model.BAN_USERNAME)
         if email:
             email = email.lower()
-            checks.append(BAN_EMAIL)
+            checks.append(self.model.BAN_EMAIL)
         if ip:
-            checks.append(BAN_IP)
+            checks.append(self.model.BAN_IP)
 
         queryset = self.filter(is_checked=True)
         if len(checks) == 1:
@@ -63,19 +45,29 @@ class BansManager(models.Manager):
         for ban in queryset.order_by('-id').iterator():
             if ban.is_expired:
                 continue
-            elif (ban.check_type == BAN_USERNAME and username and
+            elif (ban.check_type == self.model.BAN_USERNAME and username and
                     ban.check_value(username)):
                 return ban
-            elif (ban.check_type == BAN_EMAIL and email and
+            elif (ban.check_type == self.model.BAN_EMAIL and email and
                     ban.check_value(email)):
                 return ban
-            elif ban.check_type == BAN_IP and ip and ban.check_value(ip):
+            elif ban.check_type == self.model.BAN_IP and ip and ban.check_value(ip):
                 return ban
         else:
             raise Ban.DoesNotExist('specified values are not banned')
 
 
 class Ban(models.Model):
+    BAN_USERNAME = 0
+    BAN_EMAIL = 1
+    BAN_IP = 2
+
+    BANS_CHOICES = (
+        (BAN_USERNAME, _('Username')),
+        (BAN_EMAIL, _('E-mail address')),
+        (BAN_IP, _('IP address')),
+    )
+
     check_type = models.PositiveIntegerField(default=BAN_USERNAME, db_index=True)
     banned_value = models.CharField(max_length=255, db_index=True)
     user_message = models.TextField(null=True, blank=True)
@@ -97,7 +89,7 @@ class Ban(models.Model):
 
     @property
     def check_name(self):
-        return BANS_CHOICES[self.check_type][1]
+        return self.BANS_CHOICES[self.check_type][1]
 
     @property
     def name(self):
@@ -139,7 +131,7 @@ class BanCache(models.Model):
         from ..serializers import BanMessageSerializer
         temp_ban = Ban(
             id=1,
-            check_type=BAN_USERNAME,
+            check_type=Ban.BAN_USERNAME,
             user_message=self.user_message,
             staff_message=self.staff_message,
             expires_on=self.expires_on
@@ -152,8 +144,7 @@ class BanCache(models.Model):
 
     @property
     def is_valid(self):
-        version_is_valid = cachebuster.is_valid(BAN_CACHEBUSTER,
-                                                self.bans_version)
+        version_is_valid = cachebuster.is_valid(BAN_CACHEBUSTER, self.bans_version)
         expired = self.expires_on and self.expires_on < timezone.now()
 
         return version_is_valid and not expired

+ 2 - 2
misago/users/serializers/ban.py

@@ -4,7 +4,7 @@ from rest_framework import serializers
 
 from misago.core.utils import format_plaintext_for_html
 
-from ..models import BAN_IP, Ban
+from ..models import Ban
 
 
 __all__ = [
@@ -33,7 +33,7 @@ class BanMessageSerializer(serializers.ModelSerializer):
     def get_message(self, obj):
         if obj.user_message:
             message = obj.user_message
-        elif obj.check_type == BAN_IP:
+        elif obj.check_type == Ban.BAN_IP:
             message = _("Your IP address is banned.")
         else:
             message = _("You are banned.")

+ 2 - 2
misago/users/tests/test_activation_views.py

@@ -4,7 +4,7 @@ from django.urls import reverse
 
 from misago.core.utils import encode_json_html
 
-from ..models import BAN_USERNAME, Ban
+from ..models import Ban
 from ..tokens import make_activation_token
 
 
@@ -20,7 +20,7 @@ class ActivationViewsTests(TestCase):
         test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123',
                                              requires_activation=1)
         Ban.objects.create(
-            check_type=BAN_USERNAME,
+            check_type=Ban.BAN_USERNAME,
             banned_value='bob',
             user_message='Nope!',
         )

+ 6 - 6
misago/users/tests/test_auth_api.py

@@ -2,7 +2,7 @@ from django.contrib.auth import get_user_model
 from django.core import mail
 from django.test import TestCase
 
-from ..models import BAN_USERNAME, Ban
+from ..models import Ban
 from ..tokens import make_password_change_token
 
 
@@ -51,7 +51,7 @@ class GatewayTests(TestCase):
         User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         ban = Ban.objects.create(
-            check_type=BAN_USERNAME,
+            check_type=Ban.BAN_USERNAME,
             banned_value='bob',
             user_message='You are tragically banned.',
         )
@@ -84,7 +84,7 @@ class GatewayTests(TestCase):
         user.save()
 
         ban = Ban.objects.create(
-            check_type=BAN_USERNAME,
+            check_type=Ban.BAN_USERNAME,
             banned_value='bob',
             user_message='You are tragically banned.',
         )
@@ -192,7 +192,7 @@ class SendActivationAPITests(TestCase):
     def test_submit_banned(self):
         """request activation link api passes for banned users"""
         Ban.objects.create(
-            check_type=BAN_USERNAME,
+            check_type=Ban.BAN_USERNAME,
             banned_value=self.user.username,
             user_message='Nope!',
         )
@@ -271,7 +271,7 @@ class SendPasswordFormAPITests(TestCase):
     def test_submit_banned(self):
         """request change password form link api sends reset link mail"""
         Ban.objects.create(
-            check_type=BAN_USERNAME,
+            check_type=Ban.BAN_USERNAME,
             banned_value=self.user.username,
             user_message='Nope!',
         )
@@ -352,7 +352,7 @@ class ChangePasswordAPITests(TestCase):
     def test_banned_user_link(self):
         """request errors because user is banned"""
         Ban.objects.create(
-            check_type=BAN_USERNAME,
+            check_type=Ban.BAN_USERNAME,
             banned_value=self.user.username,
             user_message='Nope!',
         )

+ 13 - 4
misago/users/tests/test_ban_model.py

@@ -1,15 +1,24 @@
 #-*- coding: utf-8 -*-
 from django.test import TestCase
 
-from ..models import BAN_EMAIL, BAN_IP, BAN_USERNAME, Ban
+from ..models import Ban
 
 
 class BansManagerTests(TestCase):
     def setUp(self):
         Ban.objects.bulk_create([
-            Ban(check_type=BAN_USERNAME, banned_value='bob'),
-            Ban(check_type=BAN_EMAIL, banned_value='bob@test.com'),
-            Ban(check_type=BAN_IP, banned_value='127.0.0.1'),
+            Ban(
+                check_type=Ban.BAN_USERNAME,
+                banned_value='bob'
+            ),
+            Ban(
+                check_type=Ban.BAN_EMAIL,
+                banned_value='bob@test.com'
+            ),
+            Ban(
+                check_type=Ban.BAN_IP,
+                banned_value='127.0.0.1'
+            ),
         ])
 
     def test_get_ban_for_banned_name(self):

+ 14 - 12
misago/users/tests/test_bans.py

@@ -4,8 +4,10 @@ from django.contrib.auth import get_user_model
 from django.test import TestCase
 from django.utils import timezone
 
-from ..bans import ban_ip, ban_user, get_email_ban, get_ip_ban, get_request_ip_ban, get_user_ban, get_username_ban
-from ..models import BAN_EMAIL, BAN_IP, BAN_USERNAME, Ban
+from ..bans import (
+    ban_ip, ban_user, get_email_ban, get_ip_ban,
+    get_request_ip_ban, get_user_ban, get_username_ban)
+from ..models import Ban
 
 
 class GetBanTests(TestCase):
@@ -24,7 +26,7 @@ class GetBanTests(TestCase):
 
         Ban.objects.create(
             banned_value='wrongtype',
-            check_type=BAN_EMAIL
+            check_type=Ban.BAN_EMAIL
         )
 
         wrong_type_ban = get_username_ban('wrongtype')
@@ -43,7 +45,7 @@ class GetBanTests(TestCase):
 
         Ban.objects.create(
             banned_value='ex@pired.com',
-            check_type=BAN_EMAIL,
+            check_type=Ban.BAN_EMAIL,
             expires_on=timezone.now() - timedelta(days=7)
         )
 
@@ -52,7 +54,7 @@ class GetBanTests(TestCase):
 
         Ban.objects.create(
             banned_value='wrong@type.com',
-            check_type=BAN_IP
+            check_type=Ban.BAN_IP
         )
 
         wrong_type_ban = get_email_ban('wrong@type.com')
@@ -60,7 +62,7 @@ class GetBanTests(TestCase):
 
         valid_ban = Ban.objects.create(
             banned_value='*.ru',
-            check_type=BAN_EMAIL,
+            check_type=Ban.BAN_EMAIL,
             expires_on=timezone.now() + timedelta(days=7)
         )
         self.assertEqual(get_email_ban('banned@mail.ru').pk, valid_ban.pk)
@@ -72,7 +74,7 @@ class GetBanTests(TestCase):
 
         Ban.objects.create(
             banned_value='124.0.0.1',
-            check_type=BAN_IP,
+            check_type=Ban.BAN_IP,
             expires_on=timezone.now() - timedelta(days=7)
         )
 
@@ -81,7 +83,7 @@ class GetBanTests(TestCase):
 
         Ban.objects.create(
             banned_value='wrongtype',
-            check_type=BAN_EMAIL
+            check_type=Ban.BAN_EMAIL
         )
 
         wrong_type_ban = get_ip_ban('wrongtype')
@@ -89,7 +91,7 @@ class GetBanTests(TestCase):
 
         valid_ban = Ban.objects.create(
             banned_value='125.0.0.*',
-            check_type=BAN_IP,
+            check_type=Ban.BAN_IP,
             expires_on=timezone.now() + timedelta(days=7)
         )
         self.assertEqual(get_ip_ban('125.0.0.1').pk, valid_ban.pk)
@@ -173,7 +175,7 @@ class RequestIPBansTests(TestCase):
     def test_permanent_ban(self):
         """ip is caught by permanent ban"""
         Ban.objects.create(
-            check_type=BAN_IP,
+            check_type=Ban.BAN_IP,
             banned_value='127.0.0.1',
             user_message='User reason'
         )
@@ -189,7 +191,7 @@ class RequestIPBansTests(TestCase):
     def test_temporary_ban(self):
         """ip is caught by temporary ban"""
         Ban.objects.create(
-            check_type=BAN_IP,
+            check_type=Ban.BAN_IP,
             banned_value='127.0.0.1',
             user_message='User reason',
             expires_on=timezone.now() + timedelta(days=7)
@@ -206,7 +208,7 @@ class RequestIPBansTests(TestCase):
     def test_expired_ban(self):
         """ip is not caught by expired ban"""
         Ban.objects.create(
-            check_type=BAN_IP,
+            check_type=Ban.BAN_IP,
             banned_value='127.0.0.1',
             user_message='User reason',
             expires_on=timezone.now() - timedelta(days=7)

+ 7 - 5
misago/users/tests/test_decorators.py

@@ -2,7 +2,7 @@ from django.urls import reverse
 
 from misago.core.utils import encode_json_html
 
-from ..models import BAN_IP, Ban
+from ..models import Ban
 from ..testutils import UserTestCase
 
 
@@ -38,9 +38,10 @@ class DenyBannedIPTests(UserTestCase):
     def test_success(self):
         """deny_banned_ips decorator allowed unbanned request"""
         Ban.objects.create(
-            check_type=BAN_IP,
+            check_type=Ban.BAN_IP,
             banned_value='83.*',
-            user_message="Ya got banned!")
+            user_message="Ya got banned!"
+        )
 
         response = self.client.post(reverse('misago:request-activation'))
         self.assertEqual(response.status_code, 200)
@@ -48,9 +49,10 @@ class DenyBannedIPTests(UserTestCase):
     def test_fail(self):
         """deny_banned_ips decorator denied banned request"""
         Ban.objects.create(
-            check_type=BAN_IP,
+            check_type=Ban.BAN_IP,
             banned_value='127.*',
-            user_message="Ya got banned!")
+            user_message="Ya got banned!"
+        )
 
         response = self.client.post(reverse('misago:request-activation'))
         self.assertContains(

+ 2 - 2
misago/users/tests/test_forgottenpassword_views.py

@@ -3,7 +3,7 @@ from django.urls import reverse
 
 from misago.core.utils import encode_json_html
 
-from ..models import BAN_USERNAME, Ban
+from ..models import Ban
 from ..testutils import UserTestCase
 from ..tokens import make_password_change_token
 
@@ -27,7 +27,7 @@ class ForgottenPasswordViewsTests(UserTestCase):
         test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         Ban.objects.create(
-            check_type=BAN_USERNAME,
+            check_type=Ban.BAN_USERNAME,
             banned_value='bob',
             user_message='Nope!',
         )

+ 7 - 5
misago/users/tests/test_rest_permissions.py

@@ -1,6 +1,6 @@
 from django.urls import reverse
 
-from ..models import BAN_IP, Ban
+from ..models import Ban
 from ..testutils import UserTestCase
 
 
@@ -29,9 +29,10 @@ class UnbannedOnlyTests(UserTestCase):
     def test_api_blocks_banned(self):
         """policy blocked banned ip"""
         Ban.objects.create(
-            check_type=BAN_IP,
+            check_type=Ban.BAN_IP,
             banned_value='127.*',
-            user_message='Ya got banned!')
+            user_message='Ya got banned!'
+        )
 
         response = self.client.post(
             reverse('misago:api:send-password-form'), data={
@@ -68,9 +69,10 @@ class UnbannedAnonOnlyTests(UserTestCase):
     def test_api_blocks_banned(self):
         """policy blocked banned ip"""
         Ban.objects.create(
-            check_type=BAN_IP,
+            check_type=Ban.BAN_IP,
             banned_value='127.*',
-            user_message='Ya got banned!')
+            user_message='Ya got banned!'
+        )
 
         response = self.client.post(
             reverse('misago:api:send-activation'), data={

+ 6 - 4
misago/users/tests/test_users_api.py

@@ -14,7 +14,7 @@ from misago.threads.models import Post, Thread
 from misago.threads.testutils import post_thread
 
 from ..activepostersranking import build_active_posters_ranking
-from ..models import BAN_USERNAME, Ban, Rank
+from ..models import Ban, Rank
 from ..testutils import AuthenticatedUserTestCase
 
 
@@ -439,9 +439,11 @@ class UserBanTests(AuthenticatedUserTestCase):
             'can_see_ban_details': 1
         })
 
-        Ban.objects.create(check_type=BAN_USERNAME,
-                           banned_value=self.other_user.username,
-                           user_message='Nope!')
+        Ban.objects.create(
+            check_type=Ban.BAN_USERNAME,
+            banned_value=self.other_user.username,
+            user_message='Nope!'
+        )
 
         response = self.client.get(self.link)
         self.assertEqual(response.status_code, 200)

+ 9 - 3
misago/users/tests/test_validators.py

@@ -5,7 +5,7 @@ from django.test import TestCase
 
 from misago.conf import settings
 
-from ..models import BAN_EMAIL, BAN_USERNAME, Ban
+from ..models import Ban
 from ..validators import (
     validate_email,
     validate_email_available,
@@ -39,7 +39,10 @@ class ValidateEmailAvailableTests(TestCase):
 
 class ValidateEmailBannedTests(TestCase):
     def setUp(self):
-        Ban.objects.create(check_type=BAN_EMAIL, banned_value="ban@test.com")
+        Ban.objects.create(
+            check_type=Ban.BAN_EMAIL,
+            banned_value="ban@test.com"
+        )
 
     def test_unbanned_name(self):
         """unbanned email passes validation"""
@@ -87,7 +90,10 @@ class ValidateUsernameAvailableTests(TestCase):
 
 class ValidateUsernameBannedTests(TestCase):
     def setUp(self):
-        Ban.objects.create(check_type=BAN_USERNAME, banned_value="Bob")
+        Ban.objects.create(
+            check_type=Ban.BAN_USERNAME,
+            banned_value="Bob"
+        )
 
     def test_unbanned_name(self):
         """unbanned name passes validation"""

+ 5 - 6
misago/users/views/admin/users.py

@@ -18,7 +18,6 @@ from ...forms.admin import (
     BanUsersForm, NewUserForm, SearchUsersForm,
     EditUserForm, EditUserFormFactory)
 from ...models import Ban, User
-from ...models.ban import BAN_EMAIL, BAN_IP, BAN_USERNAME
 from ...signatures import set_user_signature
 
 
@@ -145,25 +144,25 @@ class UsersList(UserAdmin, generic.ListView):
                 for user in users:
                     for ban in cleaned_data['ban_type']:
                         if ban == 'usernames':
-                            check_type = BAN_USERNAME
+                            check_type = Ban.BAN_USERNAME
                             banned_value = user.username.lower()
 
                         if ban == 'emails':
-                            check_type = BAN_EMAIL
+                            check_type = Ban.BAN_EMAIL
                             banned_value = user.email.lower()
 
                         if ban == 'domains':
-                            check_type = BAN_EMAIL
+                            check_type = Ban.BAN_EMAIL
                             banned_value = user.email.lower()
                             at_pos = banned_value.find('@')
                             banned_value = '*%s' % banned_value[at_pos:]
 
                         if ban == 'ip':
-                            check_type = BAN_IP
+                            check_type = Ban.BAN_IP
                             banned_value = user.joined_from_ip
 
                         if ban in ('ip_first', 'ip_two'):
-                            check_type = BAN_IP
+                            check_type = Ban.BAN_IP
 
                             if ':' in user.joined_from_ip:
                                 ip_separator = ':'