Browse Source

Redo fake bans creation

rafalp 6 years ago
parent
commit
8c120b416d

+ 94 - 0
misago/faker/bans.py

@@ -0,0 +1,94 @@
+import random
+from datetime import timedelta
+
+from django.utils import timezone
+
+from ..users.models import Ban
+
+
+def get_fake_username_ban(fake):
+    ban = _create_base_ban(fake, Ban.USERNAME)
+
+    banned_value = fake.first_name()
+    if random.randint(0, 100) < 31:
+        banned_value = "%s*" % banned_value
+    elif random.randint(0, 100) < 31:
+        banned_value = "*%s" % banned_value
+    elif random.randint(0, 100) < 31:
+        banned_value = list(banned_value)
+        banned_value.insert(random.randint(0, len(banned_value) - 1), "*")
+        banned_value = "".join(banned_value)
+
+    ban.banned_value = banned_value
+    ban.save()
+    return ban
+
+
+def get_fake_email_ban(fake):
+    ban = _create_base_ban(fake, Ban.EMAIL)
+
+    if random.randint(0, 100) < 35:
+        ban.banned_value = "*@%s" % fake.domain_name()
+    else:
+        ban.banned_value = fake.email()
+
+    ban.save()
+    return ban
+
+
+def get_fake_ip_ban(fake):
+    ban = _create_base_ban(fake, Ban.IP)
+
+    if random.randint(0, 1):
+        banned_value = fake.ipv4()
+        if random.randint(0, 100) < 35:
+            banned_value = banned_value.split(".")
+            banned_value = ".".join(banned_value[: random.randint(1, 3)])
+            banned_value = "%s.*" % banned_value
+        elif random.randint(0, 100) < 35:
+            banned_value = banned_value.split(".")
+            banned_value = ".".join(banned_value[random.randint(1, 3) :])
+            banned_value = "*.%s" % banned_value
+        elif random.randint(0, 100) < 35:
+            banned_value = banned_value.split(".")
+            banned_value[random.randint(0, 3)] = "*"
+            banned_value = ".".join(banned_value)
+    else:
+        banned_value = fake.ipv6()
+
+        if random.randint(0, 100) < 35:
+            banned_value = banned_value.split(":")
+            banned_value = ":".join(banned_value[: random.randint(1, 7)])
+            banned_value = "%s:*" % banned_value
+        elif random.randint(0, 100) < 35:
+            banned_value = banned_value.split(":")
+            banned_value = ":".join(banned_value[: random.randint(1, 7)])
+            banned_value = "*:%s" % banned_value
+        elif random.randint(0, 100) < 35:
+            banned_value = banned_value.split(":")
+            banned_value[random.randint(0, 7)] = "*"
+            banned_value = ":".join(banned_value)
+
+    ban.banned_value = banned_value
+    ban.save()
+    return ban
+
+
+def _create_base_ban(fake, ban_type):
+    ban = Ban(check_type=ban_type)
+
+    if random.randint(0, 10) == 0:
+        ban.user_message = fake.sentence()
+
+    if random.randint(0, 10) == 0:
+        ban.staff_message = fake.sentence()
+
+    if random.randint(0, 1):
+        # Lets make ban temporary
+        ban_length = timedelta(days=random.randint(0, 300))
+        if random.randint(0, 1):
+            ban.valid_until = timezone.now().date() - ban_length
+        else:
+            ban.valid_until = timezone.now().date() + ban_length
+
+    return ban

+ 6 - 84
misago/faker/management/commands/createfakebans.py

@@ -1,77 +1,12 @@
 import random
 import sys
-from datetime import timedelta
 
 from django.core.management.base import BaseCommand
-from django.utils import timezone
 from faker import Factory
 
 from ....core.management.progressbar import show_progress
 from ....users.models import Ban
-
-
-def fake_username_ban(fake):
-    fake_value = fake.first_name()
-
-    if random.randint(0, 100) < 31:
-        fake_value = "%s*" % fake_value
-    elif random.randint(0, 100) < 31:
-        fake_value = "*%s" % fake_value
-    elif random.randint(0, 100) < 31:
-        fake_value = list(fake_value)
-        fake_value.insert(random.randint(0, len(fake_value) - 1), "*")
-        fake_value = "".join(fake_value)
-
-    return fake_value
-
-
-def fake_email_ban(fake):
-    if random.randint(0, 100) < 35:
-        return "*@%s" % fake.domain_name()
-    return fake.email()
-
-
-def fake_ip_ban(fake):
-    if random.randint(0, 1):
-        fake_value = fake.ipv4()
-        if random.randint(0, 100) < 35:
-            fake_value = fake_value.split(".")
-            fake_value = ".".join(fake_value[: random.randint(1, 3)])
-            fake_value = "%s.*" % fake_value
-        elif random.randint(0, 100) < 35:
-            fake_value = fake_value.split(".")
-            fake_value = ".".join(fake_value[random.randint(1, 3) :])
-            fake_value = "*.%s" % fake_value
-        elif random.randint(0, 100) < 35:
-            fake_value = fake_value.split(".")
-            fake_value[random.randint(0, 3)] = "*"
-            fake_value = ".".join(fake_value)
-    else:
-        fake_value = fake.ipv6()
-
-        if random.randint(0, 100) < 35:
-            fake_value = fake_value.split(":")
-            fake_value = ":".join(fake_value[: random.randint(1, 7)])
-            fake_value = "%s:*" % fake_value
-        elif random.randint(0, 100) < 35:
-            fake_value = fake_value.split(":")
-            fake_value = ":".join(fake_value[: random.randint(1, 7)])
-            fake_value = "*:%s" % fake_value
-        elif random.randint(0, 100) < 35:
-            fake_value = fake_value.split(":")
-            fake_value[random.randint(0, 7)] = "*"
-            fake_value = ":".join(fake_value)
-
-    return fake_value
-
-
-def create_fake_test(fake, test_type):
-    if test_type == Ban.USERNAME:
-        return fake_username_ban(fake)
-    if test_type == Ban.EMAIL:
-        return fake_email_ban(fake)
-    if test_type == Ban.IP:
-        return fake_ip_ban(fake)
+from ...bans import get_fake_username_ban, get_fake_email_ban, get_fake_ip_ban
 
 
 class Command(BaseCommand):
@@ -87,6 +22,7 @@ class Command(BaseCommand):
             sys.exit(1)
 
         fake = Factory.create()
+        ban_fakers = (get_fake_username_ban, get_fake_email_ban, get_fake_ip_ban)
 
         message = "Creating %s fake bans...\n"
         self.stdout.write(message % fake_bans_to_create)
@@ -94,27 +30,13 @@ class Command(BaseCommand):
         created_count = 0
         show_progress(self, created_count, fake_bans_to_create)
         for _ in range(fake_bans_to_create):
-            ban = Ban(check_type=random.randint(Ban.USERNAME, Ban.IP))
-            ban.banned_value = create_fake_test(fake, ban.check_type)
-
-            if random.randint(0, 10) == 0:
-                ban.user_message = fake.sentence()
-
-            if random.randint(0, 10) == 0:
-                ban.staff_message = fake.sentence()
-
-            if random.randint(0, 1):
-                # Lets make ban temporary
-                ban_length = timedelta(days=random.randint(0, 300))
-                if random.randint(0, 1):
-                    ban.valid_until = timezone.now().date() - ban_length
-                else:
-                    ban.valid_until = timezone.now().date() + ban_length
-
-            ban.save()
+            ban_faker = random.choice(ban_fakers)
+            ban_faker(fake)
 
             created_count += 1
             show_progress(self, created_count, fake_bans_to_create)
 
+        Ban.objects.invalidate_cache()
+
         message = "\n\nSuccessfully created %s fake bans"
         self.stdout.write(message % created_count)

+ 1 - 1
misago/faker/management/commands/createfakefollowers.py

@@ -43,7 +43,7 @@ class Command(BaseCommand):
             processed_count += 1
             show_progress(self, processed_count, total_users)
 
-        self.stdout.write("\nSyncing models...")
+        self.stdout.write("\nSynchronizing users...")
         for user in User.objects.iterator():
             user.followers = user.followed_by.count()
             user.following = user.follows.count()

+ 18 - 0
misago/faker/tests/test_create_fake_bans_command.py

@@ -0,0 +1,18 @@
+from io import StringIO
+
+from django.core.management import call_command
+
+from ...cache.test import assert_invalidates_cache
+from ...users import BANS_CACHE
+from ...users.models import Ban
+from ..management.commands import createfakebans
+
+
+def test_management_command_creates_fake_bans(db):
+    call_command(createfakebans.Command(), stdout=StringIO())
+    assert Ban.objects.exists()
+
+
+def test_management_command_invalidates_bans_cache(db):
+    with assert_invalidates_cache(BANS_CACHE):
+        call_command(createfakebans.Command(), stdout=StringIO())

+ 17 - 0
misago/faker/tests/test_fake_bans.py

@@ -0,0 +1,17 @@
+from ...users.models import Ban
+from ..bans import get_fake_email_ban, get_fake_ip_ban, get_fake_username_ban
+
+
+def test_fake_username_ban_can_be_created(db, fake):
+    assert get_fake_username_ban(fake)
+    Ban.objects.get(check_type=Ban.USERNAME)
+
+
+def test_fake_email_ban_can_be_created(db, fake):
+    assert get_fake_email_ban(fake)
+    Ban.objects.get(check_type=Ban.EMAIL)
+
+
+def test_fake_ip_ban_can_be_created(db, fake):
+    assert get_fake_ip_ban(fake)
+    Ban.objects.get(check_type=Ban.IP)

+ 4 - 4
misago/faker/threads.py

@@ -8,7 +8,7 @@ corpus_short = EnglishCorpus(max_length=150)
 
 
 def get_fake_thread(fake, category, starter=None):
-    thread = create_fake_thread(fake, category)
+    thread = _create_base_thread(fake, category)
     thread.first_post = get_fake_post(fake, thread, starter)
     thread.save(update_fields=["first_post"])
     return thread
@@ -22,7 +22,7 @@ def get_fake_closed_thread(fake, category, starter=None):
 
 
 def get_fake_hidden_thread(fake, category, starter=None, hidden_by=None):
-    thread = create_fake_thread(fake, category)
+    thread = _create_base_thread(fake, category)
     thread.first_post = get_fake_hidden_post(fake, thread, starter, hidden_by)
     thread.is_hidden = True
     thread.save(update_fields=["first_post", "is_hidden"])
@@ -30,14 +30,14 @@ def get_fake_hidden_thread(fake, category, starter=None, hidden_by=None):
 
 
 def get_fake_unapproved_thread(fake, category, starter=None):
-    thread = create_fake_thread(fake, category)
+    thread = _create_base_thread(fake, category)
     thread.first_post = get_fake_unapproved_post(fake, thread, starter)
     thread.is_unapproved = True
     thread.save(update_fields=["first_post", "is_unapproved"])
     return thread
 
 
-def create_fake_thread(fake, category):
+def _create_base_thread(fake, category):
     started_on = timezone.now()
     thread = Thread(
         category=category,