createfakecategories.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import random
  2. import time
  3. from django.core.management.base import BaseCommand
  4. from faker import Factory
  5. from ....acl.cache import clear_acl_cache
  6. from ....categories.models import Category
  7. from ....core.management.progressbar import show_progress
  8. from ...categories import fake_category, fake_closed_category
  9. class Command(BaseCommand):
  10. help = "Creates fake categories for dev and testing purposes."
  11. def add_arguments(self, parser):
  12. parser.add_argument(
  13. "categories",
  14. help="number of categories to create",
  15. nargs="?",
  16. type=int,
  17. default=5,
  18. )
  19. parser.add_argument(
  20. "minlevel",
  21. help="min. level of created categories",
  22. nargs="?",
  23. type=int,
  24. default=0,
  25. )
  26. def handle(self, *args, **options): # pylint: disable=too-many-locals
  27. items_to_create = options["categories"]
  28. min_level = options["minlevel"]
  29. fake = Factory.create()
  30. categories = Category.objects.all_categories(include_root=True).filter(
  31. level__gte=min_level
  32. )
  33. acl_source = list(Category.objects.all_categories())[0]
  34. if not categories.exists():
  35. self.stdout.write("No valid parent categories exist.\n")
  36. return
  37. message = "Creating %s fake categories...\n"
  38. self.stdout.write(message % items_to_create)
  39. created_count = 0
  40. start_time = time.time()
  41. show_progress(self, created_count, items_to_create)
  42. while created_count < items_to_create:
  43. categories = (
  44. Category.objects.all_categories(include_root=True)
  45. .filter(level__gte=min_level)
  46. .order_by("?")
  47. )
  48. parent = random.choice(categories)
  49. if random.randint(0, 100) > 90:
  50. fake_closed_category(fake, parent, copy_acl_from=acl_source)
  51. else:
  52. fake_category(fake, parent, copy_acl_from=acl_source)
  53. created_count += 1
  54. show_progress(self, created_count, items_to_create, start_time)
  55. clear_acl_cache()
  56. total_time = time.time() - start_time
  57. total_humanized = time.strftime("%H:%M:%S", time.gmtime(total_time))
  58. message = "\n\nSuccessfully created %s fake categories in %s"
  59. self.stdout.write(message % (created_count, total_humanized))