createfakethreads.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import random
  2. import time
  3. from faker import Factory
  4. from django.contrib.auth import get_user_model
  5. from django.core.management.base import BaseCommand
  6. from django.db.transaction import atomic
  7. from django.template.defaultfilters import linebreaks_filter
  8. from django.utils import timezone
  9. from misago.core.management.progressbar import show_progress
  10. from misago.categories.models import Category
  11. from misago.threads.checksums import update_post_checksum
  12. from misago.threads.models import Thread, Post
  13. class Command(BaseCommand):
  14. help = 'Adds random threads and posts for testing purposes'
  15. def handle(self, *args, **options):
  16. try:
  17. fake_threads_to_create = int(args[0])
  18. except IndexError:
  19. fake_threads_to_create = 5
  20. except ValueError:
  21. self.stderr.write("\nOptional argument should be integer.")
  22. sys.exit(1)
  23. categories = list(Category.objects.all_categories())
  24. fake = Factory.create()
  25. User = get_user_model()
  26. total_users = User.objects.count()
  27. self.stdout.write('Creating fake threads...\n')
  28. message = '\nSuccessfully created %s fake threads'
  29. created_threads = 0
  30. start_time = time.time()
  31. show_progress(self, created_threads, fake_threads_to_create)
  32. for i in xrange(fake_threads_to_create):
  33. with atomic():
  34. datetime = timezone.now()
  35. category = random.choice(categories)
  36. user = User.objects.order_by('?')[:1][0]
  37. thread_is_moderated = random.randint(0, 100) > 90
  38. thread_is_hidden = random.randint(0, 100) > 90
  39. thread_is_closed = random.randint(0, 100) > 90
  40. thread = Thread(
  41. category=category,
  42. started_on=datetime,
  43. starter_name='-',
  44. starter_slug='-',
  45. last_post_on=datetime,
  46. last_poster_name='-',
  47. last_poster_slug='-',
  48. replies=0,
  49. is_moderated=thread_is_moderated,
  50. is_hidden=thread_is_hidden,
  51. is_closed=thread_is_closed
  52. )
  53. thread.set_title(fake.sentence())
  54. thread.save()
  55. fake_message = "\n\n".join(fake.paragraphs())
  56. post = Post.objects.create(
  57. category=category,
  58. thread=thread,
  59. poster=user,
  60. poster_name=user.username,
  61. poster_ip=fake.ipv4(),
  62. original=fake_message,
  63. parsed=linebreaks_filter(fake_message),
  64. posted_on=datetime,
  65. updated_on=datetime
  66. )
  67. update_post_checksum(post)
  68. post.save(update_fields=['checksum'])
  69. thread.set_first_post(post)
  70. thread.set_last_post(post)
  71. thread.save()
  72. user.threads += 1
  73. user.posts += 1
  74. user.save()
  75. thread_type = random.randint(0, 100)
  76. if thread_type > 95:
  77. thread_replies = random.randint(200, 2500)
  78. elif thread_type > 50:
  79. thread_replies = random.randint(5, 30)
  80. else:
  81. thread_replies = random.randint(0, 10)
  82. for x in xrange(thread_replies):
  83. datetime = timezone.now()
  84. user = User.objects.order_by('?')[:1][0]
  85. fake_message = "\n\n".join(fake.paragraphs())
  86. is_moderated = random.randint(0, 100) > 97
  87. if not is_moderated:
  88. is_hidden = random.randint(0, 100) > 97
  89. else:
  90. is_hidden = False
  91. post = Post.objects.create(
  92. category=category,
  93. thread=thread,
  94. poster=user,
  95. poster_name=user.username,
  96. poster_ip=fake.ipv4(),
  97. original=fake_message,
  98. parsed=linebreaks_filter(fake_message),
  99. is_hidden=is_hidden,
  100. is_moderated=is_moderated,
  101. posted_on=datetime,
  102. updated_on=datetime
  103. )
  104. update_post_checksum(post)
  105. post.save(update_fields=['checksum'])
  106. user.posts += 1
  107. user.save()
  108. thread.synchronize()
  109. thread.save()
  110. created_threads += 1
  111. show_progress(
  112. self, created_threads, fake_threads_to_create, start_time)
  113. pinned_threads = random.randint(0, int(created_threads * 0.025)) or 1
  114. self.stdout.write('\nPinning %s threads...' % pinned_threads)
  115. for i in xrange(0, pinned_threads):
  116. thread = Thread.objects.order_by('?')[:1][0]
  117. thread.is_pinned = True
  118. thread.save()
  119. for category in categories:
  120. category.synchronize()
  121. category.save()
  122. self.stdout.write(message % created_threads)