aboutsummaryrefslogtreecommitdiff
path: root/app/dispatch/management/commands/insert_fake_data.py
blob: 296990043a7b8cf3c793461c0ec327d23a44bd47 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth import get_user_model
from dispatch.models import Customer, Load, Identity
from faker import Faker
import random

from django.db.utils import IntegrityError

# import yaml

User = get_user_model()


class Command(BaseCommand):
    help = """Generate fake data.\n
    Example usage: \n
   ./manage.py insert_fake_data --companies 4 --users 3 --loads 800
   --start-date='-16w' --end-date '+16w' """

    fake = Faker()
    end_date = ""
    start_date = ""

    def add_arguments(self, parser):
        # parser.add_argument('--file', type=str, dest='filename')
        parser.add_argument('--companies', type=int, dest='companies', default='0')
        parser.add_argument('--users', type=int, dest='users', default='0')
        parser.add_argument('--loads', type=int, dest='loads', default='0')
        parser.add_argument('--start-date', type=str, dest='startdate', default='-2w')
        parser.add_argument('--end-date', type=str, dest='enddate', default='+2w')


    def handle(self, *args, **options):

        self.end_date   = options['enddate']
        self.start_date = options['startdate']

        customer_ids = []
        user_ids = []

        for i in range(0, options['companies']):
            co = self.fake_customer()

            # We're going to hold the model IDs in memory to access randomly
            # later on
            customer_ids.append(co.pk)

        for i in range(0, options['users']):
            u = self.fake_user()

            user_ids.append(u.pk)

        for i in range(0, options['loads']):
            co_id = customer_ids[random.randint(0, len(customer_ids)-1)]
            co = Customer.objects.get(pk=co_id)

            u_id = user_ids[random.randint(0, len(user_ids)-1)]
            u = User.objects.get(pk=u_id)

            l = self.fake_load(u, co)

    def fake_customer(self):
        new_customer = Customer(
                name=self.fake.company(),
                address=self.fake.address(),
                phone_number=self.fake.msisdn(),
                email_address=self.fake.company_email(),
                contact_name=self.fake.name(),
            )
        new_customer.save()
        return new_customer

    def fake_load(self, usr, co):
        fake_description = "{}-{} {} {}K".format(
            self.fake.month(), self.fake.day_of_month(),
            self.fake.license_plate(), random.randint(5, 50))
        new_load = Load(
            user=usr,
            # Because that's going to be random enough
            # load_number=self.fake.license_plate(),
            # description=self.fake.sentence(nb_words=6),
            description=fake_description,
            customer=co,
            amount=random.randint(150,2500),
            delivered_to=self.fake.city(),
        )
        # Set the date to something random between last week and next week
        new_load.date=self.fake.date_between(start_date=self.start_date, end_date=self.end_date)
        new_load.save()
        return new_load


    def fake_user(self):
        ffname = self.fake.first_name()
        flname = self.fake.last_name()
        funame = ffname[0] + flname
        funame = '%s.%s' % (ffname, flname)

        try:
            new_user = User(
                first_name=ffname,
                last_name=flname,
                email=self.fake.email(),
                # Set the fake user name to be the first initial and last name
                username=funame,
                is_active=True
            )
            new_user.save()
            user_ident = Identity(
                user=new_user,
                name="{} {}".format(ffname, flname),
                address=self.fake.address(),
                city=self.fake.city(),
                state=self.fake.state(),
                zip_code=self.fake.zipcode(),
            )
            user_ident.save()
            return new_user
        except IntegrityError:
            # Around and around we go until we get something new
            return self.fake_user()