diff options
Diffstat (limited to 'app/dispatch')
| -rw-r--r-- | app/dispatch/management/commands/insert_fake_data.py | 11 | ||||
| -rw-r--r-- | app/dispatch/management/commands/setup.py | 15 | ||||
| -rw-r--r-- | app/dispatch/migrations/0001_initial.py | 58 | ||||
| -rw-r--r-- | app/dispatch/migrations/0002_auto_20171024_2255.py | 27 | ||||
| -rw-r--r-- | app/dispatch/migrations/0002_owner.py | 26 | ||||
| -rw-r--r-- | app/dispatch/migrations/0003_settings.py | 23 | ||||
| -rw-r--r-- | app/dispatch/migrations/0004_auto_20171023_2032.py | 53 | ||||
| -rw-r--r-- | app/dispatch/migrations/0005_invoice_invoice_id.py | 21 | ||||
| -rw-r--r-- | app/dispatch/migrations/0006_auto_20171023_2049.py | 28 | ||||
| -rw-r--r-- | app/dispatch/migrations/0007_invoice_paid.py | 20 | ||||
| -rw-r--r-- | app/dispatch/migrations/0008_invoiceitem_date.py | 22 | ||||
| -rw-r--r-- | app/dispatch/models.py | 61 | ||||
| -rw-r--r-- | app/dispatch/templates/dispatch/invoice/list.html | 1 | ||||
| -rw-r--r-- | app/dispatch/views.py | 24 |
14 files changed, 155 insertions, 235 deletions
diff --git a/app/dispatch/management/commands/insert_fake_data.py b/app/dispatch/management/commands/insert_fake_data.py index 5d4203d..2969900 100644 --- a/app/dispatch/management/commands/insert_fake_data.py +++ b/app/dispatch/management/commands/insert_fake_data.py @@ -1,6 +1,6 @@ from django.core.management.base import BaseCommand, CommandError from django.contrib.auth import get_user_model -from dispatch.models import Customer, Load +from dispatch.models import Customer, Load, Identity from faker import Faker import random @@ -106,6 +106,15 @@ class Command(BaseCommand): 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 diff --git a/app/dispatch/management/commands/setup.py b/app/dispatch/management/commands/setup.py new file mode 100644 index 0000000..bdfa96e --- /dev/null +++ b/app/dispatch/management/commands/setup.py @@ -0,0 +1,15 @@ +from django.core.management.base import BaseCommand, CommandError +from django.contrib.auth import get_user_model +from dispatch.models import Customer, Load +from faker import Faker +import random + +from django.db.utils import IntegrityError + +# import yaml + +User = get_user_model() + + +class Command(BaseCommand): + help = "Run with " diff --git a/app/dispatch/migrations/0001_initial.py b/app/dispatch/migrations/0001_initial.py index 500e6ea..05c6c7d 100644 --- a/app/dispatch/migrations/0001_initial.py +++ b/app/dispatch/migrations/0001_initial.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.5 on 2017-10-20 00:51 +# Generated by Django 1.11.5 on 2017-10-24 22:53 from __future__ import unicode_literals -import dispatch.models +import dispatch.misc from django.conf import settings from django.db import migrations, models import django.db.models.deletion @@ -29,6 +29,42 @@ class Migration(migrations.Migration): ], ), migrations.CreateModel( + name='Identity', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=256)), + ('address', models.CharField(max_length=256)), + ('city', models.CharField(max_length=256)), + ('state', models.CharField(max_length=256)), + ('zip_code', models.CharField(max_length=256)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, unique=True)), + ], + ), + migrations.CreateModel( + name='Invoice', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('invoice_id', models.IntegerField()), + ('invoice_date', models.DateField()), + ('due_date', models.DateField()), + ('paid', models.BooleanField(default=False)), + ('bill_to', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_to', to='dispatch.Identity')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='owner', to='dispatch.Identity')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='InvoiceItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField()), + ('description', models.CharField(max_length=256)), + ('quantity', models.IntegerField()), + ('amount', models.DecimalField(decimal_places=2, max_digits=19)), + ('invoice', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dispatch.Invoice')), + ], + ), + migrations.CreateModel( name='Load', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), @@ -45,8 +81,24 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('description', models.CharField(max_length=256)), - ('document', models.FileField(upload_to=dispatch.models.paperwork_user_directory_path)), + ('document', models.FileField(upload_to=dispatch.misc.paperwork_user_directory_path)), ('load', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dispatch.Load')), ], ), + migrations.CreateModel( + name='Settings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(max_length=256)), + ('value', models.CharField(max_length=256)), + ], + ), + migrations.CreateModel( + name='UserInvoiceNumber', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('number', models.IntegerField(default=1200)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, unique=True)), + ], + ), ] diff --git a/app/dispatch/migrations/0002_auto_20171024_2255.py b/app/dispatch/migrations/0002_auto_20171024_2255.py new file mode 100644 index 0000000..bbf96d4 --- /dev/null +++ b/app/dispatch/migrations/0002_auto_20171024_2255.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2017-10-24 22:55 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('dispatch', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='identity', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='userinvoicenumber', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/app/dispatch/migrations/0002_owner.py b/app/dispatch/migrations/0002_owner.py deleted file mode 100644 index 689ca6b..0000000 --- a/app/dispatch/migrations/0002_owner.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.5 on 2017-10-23 19:14 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('dispatch', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Owner', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=256)), - ('address', models.CharField(max_length=256)), - ('city', models.CharField(max_length=256)), - ('state', models.CharField(max_length=256)), - ('zip_code', models.CharField(max_length=256)), - ], - ), - ] diff --git a/app/dispatch/migrations/0003_settings.py b/app/dispatch/migrations/0003_settings.py deleted file mode 100644 index 3043e2d..0000000 --- a/app/dispatch/migrations/0003_settings.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.5 on 2017-10-23 19:19 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('dispatch', '0002_owner'), - ] - - operations = [ - migrations.CreateModel( - name='Settings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('key', models.CharField(max_length=256)), - ('value', models.CharField(max_length=256)), - ], - ), - ] diff --git a/app/dispatch/migrations/0004_auto_20171023_2032.py b/app/dispatch/migrations/0004_auto_20171023_2032.py deleted file mode 100644 index 59219bc..0000000 --- a/app/dispatch/migrations/0004_auto_20171023_2032.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.5 on 2017-10-23 20:32 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('dispatch', '0003_settings'), - ] - - operations = [ - migrations.CreateModel( - name='Invoice', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ], - ), - migrations.CreateModel( - name='InvoiceItem', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.CharField(max_length=256)), - ('quantity', models.IntegerField()), - ('amount', models.DecimalField(decimal_places=2, max_digits=19)), - ('invoice', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dispatch.Invoice')), - ], - ), - migrations.RenameModel( - old_name='Owner', - new_name='Identity', - ), - migrations.AddField( - model_name='invoice', - name='bill_to', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_to', to='dispatch.Identity'), - ), - migrations.AddField( - model_name='invoice', - name='owner', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='owner', to='dispatch.Identity'), - ), - migrations.AddField( - model_name='invoice', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/app/dispatch/migrations/0005_invoice_invoice_id.py b/app/dispatch/migrations/0005_invoice_invoice_id.py deleted file mode 100644 index 23b7c49..0000000 --- a/app/dispatch/migrations/0005_invoice_invoice_id.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.5 on 2017-10-23 20:36 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('dispatch', '0004_auto_20171023_2032'), - ] - - operations = [ - migrations.AddField( - model_name='invoice', - name='invoice_id', - field=models.IntegerField(default=0), - preserve_default=False, - ), - ] diff --git a/app/dispatch/migrations/0006_auto_20171023_2049.py b/app/dispatch/migrations/0006_auto_20171023_2049.py deleted file mode 100644 index 04668ff..0000000 --- a/app/dispatch/migrations/0006_auto_20171023_2049.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.5 on 2017-10-23 20:49 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('dispatch', '0005_invoice_invoice_id'), - ] - - operations = [ - migrations.AddField( - model_name='invoice', - name='due_date', - field=models.DateField(default=django.utils.timezone.now), - preserve_default=False, - ), - migrations.AddField( - model_name='invoice', - name='invoice_date', - field=models.DateField(default=django.utils.timezone.now), - preserve_default=False, - ), - ] diff --git a/app/dispatch/migrations/0007_invoice_paid.py b/app/dispatch/migrations/0007_invoice_paid.py deleted file mode 100644 index d8fcd81..0000000 --- a/app/dispatch/migrations/0007_invoice_paid.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.5 on 2017-10-24 14:20 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('dispatch', '0006_auto_20171023_2049'), - ] - - operations = [ - migrations.AddField( - model_name='invoice', - name='paid', - field=models.BooleanField(default=False), - ), - ] diff --git a/app/dispatch/migrations/0008_invoiceitem_date.py b/app/dispatch/migrations/0008_invoiceitem_date.py deleted file mode 100644 index 892adfe..0000000 --- a/app/dispatch/migrations/0008_invoiceitem_date.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.5 on 2017-10-24 15:02 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('dispatch', '0007_invoice_paid'), - ] - - operations = [ - migrations.AddField( - model_name='invoiceitem', - name='date', - field=models.DateField(default=django.utils.timezone.now), - preserve_default=False, - ), - ] diff --git a/app/dispatch/models.py b/app/dispatch/models.py index 2d724d6..d525818 100644 --- a/app/dispatch/models.py +++ b/app/dispatch/models.py @@ -4,6 +4,7 @@ from auditlog.registry import auditlog from auditlog.models import AuditlogHistoryField from django.contrib.auth.models import User from datetime import datetime +from django.core.exceptions import ObjectDoesNotExist from .misc import get_week_dates, paperwork_user_directory_path # Create your models here. @@ -47,6 +48,7 @@ class Paperwork(models.Model): class Identity(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE) name = models.CharField(max_length=256) address = models.CharField(max_length=256) city = models.CharField(max_length=256) @@ -56,6 +58,13 @@ class Identity(models.Model): def __str__(self): return "{}".format(self.name) + def set_default(self): + try: + Settings.objects.get(key="default_bill_to").value + except ObjectDoesNotExist: + st = Settings(key="default_bill_to", value=int(self.pk)) + st.save() + class Settings(models.Model): key = models.CharField(max_length=256) value = models.CharField(max_length=256) @@ -64,6 +73,10 @@ class Settings(models.Model): return "{}: {}".format(self.key, self.value) +class UserInvoiceNumber(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE) + number = models.IntegerField(default=1200) + class Invoice(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) owner = models.ForeignKey(Identity, on_delete=models.CASCADE, related_name="owner") @@ -79,26 +92,32 @@ class Invoice(models.Model): self.owner.name, self.total()) - def set_invoice_id(self): - # A fucking terrible hack - inv_number = Settings.objects.get(key="user_{:d}_invoice_number".format(self.user.pk)) - inv_number.value = str(int(inv_number.value) + 1) - self.invoice_id = int(inv_number.value) - inv_number.save() + # def __init__(self, user, invoice_date, due_date): + # super(Invoice, self).__init__() + def setup(self): + try: + uinv = UserInvoiceNumber.objects.get(user=self.user.pk) + uinv.number += 1 + uinv.save() + self.invoice_id = uinv.number + except ObjectDoesNotExist: + uinv = UserInvoiceNumber() + uinv.user = self.user + uinv.save() + self.invoice_id = uinv.number + + self.owner = Identity.objects.get(user=self.user.pk) + + bill_to_id = Settings.objects.get(key='default_bill_to') + self.bill_to = Identity.objects.get(pk=int(bill_to_id.value)) + def populate_bill_to(self): pk = Settings.objects.get(key="default_bill_to").value self.bill_to = Identity.objects.get(pk=pk) - def set_owner(self, ident): - setting = Settings(key="user_{:d}_identity".format(self.user.pk), - value=ident.pk) - return setting.save() - def populate_owner(self): - key = "user_{:d}_identity".format(self.user.id) - pk = Settings.objects.get(key=key).value - self.owner = Identity.objects.get(pk=pk) + self.owner = Identity.objects.get(user=self.user.pk) def populate_items_default_date(self): wk = get_week_dates() @@ -153,14 +172,14 @@ class InvoiceItem(models.Model): # class Invoice(): # load_ids = [] # total = 0.00 -# +# # def __init__(self, **kwargs): # # self.args = kwargs # if isinstance(kwargs['driver'], User): # self.driver = kwargs['driver'] # else: # raise Exception("'driver' must be a Django User instance") -# +# # if isinstance(kwargs.get('start_date'), datetime) and isinstance(kwargs.get('end_date'), datetime): # self.start_date = kwargs.get('start_date') # self.end_date = kwargs.get('end_date') @@ -168,20 +187,20 @@ class InvoiceItem(models.Model): # dates = get_week_dates() # self.start_date = dates['start_date'] # self.end_date = dates['end_date'] -# +# # self.loads = Load.objects.filter(user__exact=self.driver.id, # date__range=(self.start_date, self.end_date)) -# +# # for l in self.loads: # self.load_ids.append(l.pk) # self.total += float(l.amount) -# +# # if isinstance(kwargs.get('bill_to'), Owner): # self.bill_to = kwargs.get('bill_to') # else: # self.bill_to = Owner.objects.get(pk=Settings.objects.get(key='default_owner').value) -# -# +# +# # def __str__(self): # return "Invoice for {} from {} for: {}".format(self.end_date, self.driver, self.total) diff --git a/app/dispatch/templates/dispatch/invoice/list.html b/app/dispatch/templates/dispatch/invoice/list.html index 292edd7..c068cc5 100644 --- a/app/dispatch/templates/dispatch/invoice/list.html +++ b/app/dispatch/templates/dispatch/invoice/list.html @@ -22,7 +22,6 @@ </tr> </thead> <tbody> - {{object_list}} {% for invoice in object_list %} <tr> <td>{{invoice.user}}</td> diff --git a/app/dispatch/views.py b/app/dispatch/views.py index 75e7a06..32be26c 100644 --- a/app/dispatch/views.py +++ b/app/dispatch/views.py @@ -262,7 +262,7 @@ def PaperworkDownload(request, load_id, pk): if os.path.exists(paperwork.document.path): with open(paperwork.document.path, 'rb') as fh: - try: + try: exp = re.compile('\.[^.]*$', re.IGNORECASE) ext = exp.findall(paperwork.document.path) ext = ext[0] @@ -272,7 +272,7 @@ def PaperworkDownload(request, load_id, pk): desc = load.description.replace('"', '') - response = HttpResponse(fh.read(), content_type='application/force-download') + response = HttpResponse(fh.read(), content_type='application/force-download') response['Content-Disposition'] = 'attachment; filename="{}"'.format(smart_str(desc + ext)) response['X-Sendfile'] = smart_str(paperwork.document.path) return response @@ -281,7 +281,7 @@ def PaperworkDownload(request, load_id, pk): -# Invoice +# Invoice class InvoiceList(FilteredListView): template_name = "dispatch/invoice/list.html" model = Invoice @@ -301,10 +301,7 @@ def InvoiceGenerateForDates(request, pk): wk = get_week_dates(datetime.datetime.strftime(start_date, "%m/%d/%Y")) inv = Invoice(user=driver, invoice_date=start_date, due_date=due_date) - - inv.populate_bill_to() - inv.populate_owner() - inv.set_invoice_id() + inv.setup() inv.save() @@ -312,11 +309,6 @@ def InvoiceGenerateForDates(request, pk): return redirect(reverse('invoice_list')) - # print(start_date) - # print(wk) - # print(driver) - # print(inv) - @@ -324,22 +316,22 @@ def InvoiceGenerateForDates(request, pk): # template_name = "dispatch/invoice/edit.html" # model = Invoice # fields = ['invoice_date','due_date'] -# +# # def test_func(self): # # Seems a little hacky at first but it works! # return self.request.user.is_superuser or \ # self.get_object().user.pk is self.request.user.pk -# +# # class InvoiceCreate(CreateView): # template_name = "dispatch/invoice/create.html" # model = Invoice # fields = ['invoice_date', 'due_date'] -# +# # def get(self,request): # if request.user.is_superuser: # self.fields.insert(1,'user') # return super(LoadCreate, self).get(request) -# +# # def form_valid(self, form): # if not self.request.user.is_superuser: # load = form.save(commit=False) |
