Skip to content

Commit

Permalink
Merge a75c350 into 333a769
Browse files Browse the repository at this point in the history
  • Loading branch information
rafalp committed Jan 27, 2019
2 parents 333a769 + a75c350 commit 9ad5bea
Show file tree
Hide file tree
Showing 31 changed files with 1,417 additions and 331 deletions.
10 changes: 10 additions & 0 deletions dev
Expand Up @@ -90,6 +90,7 @@ intro() {
echo " ${BOLD}run${NORMAL} runs \"docker-compose run --rm misago\"."
echo " ${BOLD}psql${NORMAL} runs psql connected to development database."
echo " ${BOLD}pyfmt${NORMAL} runs isort + black on python code."
echo " ${BOLD}fakedata${NORMAL} populates database with testing data."
echo
}

Expand Down Expand Up @@ -263,6 +264,13 @@ psql_in_docker() {
PGPASSWORD=$POSTGRES_PASSWORD psql --username $POSTGRES_USER --host $POSTGRES_HOST $POSTGRES_DB
}

# Shortcut for creating small dev forum
create_fake_data() {
docker-compose run --rm misago python manage.py createfakecategories 7
docker-compose run --rm misago python manage.py createfakecategories 12 1
docker-compose run --rm misago python manage.py createfakehistory 600
}

# Command dispatcher
if [[ $1 ]]; then
if [[ $1 = "init" ]]; then
Expand Down Expand Up @@ -309,6 +317,8 @@ if [[ $1 ]]; then
elif [[ $1 = "pyfmt" ]]; then
isort -rc misago
black devproject misago
elif [[ $1 = "fakedata" ]]; then
create_fake_data
else
invalid_argument $1
fi
Expand Down
11 changes: 11 additions & 0 deletions misago/conftest.py
Expand Up @@ -2,6 +2,7 @@

from .acl import ACL_CACHE, useracl
from .admin.auth import authorize_admin
from .categories.models import Category
from .conf import SETTINGS_CACHE
from .conf.dynamicsettings import DynamicSettings
from .conf.staticsettings import StaticSettings
Expand Down Expand Up @@ -95,3 +96,13 @@ def admin_client(mocker, client, superuser):
authorize_admin(mocker.Mock(session=session, user=superuser))
session.save()
return client


@pytest.fixture
def root_category(db):
return Category.objects.root_category()


@pytest.fixture
def default_category(db):
return Category.objects.get(slug="first-category")
94 changes: 94 additions & 0 deletions 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
53 changes: 53 additions & 0 deletions misago/faker/categories.py
@@ -0,0 +1,53 @@
import random

from ..categories.models import Category, RoleCategoryACL


def fake_category(fake, parent, copy_acl_from=None):
category = Category()
category.set_name(fake_category_name(fake))

if random.randint(1, 100) > 50:
category.description = fake_category_description(fake)

category.insert_at(parent, position="last-child", save=True)

if copy_acl_from:
copy_acl_to_fake_category(copy_acl_from, category)

return category


def fake_closed_category(fake, parent, copy_acl_from=None):
category = fake_category(fake, parent, copy_acl_from)
category.is_closed = True
category.save(update_fields=["is_closed"])

return category


def copy_acl_to_fake_category(source, category):
copied_acls = []
for acl in source.category_role_set.all():
copied_acls.append(
RoleCategoryACL(
role_id=acl.role_id,
category=category,
category_role_id=acl.category_role_id,
)
)

if copied_acls:
RoleCategoryACL.objects.bulk_create(copied_acls)


def fake_category_name(fake):
if random.randint(1, 100) > 75:
return fake.catch_phrase().title()
return fake.street_name()


def fake_category_description(fake):
if random.randint(1, 100) > 80:
return "\r\n".join(fake.paragraphs())
return fake.paragraph()
2 changes: 1 addition & 1 deletion misago/faker/englishcorpus.py
Expand Up @@ -30,7 +30,7 @@ def __len__(self):
def shuffle(self):
random.shuffle(self.phrases)

def random_choice(self):
def random_sentence(self):
self._countdown_to_shuffle()

choice = None
Expand Down
90 changes: 6 additions & 84 deletions 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):
Expand All @@ -87,34 +22,21 @@ def handle(self, *args, **options):
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)

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)

0 comments on commit 9ad5bea

Please sign in to comment.