aboutsummaryrefslogtreecommitdiff
path: root/app/dispatch
diff options
context:
space:
mode:
Diffstat (limited to 'app/dispatch')
-rw-r--r--app/dispatch/management/commands/insert_fake_data.py11
-rw-r--r--app/dispatch/management/commands/setup.py15
-rw-r--r--app/dispatch/migrations/0001_initial.py58
-rw-r--r--app/dispatch/migrations/0002_auto_20171024_2255.py27
-rw-r--r--app/dispatch/migrations/0002_owner.py26
-rw-r--r--app/dispatch/migrations/0003_settings.py23
-rw-r--r--app/dispatch/migrations/0004_auto_20171023_2032.py53
-rw-r--r--app/dispatch/migrations/0005_invoice_invoice_id.py21
-rw-r--r--app/dispatch/migrations/0006_auto_20171023_2049.py28
-rw-r--r--app/dispatch/migrations/0007_invoice_paid.py20
-rw-r--r--app/dispatch/migrations/0008_invoiceitem_date.py22
-rw-r--r--app/dispatch/models.py61
-rw-r--r--app/dispatch/templates/dispatch/invoice/list.html1
-rw-r--r--app/dispatch/views.py24
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)