From da9d2f7467fd81d9aa3c64e05e3316aa482b84c1 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 23 Oct 2021 22:49:06 +0200 Subject: [PATCH 1/7] Added missing fields Fixes #2181 --- InvenTree/part/views.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 5a4167ea05..330e7ae49c 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -245,6 +245,7 @@ class PartImport(FileManagementFormView): 'Category', 'default_location', 'default_supplier', + 'variant_of', ] OPTIONAL_HEADERS = [ @@ -256,6 +257,16 @@ class PartImport(FileManagementFormView): 'minimum_stock', 'Units', 'Notes', + 'Active', + 'base_cost', + 'Multiple', + 'assembly', + 'component', + 'is_template', + 'purchaseable', + 'salable', + 'trackable', + 'virtual', ] name = 'part' @@ -284,6 +295,17 @@ class PartImport(FileManagementFormView): 'category': 'category', 'default_location': 'default_location', 'default_supplier': 'default_supplier', + 'variant_of': 'variant_of', + 'active': 'active', + 'base_cost': 'base_cost', + 'multiple': 'multiple', + 'assembly': 'assembly', + 'component': 'component', + 'is_template': 'is_template', + 'purchaseable': 'purchaseable', + 'salable': 'salable', + 'trackable': 'trackable', + 'virtual': 'virtual', } file_manager_class = PartFileManager @@ -299,6 +321,8 @@ class PartImport(FileManagementFormView): self.matches['default_location'] = ['name__contains'] self.allowed_items['default_supplier'] = SupplierPart.objects.all() self.matches['default_supplier'] = ['SKU__contains'] + self.allowed_items['variant_of'] = Part.objects.all() + self.matches['variant_of'] = ['name__contains'] # setup self.file_manager.setup() From 71cc155dc99474f7e0c17066ee1eed46f5531436 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 23 Oct 2021 22:50:01 +0200 Subject: [PATCH 2/7] Capitalize name --- InvenTree/part/views.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 330e7ae49c..66a101ba5a 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -260,13 +260,13 @@ class PartImport(FileManagementFormView): 'Active', 'base_cost', 'Multiple', - 'assembly', - 'component', + 'Assembly', + 'Component', 'is_template', - 'purchaseable', - 'salable', - 'trackable', - 'virtual', + 'Purchaseable', + 'Salable', + 'Trackable', + 'Virtual', ] name = 'part' From 15566632540cf0f1e521ddabd1f202af6aa30d07 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 23 Oct 2021 23:40:29 +0200 Subject: [PATCH 3/7] added fields to save step --- InvenTree/part/views.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 66a101ba5a..55147c933b 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -388,6 +388,17 @@ class PartImport(FileManagementFormView): category=optional_matches['Category'], default_location=optional_matches['default_location'], default_supplier=optional_matches['default_supplier'], + variant_of=optional_matches['variant_of'], + active=optional_matches['active'], + base_cost=optional_matches['base_cost'], + multiple=optional_matches['multiple'], + assembly=optional_matches['assembly'], + component=optional_matches['component'], + is_template=optional_matches['is_template'], + purchaseable=optional_matches['purchaseable'], + salable=optional_matches['salable'], + trackable=optional_matches['trackable'], + virtual=optional_matches['virtual'], ) try: new_part.save() From 8e6aaa89f91f94ada7bce7f5660dbe783d63cae0 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 23 Oct 2021 23:40:57 +0200 Subject: [PATCH 4/7] calculate true / false for fields --- InvenTree/part/views.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 55147c933b..f9bd57e767 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -389,16 +389,16 @@ class PartImport(FileManagementFormView): default_location=optional_matches['default_location'], default_supplier=optional_matches['default_supplier'], variant_of=optional_matches['variant_of'], - active=optional_matches['active'], - base_cost=optional_matches['base_cost'], - multiple=optional_matches['multiple'], - assembly=optional_matches['assembly'], - component=optional_matches['component'], - is_template=optional_matches['is_template'], - purchaseable=optional_matches['purchaseable'], - salable=optional_matches['salable'], - trackable=optional_matches['trackable'], - virtual=optional_matches['virtual'], + active=str2bool(part_data.get('active', None)), + base_cost=part_data.get('base_cost', None), + multiple=part_data.get('multiple', None), + assembly=str2bool(part_data.get('assembly', None)), + component=str2bool(part_data.get('component', None)), + is_template=str2bool(part_data.get('is_template', None)), + purchaseable=str2bool(part_data.get('purchaseable', None)), + salable=str2bool(part_data.get('salable', None)), + trackable=str2bool(part_data.get('trackable', None)), + virtual=str2bool(part_data.get('virtual', None)), ) try: new_part.save() From 612832c3e771b3847abf948cd8cc1459962f10c2 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 23 Oct 2021 23:48:42 +0200 Subject: [PATCH 5/7] respect defaults --- InvenTree/part/views.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index f9bd57e767..8deec0750f 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -47,6 +47,7 @@ from stock.models import StockLocation import common.settings as inventree_settings from . import forms as part_forms +from . import settings as part_settings from .bom import MakeBomTemplate, ExportBom, IsValidBOMFormat from order.models import PurchaseOrderLineItem @@ -389,16 +390,16 @@ class PartImport(FileManagementFormView): default_location=optional_matches['default_location'], default_supplier=optional_matches['default_supplier'], variant_of=optional_matches['variant_of'], - active=str2bool(part_data.get('active', None)), + active=str2bool(part_data.get('active', True)), base_cost=part_data.get('base_cost', None), multiple=part_data.get('multiple', None), - assembly=str2bool(part_data.get('assembly', None)), - component=str2bool(part_data.get('component', None)), - is_template=str2bool(part_data.get('is_template', None)), - purchaseable=str2bool(part_data.get('purchaseable', None)), - salable=str2bool(part_data.get('salable', None)), - trackable=str2bool(part_data.get('trackable', None)), - virtual=str2bool(part_data.get('virtual', None)), + assembly=str2bool(part_data.get('assembly', part_settings.part_assembly_default())), + component=str2bool(part_data.get('component', part_settings.part_component_default())), + is_template=str2bool(part_data.get('is_template', part_settings.part_template_default())), + purchaseable=str2bool(part_data.get('purchaseable', part_settings.part_purchaseable_default())), + salable=str2bool(part_data.get('salable', part_settings.part_salable_default())), + trackable=str2bool(part_data.get('trackable', part_settings.part_trackable_default())), + virtual=str2bool(part_data.get('virtual', part_settings.part_virtual_default())), ) try: new_part.save() From bec845003d76bb93c50181c1f096cfc1fc939fac Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 23 Oct 2021 23:57:10 +0200 Subject: [PATCH 6/7] fix defaults --- InvenTree/part/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 8deec0750f..918c015f94 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -391,8 +391,8 @@ class PartImport(FileManagementFormView): default_supplier=optional_matches['default_supplier'], variant_of=optional_matches['variant_of'], active=str2bool(part_data.get('active', True)), - base_cost=part_data.get('base_cost', None), - multiple=part_data.get('multiple', None), + base_cost=part_data.get('base_cost', 0), + multiple=part_data.get('multiple', 1), assembly=str2bool(part_data.get('assembly', part_settings.part_assembly_default())), component=str2bool(part_data.get('component', part_settings.part_component_default())), is_template=str2bool(part_data.get('is_template', part_settings.part_template_default())), From d97e3cd4e5d85e0ebf71ad0f653e43358f872d21 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 24 Oct 2021 00:19:17 +0200 Subject: [PATCH 7/7] create stock on import --- InvenTree/part/views.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 918c015f94..5456f4e049 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -42,7 +42,7 @@ from common.files import FileManager from common.views import FileManagementFormView, FileManagementAjaxView from common.forms import UploadFileForm, MatchFieldForm -from stock.models import StockLocation +from stock.models import StockItem, StockLocation import common.settings as inventree_settings @@ -268,6 +268,7 @@ class PartImport(FileManagementFormView): 'Salable', 'Trackable', 'Virtual', + 'Stock', ] name = 'part' @@ -307,6 +308,7 @@ class PartImport(FileManagementFormView): 'salable': 'salable', 'trackable': 'trackable', 'virtual': 'virtual', + 'stock': 'stock', } file_manager_class = PartFileManager @@ -403,6 +405,15 @@ class PartImport(FileManagementFormView): ) try: new_part.save() + + # add stock item if set + if part_data.get('stock', None): + stock = StockItem( + part=new_part, + location=new_part.default_location, + quantity=int(part_data.get('stock', 1)), + ) + stock.save() import_done += 1 except ValidationError as _e: import_error.append(', '.join(set(_e.messages)))