createfakebans.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import random
  2. from datetime import timedelta
  3. from django.contrib.auth import get_user_model
  4. from django.core.exceptions import ValidationError
  5. from django.core.management.base import BaseCommand
  6. from django.db import IntegrityError
  7. from django.utils import timezone
  8. from faker import Factory
  9. from misago.core.management.progressbar import show_progress
  10. from misago.users.models import Ban, BAN_USERNAME, BAN_EMAIL, BAN_IP
  11. def fake_username_ban(fake):
  12. fake_value = fake.first_name()
  13. if random.randint(0, 100) < 31:
  14. fake_value = '%s*' % fake_value
  15. elif random.randint(0, 100) < 31:
  16. fake_value = '*%s' % fake_value
  17. elif random.randint(0, 100) < 31:
  18. fake_value = list(fake_value)
  19. fake_value.insert(random.randint(0, len(fake_value) - 1), '*')
  20. fake_value = ''.join(fake_value)
  21. return fake_value
  22. def fake_email_ban(fake):
  23. if random.randint(0, 100) < 35:
  24. return '*@%s' % fake.domain_name()
  25. else:
  26. return fake.email()
  27. def fake_ip_ban(fake):
  28. if random.randint(0, 1):
  29. fake_value = fake.ipv4()
  30. if random.randint(0, 100) < 35:
  31. fake_value = fake_value.split('.')
  32. fake_value = '.'.join(fake_value[:random.randint(1, 3)])
  33. fake_value = '%s.*' % fake_value
  34. elif random.randint(0, 100) < 35:
  35. fake_value = fake_value.split('.')
  36. fake_value = '.'.join(fake_value[random.randint(1, 3):])
  37. fake_value = '*.%s' % fake_value
  38. elif random.randint(0, 100) < 35:
  39. fake_value = fake_value.split('.')
  40. fake_value[random.randint(0, 3)] = '*'
  41. fake_value = '.'.join(fake_value)
  42. else:
  43. fake_value = fake.ipv6()
  44. if random.randint(0, 100) < 35:
  45. fake_value = fake_value.split(':')
  46. fake_value = ':'.join(fake_value[:random.randint(1, 7)])
  47. fake_value = '%s:*' % fake_value
  48. elif random.randint(0, 100) < 35:
  49. fake_value = fake_value.split(':')
  50. fake_value = ':'.join(fake_value[:random.randint(1, 7)])
  51. fake_value = '*:%s' % fake_value
  52. elif random.randint(0, 100) < 35:
  53. fake_value = fake_value.split(':')
  54. fake_value[random.randint(0, 7)] = '*'
  55. fake_value = ':'.join(fake_value)
  56. return fake_value
  57. def create_fake_test(fake, test_type):
  58. if test_type == BAN_USERNAME:
  59. return fake_username_ban(fake)
  60. elif test_type == BAN_EMAIL:
  61. return fake_email_ban(fake)
  62. elif test_type == BAN_IP:
  63. return fake_ip_ban(fake)
  64. class Command(BaseCommand):
  65. help = 'Creates random fakey bans for testing purposes'
  66. def handle(self, *args, **options):
  67. try:
  68. fake_bans_to_create = int(args[0])
  69. except IndexError:
  70. fake_bans_to_create = 5
  71. except ValueError:
  72. self.stderr.write("\nOptional argument should be integer.")
  73. sys.exit(1)
  74. fake = Factory.create()
  75. message = 'Creating %s fake bans...\n'
  76. self.stdout.write(message % fake_bans_to_create)
  77. message = '\n\nSuccessfully created %s fake bans'
  78. created_count = 0
  79. show_progress(self, created_count, fake_bans_to_create)
  80. for i in xrange(fake_bans_to_create):
  81. ban = Ban(test=random.randint(BAN_USERNAME, BAN_IP))
  82. ban.banned_value = create_fake_test(fake, ban.test)
  83. if random.randint(0, 10) == 0:
  84. ban.user_message = fake.sentence()
  85. if random.randint(0, 10) == 0:
  86. ban.staff_message = fake.sentence()
  87. if random.randint(0, 1):
  88. # Lets make ban temporary
  89. ban_length = timedelta(days=random.randint(0, 300))
  90. if random.randint(0, 1):
  91. ban.valid_until = timezone.now().date() - ban_length
  92. else:
  93. ban.valid_until = timezone.now().date() + ban_length
  94. ban.save()
  95. created_count += 1
  96. show_progress(self, created_count, fake_bans_to_create)
  97. self.stdout.write(message % created_count)