createfakethreads.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import random
  2. from faker import Factory
  3. from django.contrib.auth import get_user_model
  4. from django.core.management.base import BaseCommand
  5. from django.db.transaction import atomic
  6. from django.template.defaultfilters import linebreaks_filter
  7. from django.utils import timezone
  8. from misago.core.management.progressbar import show_progress
  9. from misago.forums.models import Forum
  10. from misago.threads.checksums import update_post_checksum
  11. from misago.threads.models import Thread, Post
  12. class Command(BaseCommand):
  13. help = 'Adds random threads and posts for testing purposes'
  14. def handle(self, *args, **options):
  15. try:
  16. fake_threads_to_create = int(args[0])
  17. except IndexError:
  18. fake_threads_to_create = 5
  19. except ValueError:
  20. self.stderr.write("\nOptional argument should be integer.")
  21. sys.exit(1)
  22. forums = [f for f in Forum.objects.all_forums().filter(role='forum')]
  23. fake = Factory.create()
  24. User = get_user_model()
  25. total_users = User.objects.count()
  26. self.stdout.write('Creating fake threads...\n')
  27. message = '\nSuccessfully created %s fake threads'
  28. created_threads = 0
  29. show_progress(self, created_threads, fake_threads_to_create)
  30. for i in xrange(fake_threads_to_create):
  31. with atomic():
  32. time = timezone.now()
  33. forum = random.choice(forums)
  34. user = User.objects.order_by('?')[:1][0]
  35. thread_is_moderated = random.randint(0, 100) > 90
  36. thread_is_hidden = random.randint(0, 100) > 90
  37. thread_is_closed = random.randint(0, 100) > 90
  38. thread = Thread(
  39. forum=forum,
  40. weight=0,
  41. started_on=time,
  42. starter_name='-',
  43. starter_slug='-',
  44. last_post_on=time,
  45. last_poster_name='-',
  46. last_poster_slug='-',
  47. replies=random.randint(0, 2000),
  48. is_moderated=thread_is_moderated,
  49. is_hidden=thread_is_hidden,
  50. is_closed=thread_is_closed)
  51. thread.set_title(fake.sentence())
  52. thread.save()
  53. fake_message = "\n\n".join(fake.paragraphs())
  54. post = Post.objects.create(
  55. forum=forum,
  56. thread=thread,
  57. poster=user,
  58. poster_name=user.username,
  59. poster_ip=fake.ipv4(),
  60. original=fake_message,
  61. parsed=linebreaks_filter(fake_message),
  62. posted_on=time,
  63. updated_on=time)
  64. update_post_checksum(post)
  65. post.save(update_fields=['checksum'])
  66. thread.set_first_post(post)
  67. thread.set_last_post(post)
  68. thread.save()
  69. forum.threads += 1
  70. forum.posts += 1
  71. forum.set_last_thread(thread)
  72. forum.save()
  73. user.threads += 1
  74. user.posts += 1
  75. user.save()
  76. created_threads += 1
  77. show_progress(self, created_threads, fake_threads_to_create)
  78. pinned_threads = random.randint(0, int(created_threads * 0.05)) or 1
  79. self.stdout.write('\Pinning %s threads...' % pinned_threads)
  80. for i in xrange(0, pinned_threads):
  81. thread = Thread.objects.order_by('?')[:1][0]
  82. thread.weight = 1
  83. thread.save()
  84. announcements = random.randint(0, int(created_threads * 0.01)) or 1
  85. self.stdout.write('\Making %s announcements...' % announcements)
  86. for i in xrange(0, announcements):
  87. thread = Thread.objects.order_by('?')[:1][0]
  88. thread.weight = 2
  89. thread.save()
  90. self.stdout.write(message % created_threads)