aboutsummaryrefslogtreecommitdiff
path: root/app/dispatch/management/commands/insert_fake_data.py
blob: 0919181142a89ba87b669c198c535c20539d2fa3 (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
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth import get_user_model
from dispatch.models import Company, Load
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']

        company_ids = []
        user_ids = []

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

            # We're going to hold the model IDs in memory to access randomly
            # later on
            company_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 = company_ids[random.randint(0, len(company_ids)-1)]
            co = Company.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_company(self):
        new_company = Company(
                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_company.save()
        return new_company

    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))
        print(fake_description)
        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,
            company=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()
            return new_user
        except IntegrityError:
            # Around and around we go until we get something new
            return self.fake_user()