coins-demo/todo/management/commands/hopper.py

145 lines
4.8 KiB
Python

import factory
from faker import Faker
from titlecase import titlecase
import random
from django.core.management.base import BaseCommand
from django.contrib.auth.models import Group
from django.contrib.auth import get_user_model
from django.utils.text import slugify
from todo.models import Task, TaskList
num_lists = 5
def gen_title(tc=True):
# faker doesn't provide a way to generate headlines in Title Case, without periods, so make our own.
# With arg `tc=True`, Title Cases The Generated Text
fake = Faker()
thestr = fake.text(max_nb_chars=32).rstrip('.')
if tc:
thestr = titlecase(thestr)
return thestr
def gen_content():
# faker provides paragraphs as a list; convert with linebreaks
fake = Faker()
grafs = fake.paragraphs()
thestr = ''
for g in grafs:
thestr += "{}\n\n".format(g)
return thestr
class Command(BaseCommand):
help = """Create random list and task data for a few fake users."""
def add_arguments(self, parser):
parser.add_argument(
"-d",
"--delete",
help="Wipe out existing content before generating new.",
action="store_true")
def handle(self, *args, **options):
if options.get('delete'):
# Wipe out previous contents? Cascade deletes the Tasks from the TaskLists.
TaskList.objects.all().delete()
print("Content from previous run deleted.")
print("Working...")
fake = Faker() # Use to create user's names
# Create users and groups, add different users to different groups. Staff user is in both groups.
sd_group, created = Group.objects.get_or_create(name='Scuba Divers')
bw_group, created = Group.objects.get_or_create(name='Basket Weavers')
# Put user1 and user2 in one group, user3 and user4 in another
usernames = ['user1', 'user2', 'user3', 'user4', 'staffer']
for username in usernames:
if get_user_model().objects.filter(username=username).exists():
user = get_user_model().objects.get(username=username)
else:
user = get_user_model().objects.create_user(
username=username,
first_name=fake.first_name(),
last_name=fake.last_name(),
email=fake.email(),
password="todo")
if username in ['user1', 'user2']:
user.groups.add(bw_group)
if username in ['user3', 'user4']:
user.groups.add(sd_group)
if username == 'staffer':
user.is_staff = True
user.first_name = fake.first_name()
user.last_name = fake.last_name()
user.save()
user.groups.add(bw_group)
user.groups.add(sd_group)
# Create lists with tasks
TaskListFactory.create_batch(5, group=bw_group)
TaskListFactory.create_batch(5, group=sd_group)
print("For each of two groups, created fake tasks in each of {} fake lists.".format(num_lists))
class TaskListFactory(factory.django.DjangoModelFactory):
"""Group not generated here - call with group as arg."""
class Meta:
model = TaskList
name = factory.LazyAttribute(lambda o: gen_title(tc=True))
slug = factory.LazyAttribute(lambda o: slugify(o.name))
group = None # Pass this in
@factory.post_generation
def add_tasks(self, build, extracted, **kwargs):
num = random.randint(5, 25)
TaskFactory.create_batch(num, task_list=self)
class TaskFactory(factory.django.DjangoModelFactory):
"""TaskList not generated here - call with TaskList as arg."""
class Meta:
model = Task
title = factory.LazyAttribute(lambda o: gen_title(tc=False))
task_list = None # Pass this in
note = factory.LazyAttribute(lambda o: gen_content())
priority = factory.LazyAttribute(lambda o: random.randint(1, 100))
completed = factory.Faker('boolean', chance_of_getting_true=30)
created_by = get_user_model().objects.get(username='staffer') # Randomized in post
created_date = factory.Faker('date_this_year')
@factory.post_generation
def add_details(self, build, extracted, **kwargs):
fake = Faker() # Use to create user's names
taskgroup = self.task_list.group
self.created_by = taskgroup.user_set.all().order_by('?').first()
if self.completed:
self.completed_date = fake.date_this_year()
# 1/3 of generated tasks have a due_date
if random.randint(1, 3) == 1:
self.due_date = fake.date_this_year()
# 1/3 of generated tasks are assigned to someone in this tasks's group
if random.randint(1, 3) == 1:
self.assigned_to = taskgroup.user_set.all().order_by('?').first()
self.save()