From 8856d7f793ae65a572502d8a97d7d9610ce1e7a1 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 17 Apr 2018 23:39:53 +1000 Subject: [PATCH] Renamed 'customer-order' app to 'customer' - This app should manage more than just orders - Moved the 'Customer' model into this app --- InvenTree/InvenTree/settings.py | 2 +- InvenTree/InvenTree/urls.py | 2 +- .../{customer_orders => customer}/__init__.py | 0 InvenTree/customer/admin.py | 21 ++++++ InvenTree/customer/apps.py | 5 ++ InvenTree/customer/migrations/0001_initial.py | 62 ++++++++++++++++ .../migrations/__init__.py | 0 .../{customer_orders => customer}/models.py | 5 +- .../customer_orders/customer_orders_list.html | 0 .../templates/customer_orders/index.html | 0 .../{customer_orders => customer}/tests.py | 0 .../{customer_orders => customer}/urls.py | 0 .../{customer_orders => customer}/views.py | 0 InvenTree/customer_orders/admin.py | 15 ---- InvenTree/customer_orders/apps.py | 5 -- .../migrations/0001_initial.py | 37 ---------- .../migrations/0002_auto_20180417_2205.py | 73 ------------------- .../migrations/0003_auto_20180417_1323.py | 48 ------------ InvenTree/part/models.py | 3 +- .../migrations/0013_auto_20180417_1337.py | 21 ++++++ InvenTree/stock/models.py | 2 +- InvenTree/supplier/admin.py | 13 ++-- .../migrations/0008_delete_customer.py | 18 +++++ Makefile | 1 + 24 files changed, 145 insertions(+), 188 deletions(-) rename InvenTree/{customer_orders => customer}/__init__.py (100%) create mode 100644 InvenTree/customer/admin.py create mode 100644 InvenTree/customer/apps.py create mode 100644 InvenTree/customer/migrations/0001_initial.py rename InvenTree/{customer_orders => customer}/migrations/__init__.py (100%) rename InvenTree/{customer_orders => customer}/models.py (92%) rename InvenTree/{customer_orders => customer}/templates/customer_orders/customer_orders_list.html (100%) rename InvenTree/{customer_orders => customer}/templates/customer_orders/index.html (100%) rename InvenTree/{customer_orders => customer}/tests.py (100%) rename InvenTree/{customer_orders => customer}/urls.py (100%) rename InvenTree/{customer_orders => customer}/views.py (100%) delete mode 100644 InvenTree/customer_orders/admin.py delete mode 100644 InvenTree/customer_orders/apps.py delete mode 100644 InvenTree/customer_orders/migrations/0001_initial.py delete mode 100644 InvenTree/customer_orders/migrations/0002_auto_20180417_2205.py delete mode 100644 InvenTree/customer_orders/migrations/0003_auto_20180417_1323.py create mode 100644 InvenTree/stock/migrations/0013_auto_20180417_1337.py create mode 100644 InvenTree/supplier/migrations/0008_delete_customer.py diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index fe22396242..b221d43b4f 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -51,7 +51,7 @@ INSTALLED_APPS = [ 'stock.apps.StockConfig', 'supplier.apps.SupplierConfig', 'build.apps.BuildConfig', - 'customer_orders.apps.CustomerOrdersConfig' + 'customer.apps.CustomerConfig' ] MIDDLEWARE = [ diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 2fbfba3e0d..38b0a465b1 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -13,7 +13,7 @@ from supplier.urls import supplier_urls from build.urls import build_urls -from customer_orders.urls import customer_orders_urls +from customer.urls import customer_orders_urls from django.conf import settings from django.conf.urls.static import static diff --git a/InvenTree/customer_orders/__init__.py b/InvenTree/customer/__init__.py similarity index 100% rename from InvenTree/customer_orders/__init__.py rename to InvenTree/customer/__init__.py diff --git a/InvenTree/customer/admin.py b/InvenTree/customer/admin.py new file mode 100644 index 0000000000..53db1aaa43 --- /dev/null +++ b/InvenTree/customer/admin.py @@ -0,0 +1,21 @@ +from django.contrib import admin +from import_export.admin import ImportExportModelAdmin + +from .models import Customer, CustomerOrder, CustomerOrderLine + + +class CustomerAdmin(ImportExportModelAdmin): + list_display = ('name', 'website', 'contact') + + +class CustomerOrderAdmin(admin.ModelAdmin): + pass + + +class CustomerOrderLineAdmin(admin.ModelAdmin): + pass + + +admin.site.register(Customer, CustomerAdmin) +admin.site.register(CustomerOrder, CustomerOrderAdmin) +admin.site.register(CustomerOrderLine, CustomerOrderLineAdmin) \ No newline at end of file diff --git a/InvenTree/customer/apps.py b/InvenTree/customer/apps.py new file mode 100644 index 0000000000..6918275d1f --- /dev/null +++ b/InvenTree/customer/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class CustomerConfig(AppConfig): + name = 'customer' diff --git a/InvenTree/customer/migrations/0001_initial.py b/InvenTree/customer/migrations/0001_initial.py new file mode 100644 index 0000000000..444cb64d87 --- /dev/null +++ b/InvenTree/customer/migrations/0001_initial.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.12 on 2018-04-17 13:37 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('part', '0022_auto_20180417_0819'), + ] + + operations = [ + migrations.CreateModel( + name='Customer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100, unique=True)), + ('description', models.CharField(max_length=500)), + ('website', models.URLField(blank=True)), + ('address', models.CharField(blank=True, max_length=200)), + ('phone', models.CharField(blank=True, max_length=50)), + ('email', models.EmailField(blank=True, max_length=254)), + ('contact', models.CharField(blank=True, max_length=100)), + ('notes', models.CharField(blank=True, max_length=500)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CustomerOrder', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('internal_ref', models.CharField(max_length=100, unique=True)), + ('customer_ref', models.CharField(blank=True, default=b'', max_length=100)), + ('created_date', models.DateField(auto_now_add=True, help_text=b'Date order entered in system')), + ('issued_date', models.DateField(blank=True, help_text=b'Date order issued by customer')), + ('notes', models.TextField(blank=True, default=b'', help_text=b'Order notes')), + ('customer', models.ForeignKey(blank=True, help_text=b'Customer that placed this order', null=True, on_delete=django.db.models.deletion.SET_NULL, to='customer.Customer')), + ], + ), + migrations.CreateModel( + name='CustomerOrderLine', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('line_number', models.PositiveIntegerField(default=0, help_text=b'Line number')), + ('quantity', models.PositiveIntegerField(blank=True, help_text=b'Quantity of part')), + ('notes', models.TextField(blank=True, help_text=b'Line notes')), + ('customer_order', models.ForeignKey(help_text=b'Order this line belongs to', on_delete=django.db.models.deletion.CASCADE, to='customer.CustomerOrder')), + ('part', models.ForeignKey(blank=True, help_text=b'Part', on_delete=django.db.models.deletion.CASCADE, to='part.Part')), + ], + ), + migrations.AlterUniqueTogether( + name='customerorderline', + unique_together=set([('customer_order', 'line_number')]), + ), + ] diff --git a/InvenTree/customer_orders/migrations/__init__.py b/InvenTree/customer/migrations/__init__.py similarity index 100% rename from InvenTree/customer_orders/migrations/__init__.py rename to InvenTree/customer/migrations/__init__.py diff --git a/InvenTree/customer_orders/models.py b/InvenTree/customer/models.py similarity index 92% rename from InvenTree/customer_orders/models.py rename to InvenTree/customer/models.py index 057bc0bfa8..1ef201228e 100644 --- a/InvenTree/customer_orders/models.py +++ b/InvenTree/customer/models.py @@ -60,7 +60,10 @@ class CustomerOrderLine(models.Model): line_number = models.PositiveIntegerField(default=0, help_text="Line number") # TODO: for now, each line corresponds to some quantity of some part, but in future we might want more flexibility - part = models.ForeignKey(Part, blank=True, help_text="Part") + # Only 'salable' items should be allowed in a CSO + part = models.ForeignKey(Part, blank=True, help_text="Part", + limit_choices_to={'salable' : True} + ) # TODO: should quantity field here somehow related to quantity field of related part? Views will handle this, right? quantity = models.PositiveIntegerField(blank=True, help_text="Quantity of part") diff --git a/InvenTree/customer_orders/templates/customer_orders/customer_orders_list.html b/InvenTree/customer/templates/customer_orders/customer_orders_list.html similarity index 100% rename from InvenTree/customer_orders/templates/customer_orders/customer_orders_list.html rename to InvenTree/customer/templates/customer_orders/customer_orders_list.html diff --git a/InvenTree/customer_orders/templates/customer_orders/index.html b/InvenTree/customer/templates/customer_orders/index.html similarity index 100% rename from InvenTree/customer_orders/templates/customer_orders/index.html rename to InvenTree/customer/templates/customer_orders/index.html diff --git a/InvenTree/customer_orders/tests.py b/InvenTree/customer/tests.py similarity index 100% rename from InvenTree/customer_orders/tests.py rename to InvenTree/customer/tests.py diff --git a/InvenTree/customer_orders/urls.py b/InvenTree/customer/urls.py similarity index 100% rename from InvenTree/customer_orders/urls.py rename to InvenTree/customer/urls.py diff --git a/InvenTree/customer_orders/views.py b/InvenTree/customer/views.py similarity index 100% rename from InvenTree/customer_orders/views.py rename to InvenTree/customer/views.py diff --git a/InvenTree/customer_orders/admin.py b/InvenTree/customer_orders/admin.py deleted file mode 100644 index f2919066ca..0000000000 --- a/InvenTree/customer_orders/admin.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.contrib import admin -from import_export.admin import ImportExportModelAdmin - -from .models import CustomerOrder, CustomerOrderLine - - -class CustomerOrderAdmin(admin.ModelAdmin): - pass - -class CustomerOrderLineAdmin(admin.ModelAdmin): - pass - - -admin.site.register(CustomerOrder, CustomerOrderAdmin) -admin.site.register(CustomerOrderLine, CustomerOrderLineAdmin) \ No newline at end of file diff --git a/InvenTree/customer_orders/apps.py b/InvenTree/customer_orders/apps.py deleted file mode 100644 index 7196157c41..0000000000 --- a/InvenTree/customer_orders/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class CustomerOrdersConfig(AppConfig): - name = 'customer_orders' diff --git a/InvenTree/customer_orders/migrations/0001_initial.py b/InvenTree/customer_orders/migrations/0001_initial.py deleted file mode 100644 index 64f76be5ff..0000000000 --- a/InvenTree/customer_orders/migrations/0001_initial.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-17 11:27 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('supplier', '0007_auto_20180416_1253'), - ] - - operations = [ - migrations.CreateModel( - name='CustomerOrder', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('customer', models.ForeignKey(blank=True, help_text='Customer that placed this order', null=True, on_delete=django.db.models.deletion.SET_NULL, to='supplier.Customer')), - ], - ), - migrations.CreateModel( - name='CustomerOrderLine', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('line_number', models.PositiveIntegerField(default=0)), - ('customer_order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='customer_orders.CustomerOrder')), - ], - ), - migrations.AlterUniqueTogether( - name='customerorderline', - unique_together=set([('customer_order', 'line_number')]), - ), - ] diff --git a/InvenTree/customer_orders/migrations/0002_auto_20180417_2205.py b/InvenTree/customer_orders/migrations/0002_auto_20180417_2205.py deleted file mode 100644 index 44de420e53..0000000000 --- a/InvenTree/customer_orders/migrations/0002_auto_20180417_2205.py +++ /dev/null @@ -1,73 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-17 12:05 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('part', '0019_auto_20180416_1249'), - ('customer_orders', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='customerorder', - name='created_date', - field=models.DateField(auto_now_add=True, default=django.utils.timezone.now, help_text='Date order entered in system'), - preserve_default=False, - ), - migrations.AddField( - model_name='customerorder', - name='customer_ref', - field=models.CharField(blank=True, default='', max_length=100), - ), - migrations.AddField( - model_name='customerorder', - name='internal_ref', - field=models.CharField(default=0, max_length=100, unique=True), - preserve_default=False, - ), - migrations.AddField( - model_name='customerorder', - name='issued_date', - field=models.DateField(blank=True, default=django.utils.timezone.now, help_text='Date order issued by customer'), - preserve_default=False, - ), - migrations.AddField( - model_name='customerorder', - name='notes', - field=models.TextField(blank=True, default='', help_text='Order notes'), - ), - migrations.AddField( - model_name='customerorderline', - name='notes', - field=models.TextField(blank=True, help_text='Line notes'), - ), - migrations.AddField( - model_name='customerorderline', - name='part', - field=models.ForeignKey(default=0, help_text='Part', on_delete=django.db.models.deletion.CASCADE, to='part.Part'), - preserve_default=False, - ), - migrations.AddField( - model_name='customerorderline', - name='quantity', - field=models.IntegerField(default=1, help_text='Quantity of part'), - preserve_default=False, - ), - migrations.AlterField( - model_name='customerorderline', - name='customer_order', - field=models.ForeignKey(help_text='Order this line belongs to', on_delete=django.db.models.deletion.CASCADE, to='customer_orders.CustomerOrder'), - ), - migrations.AlterField( - model_name='customerorderline', - name='line_number', - field=models.PositiveIntegerField(default=0, help_text='Line number'), - ), - ] diff --git a/InvenTree/customer_orders/migrations/0003_auto_20180417_1323.py b/InvenTree/customer_orders/migrations/0003_auto_20180417_1323.py deleted file mode 100644 index 3f2de3f15a..0000000000 --- a/InvenTree/customer_orders/migrations/0003_auto_20180417_1323.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.12 on 2018-04-17 13:23 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('customer_orders', '0002_auto_20180417_2205'), - ] - - operations = [ - migrations.CreateModel( - name='Customer', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100, unique=True)), - ('description', models.CharField(max_length=500)), - ('website', models.URLField(blank=True)), - ('address', models.CharField(blank=True, max_length=200)), - ('phone', models.CharField(blank=True, max_length=50)), - ('email', models.EmailField(blank=True, max_length=254)), - ('contact', models.CharField(blank=True, max_length=100)), - ('notes', models.CharField(blank=True, max_length=500)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AlterField( - model_name='customerorder', - name='customer', - field=models.ForeignKey(blank=True, help_text=b'Customer that placed this order', null=True, on_delete=django.db.models.deletion.SET_NULL, to='customer_orders.Customer'), - ), - migrations.AlterField( - model_name='customerorderline', - name='part', - field=models.ForeignKey(blank=True, help_text=b'Part', on_delete=django.db.models.deletion.CASCADE, to='part.Part'), - ), - migrations.AlterField( - model_name='customerorderline', - name='quantity', - field=models.PositiveIntegerField(blank=True, help_text=b'Quantity of part'), - ), - ] diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 2002165909..262c582ea7 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -330,7 +330,8 @@ class BomItem(models.Model): # A link to the parent part # Each part will get a reverse lookup field 'bom_items' - part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='bom_items') + part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='bom_items', + limit_choices_to={'buildable': True}) # A link to the child item (sub-part) # Each part will get a reverse lookup field 'used_in' diff --git a/InvenTree/stock/migrations/0013_auto_20180417_1337.py b/InvenTree/stock/migrations/0013_auto_20180417_1337.py new file mode 100644 index 0000000000..5f4b64b873 --- /dev/null +++ b/InvenTree/stock/migrations/0013_auto_20180417_1337.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.12 on 2018-04-17 13:37 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('stock', '0012_auto_20180417_1316'), + ] + + operations = [ + migrations.AlterField( + model_name='stockitem', + name='customer', + field=models.ForeignKey(blank=True, help_text='Item assigned to customer?', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='stockitems', to='customer.Customer'), + ), + ] diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index c3a5514730..608e38dc83 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -12,7 +12,7 @@ from django.dispatch import receiver from datetime import datetime from supplier.models import SupplierPart -from supplier.models import Customer +from customer.models import Customer from part.models import Part from InvenTree.models import InvenTreeTree from build.models import Build diff --git a/InvenTree/supplier/admin.py b/InvenTree/supplier/admin.py index 5811503041..5c6d39e05e 100644 --- a/InvenTree/supplier/admin.py +++ b/InvenTree/supplier/admin.py @@ -1,10 +1,14 @@ from django.contrib import admin from import_export.admin import ImportExportModelAdmin -from .models import Supplier, SupplierPart, Customer, Manufacturer +from .models import Supplier, SupplierPart, Manufacturer -class CompanyAdmin(ImportExportModelAdmin): +class SupplierAdmin(ImportExportModelAdmin): + list_display = ('name', 'website', 'contact') + + +class ManufacturerAdmin(ImportExportModelAdmin): list_display = ('name', 'website', 'contact') @@ -12,7 +16,6 @@ class SupplierPartAdmin(ImportExportModelAdmin): list_display = ('part', 'supplier', 'SKU') -admin.site.register(Customer, CompanyAdmin) -admin.site.register(Supplier, CompanyAdmin) -admin.site.register(Manufacturer, CompanyAdmin) +admin.site.register(Supplier, SupplierAdmin) +admin.site.register(Manufacturer, ManufacturerAdmin) admin.site.register(SupplierPart, SupplierPartAdmin) diff --git a/InvenTree/supplier/migrations/0008_delete_customer.py b/InvenTree/supplier/migrations/0008_delete_customer.py new file mode 100644 index 0000000000..09d7234f35 --- /dev/null +++ b/InvenTree/supplier/migrations/0008_delete_customer.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.12 on 2018-04-17 13:37 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('supplier', '0007_auto_20180416_1253'), + ] + + operations = [ + migrations.DeleteModel( + name='Customer', + ), + ] diff --git a/Makefile b/Makefile index 9420b60374..a2685246f7 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ migrate: python InvenTree/manage.py makemigrations stock python InvenTree/manage.py makemigrations supplier python InvenTree/manage.py makemigrations build + python InvenTree/manage.py makemigrations customer python InvenTree/manage.py migrate --run-syncdb python InvenTree/manage.py check