mybuddy/babybuddy/management/commands/fake.py

171 lines
5.3 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from random import choice, randint, uniform
from datetime import timedelta
from decimal import Decimal
from django.core.management.base import BaseCommand
from django.utils import timezone
from faker import Factory
from core import models
class Command(BaseCommand):
help = 'Generates fake children and related entries.'
def __init__(self, *args, **kwargs):
super(Command, self).__init__(*args, **kwargs)
self.faker = Factory.create()
def add_arguments(self, parser):
parser.add_argument(
'--children',
dest='children',
default=1,
help='The number of fake children to create.'
)
parser.add_argument(
'--days',
dest='days',
default=31,
help='How many days of fake entries to create.'
)
def handle(self, *args, **kwargs):
verbosity = int(kwargs['verbosity'])
children = int(kwargs['children']) or 1
days = int(kwargs['days']) or 31
# User first day of data that will created for birth date.
birth_date = (timezone.localtime() - timedelta(days=days))
for i in range(0, children):
child = models.Child.objects.create(
first_name=self.faker.first_name(),
last_name=self.faker.last_name(),
birth_date=birth_date
)
child.save()
for j in range(days - 1, -1, -1):
date = (timezone.localtime() - timedelta(days=j)).replace(
hour=0, minute=0, second=0)
self._add_child_data(child, date)
if verbosity > 0:
self.stdout.write(
self.style.SUCCESS('Successfully added fake data.')
)
def _add_child_data(self, child, date):
now = timezone.localtime()
for i in (range(0, randint(5, 20))):
solid = choice([True, False])
if solid:
wet = False
color = choice(
models.DiaperChange._meta.get_field('color').choices)[0]
else:
wet = True
color = ''
time = date + timedelta(minutes=randint(0, 60 * 24))
if time < now:
models.DiaperChange.objects.create(
child=child,
time=time,
wet=wet,
solid=solid,
color=color
).save()
last_end = date
while last_end < date + timedelta(days=1):
method = choice(models.Feeding._meta.get_field(
'method').choices)[0]
if method is 'bottle':
amount = Decimal('%d.%d' % (randint(0, 6), randint(0, 9)))
else:
amount = None
start = last_end + timedelta(minutes=randint(0, 60 * 2))
end = start + timedelta(minutes=randint(5, 20))
if end > now:
break
models.Feeding.objects.create(
child=child,
start=start,
end=end,
type=choice(models.Feeding._meta.get_field('type').choices)[0],
method=method,
amount=amount
).save()
last_end = end
last_end = date
# Adjust last_end if the last sleep entry crossed in to date.
last_entry = models.Sleep.objects.filter(
child=child).order_by('end').last()
if last_entry:
last_entry_end = timezone.localtime(last_entry.end)
if last_entry_end > last_end:
last_end = last_entry_end
while last_end < date + timedelta(days=1):
start = last_end + timedelta(minutes=randint(0, 60 * 2))
if start.date() != date.date():
break
end = start + timedelta(minutes=randint(10, 60 * 3))
if end > now:
break
models.Sleep.objects.create(
child=child, start=start, end=end).save()
last_end = end
last_end = date
while last_end < date + timedelta(days=1):
if choice([True, False]):
milestone = self.faker.sentence()
else:
milestone = ''
start = last_end + timedelta(minutes=randint(0, 60 * 5))
end = start + timedelta(minutes=randint(1, 10))
if end > now:
break
models.TummyTime.objects.create(
child=child,
start=start,
end=end,
milestone=milestone
).save()
last_end = end
last_entry = models.Weight.objects.filter(child=child) \
.order_by('date').last()
if not last_entry:
weight = uniform(2.0, 5.0)
else:
weight = last_entry.weight + uniform(0, 0.04)
models.Weight.objects.create(
child=child,
weight=weight,
date=date.date()
).save()
note = self.faker.sentence()
models.Note.objects.create(
child=child,
note=note,
time=date + timedelta(minutes=randint(0, 60 * 24))
).save()