create_random_data.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. from django.core.management.base import BaseCommand
  2. from bakerydemo.breads.models import BreadPage, BreadsIndexPage, BreadType, Country, BreadIngredient
  3. from django.conf import settings
  4. from django.utils import lorem_ipsum, timezone
  5. from django.utils.text import slugify
  6. from wagtail.core.rich_text import RichText
  7. from bakerydemo.locations.models import LocationPage, LocationsIndexPage
  8. from bakerydemo.blog.models import BlogPage, BlogIndexPage
  9. import random
  10. from wagtail.images.models import Image
  11. from pathlib import Path
  12. from willow.image import Image as WillowImage
  13. from django.conf import settings
  14. from bakerydemo.base.models import People, FooterText, StandardPage, HomePage
  15. FIXTURE_MEDIA_DIR = Path(settings.PROJECT_DIR) / "base/fixtures/media/original_images"
  16. class Command(BaseCommand):
  17. help = "Creates random data. Useful for performance or load testing."
  18. def add_arguments(self, parser):
  19. parser.add_argument(
  20. 'page_count', type=int,
  21. help='How many pages of each type to create',
  22. )
  23. parser.add_argument(
  24. 'snippet_count', type=int,
  25. help='How many snippets of each type to create',
  26. )
  27. parser.add_argument(
  28. 'image_count', type=int,
  29. help='How many images to create',
  30. )
  31. def fake_stream_field(self):
  32. return [
  33. ('paragraph_block', RichText("\n".join(lorem_ipsum.paragraphs(5))))
  34. ]
  35. def get_random_model(self, model):
  36. return model.objects.order_by('?').first()
  37. def make_title(self):
  38. return lorem_ipsum.words(4, common=False)
  39. def create_pages(self, page_count):
  40. self.stdout.write("Creating bread pages...")
  41. breads_index = BreadsIndexPage.objects.live().first()
  42. for _ in range(page_count):
  43. title = self.make_title()
  44. breads_index.add_child(instance=BreadPage(
  45. title=title,
  46. slug=slugify(title),
  47. introduction=lorem_ipsum.paragraph(),
  48. bread_type=self.get_random_model(BreadType),
  49. body=self.fake_stream_field(),
  50. origin=self.get_random_model(Country),
  51. image=self.get_random_model(Image)
  52. ))
  53. self.stdout.write("Creating location pages...")
  54. locations_index = LocationsIndexPage.objects.live().first()
  55. for _ in range(page_count):
  56. title = self.make_title()
  57. locations_index.add_child(instance=LocationPage(
  58. title=title,
  59. slug=slugify(title),
  60. introduction=lorem_ipsum.paragraph(),
  61. image=self.get_random_model(Image),
  62. address=lorem_ipsum.paragraph(),
  63. body=self.fake_stream_field(),
  64. lat_long='64.144367, -21.939182'
  65. ))
  66. self.stdout.write("Creating blog pages...")
  67. blog_index = BlogIndexPage.objects.live().first()
  68. for _ in range(page_count):
  69. title = self.make_title()
  70. blog_index.add_child(instance=BlogPage(
  71. title=title,
  72. slug=slugify(title),
  73. introduction=lorem_ipsum.paragraph(),
  74. body=self.fake_stream_field(),
  75. subtitle=lorem_ipsum.words(10, common=False),
  76. date_published=timezone.now()
  77. ))
  78. self.stdout.write("Creating standard pages...")
  79. homepage = HomePage.objects.live().first()
  80. title = self.make_title()
  81. # Nest the standard pages under a top level one
  82. top_level_page = homepage.add_child(instance=StandardPage(
  83. title=title,
  84. slug=slugify(title),
  85. introduction=lorem_ipsum.paragraph(),
  86. image=self.get_random_model(Image),
  87. body=self.fake_stream_field(),
  88. ))
  89. for _ in range(page_count):
  90. title = self.make_title()
  91. top_level_page.add_child(instance=StandardPage(
  92. title=title,
  93. slug=slugify(title),
  94. introduction=lorem_ipsum.paragraph(),
  95. image=self.get_random_model(Image),
  96. body=self.fake_stream_field(),
  97. ))
  98. def create_snippets(self, snippet_count):
  99. self.stdout.write("Creating countries...")
  100. for _ in range(snippet_count):
  101. Country.objects.create(title=self.make_title())
  102. self.stdout.write("Creating bread ingredients...")
  103. for _ in range(snippet_count):
  104. BreadIngredient.objects.create(name=self.make_title())
  105. self.stdout.write("Creating bread types...")
  106. for _ in range(snippet_count):
  107. BreadType.objects.create(title=self.make_title())
  108. self.stdout.write("Creating people...")
  109. for _ in range(snippet_count):
  110. People.objects.create(
  111. first_name=lorem_ipsum.words(1, common=False),
  112. last_name=lorem_ipsum.words(1, common=False),
  113. job_title=lorem_ipsum.words(1, common=False),
  114. image=self.get_random_model(Image)
  115. )
  116. self.stdout.write("Creating footer text...")
  117. for _ in range(snippet_count):
  118. FooterText.objects.create(body=self.fake_stream_field())
  119. def create_images(self, image_count):
  120. image_files = list(FIXTURE_MEDIA_DIR.iterdir())
  121. self.stdout.write("Creating images...")
  122. for _ in range(image_count):
  123. random_image = random.choice(image_files)
  124. with random_image.open(mode="rb") as image_file:
  125. willow_image = WillowImage.open(image_file)
  126. width, height = willow_image.get_size()
  127. image = Image.objects.create(
  128. title=self.make_title(),
  129. width=width,
  130. height=height,
  131. file_size=random_image.stat().st_size,
  132. )
  133. image_file.seek(0)
  134. image.file.save(random_image.name, image_file)
  135. def handle(self, **options):
  136. self.create_images(options['image_count'])
  137. self.create_snippets(options['snippet_count'])
  138. self.create_pages(options['page_count'])