aboutsummaryrefslogtreecommitdiff
path: root/app/dispatch/management/commands/insert_fake_data.py
blob: 0ceac6e16682299f5d4952d73ee54888b0084d11 (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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
from django.core.management.base import BaseCommand, CommandError
from django.core.files import File
from django.contrib.auth import get_user_model
from dispatch.models import Customer, Load, Identity, Paperwork, Invoice
import datetime
from faker import Faker
from dateutil import rrule
from dispatch.misc import get_week_dates_datetime
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' --attachments=True"""

    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('--attachments', type=bool, dest='attachments', default=False)
        parser.add_argument('--invoices', type=bool, dest='invoices', default=False)
        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)


        # We're going to go about getting the list of user and customer IDs
        # in a slightly different manner now so that we get _all_ customers
        # and _all_ users.
        customer_ids = self.get_customer_ids()
        user_ids = self.get_user_ids()

        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, options['attachments'])


        if options['invoices']:
            # I'm pretty sure this is slow, but it's not run often
            # and can/should be fixed later
            start_load = Load.objects.order_by('date')[0]
            end_load = Load.objects.order_by('-date')[0]
            # print("Start Load: {} PK: {} user: {}".format(start_load, start_load.pk, start_load.user))
            # print("End Load: {} PK: {} user: {}".format(end_load, end_load.pk, end_load.user))

            # Use the date of the first load to the date of the last load, and
            # iterate over all of the weeks in between
            for dt in rrule.rrule(rrule.WEEKLY, dtstart=start_load.date, until=end_load.date):
                print(dt)

                # This will hold all of the users for the week
                users = []

                # Let's get a listing of loads for the week
                wk = get_week_dates_datetime(dt)
                loads = Load.objects.filter(date__range=[wk['start_date'], wk['end_date']])
                for l in loads:
                    if l.user not in users:
                        users.append(l.user)
                        print(l.user)


                for u in users:
                    due_date = wk['start_date'] + datetime.timedelta(days=30)
                    inv = Invoice(user=u, invoice_date=wk['start_date'], due_date=due_date)

                    inv.setup()

                    inv.save()

                    inv.populate_items(start_date=wk['start_date'], end_date=wk['end_date'])

                    print(inv)


                # wk = get_week_dates_datetime(dt)
                # loads = Load.objects.filter(date__range=[wk['start_date'], wk['end_date']])
                # loads = loads.order_by('user')

                # uniqe_users

                # print("################################################################################")
                # print("MUH LOADS")
                # print("FOR: {}".format(dt))
                # for l in loads:
                #     print("PK: {}, Date: {}, User: {}".format(l.pk, l.date, l.user))
                # print(loads)
                # print("################################################################################")


                # break




            # users = User.objects.all()
            # for u in users:
            #     inv = Invoice(user=u, invoice_date=start_date, due_date=due_date)
            #     inv.setup()
            #     inv.save()

            #     inv.populate_items_default_date

    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, attachments=False):
        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()

        if attachments:
            self.add_attachment(new_load)

        return new_load

    def add_attachment(self, load):
        p = Paperwork(load=load)
        p.document = File(open('chicken.pdf', 'rb'))
        p.save()


    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(),
                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()


    def get_customer_ids(self):
        id_array = []
        for cus in Customer.objects.all():
            id_array.append(cus.pk)
        return id_array

    def get_user_ids(self):
        id_array = []
        for u in User.objects.all():
            id_array.append(u.pk)
        return id_array