Complete fake data loading via hopper
- Includes mods to task.created_date to allow overrides
This commit is contained in:
parent
403d1483f6
commit
1f27688aa4
9 changed files with 256 additions and 92 deletions
|
@ -1,7 +1,39 @@
|
|||
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 todo.models import Task, TaskList
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.utils.text import slugify
|
||||
|
||||
from todo.models import Task, TaskList
|
||||
|
||||
|
||||
num_lists = 5
|
||||
num_tasks_per_list = 10
|
||||
|
||||
|
||||
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):
|
||||
|
@ -9,25 +41,99 @@ class Command(BaseCommand):
|
|||
|
||||
def handle(self, *args, **options):
|
||||
|
||||
# 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.
|
||||
bw_group = Group.objects.create(name='Basket Weavers')
|
||||
sd_group = Group.objects.create(name='Scuba Divers')
|
||||
usernames = ['user1', 'user2', 'staff_user']
|
||||
|
||||
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:
|
||||
get_user_model().objects.create_user(username=username, password="todo")
|
||||
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 == 'user1':
|
||||
u1 = get_user_model().objects.get(username=username)
|
||||
u1.groups.add(bw_group)
|
||||
if username in ['user1', 'user2']:
|
||||
user.groups.add(bw_group)
|
||||
|
||||
if username == 'user2':
|
||||
u2 = get_user_model().objects.get(username=username)
|
||||
u2.groups.add(sd_group)
|
||||
if username in ['user3', 'user4']:
|
||||
user.groups.add(sd_group)
|
||||
|
||||
if username == 'staff_user':
|
||||
staffer = get_user_model().objects.get(username=username, is_staff=True,)
|
||||
staffer.groups.add(bw_group)
|
||||
staffer.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, num_tasks_per_list)
|
||||
)
|
||||
|
||||
|
||||
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):
|
||||
TaskFactory.create_batch(num_tasks_per_list, 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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue