From 95eae88f6b32b0f9d50ee56a3f512b26832e5fbc Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Mon, 1 Dec 2025 21:56:44 +1100 Subject: [PATCH 01/14] Add Parameter mixin classes --- inventree/base.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/inventree/base.py b/inventree/base.py index fb87739..b7afe1c 100644 --- a/inventree/base.py +++ b/inventree/base.py @@ -7,7 +7,7 @@ from . import api as inventree_api -INVENTREE_PYTHON_VERSION = "0.19.0" +INVENTREE_PYTHON_VERSION = "0.20.0" logger = logging.getLogger('inventree') @@ -543,6 +543,31 @@ def addLinkAttachment(self, link, comment=""): ) +class Parameter(BulkDeleteMixin, InventreeObject): + """Class representing a custom parameter object.""" + + URL = "parameter/" + + # Ref: https://github.com/inventree/InvenTree/pull/10699 + MIN_API_VERSION = 429 + + +class ParameterMixin: + """Mixin class which allows a model class to interact with parameters. + + Ref: https://github.com/inventree/InvenTree/pull/10699 + """ + + def getParameters(self): + """Return a list of parameters associated with this object.""" + + return Parameter.list( + self._api, + model_type=self.getModelType(), + model_id=self.pk + ) + + class MetadataMixin: """Mixin class for models which support a 'metadata' attribute. From a8dec2fc60da6dcd5999ab23430937e35ba4cf4b Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Mon, 1 Dec 2025 21:58:52 +1100 Subject: [PATCH 02/14] Add mixin class to existing model types --- inventree/build.py | 1 + inventree/company.py | 11 +++++++++-- inventree/part.py | 1 + inventree/purchase_order.py | 1 + inventree/return_order.py | 1 + inventree/sales_order.py | 1 + 6 files changed, 14 insertions(+), 2 deletions(-) diff --git a/inventree/build.py b/inventree/build.py index 9234f17..8bc0c5e 100644 --- a/inventree/build.py +++ b/inventree/build.py @@ -6,6 +6,7 @@ class Build( inventree.base.AttachmentMixin, + inventree.base.ParameterMixin, inventree.base.StatusMixin, inventree.base.MetadataMixin, inventree.report.ReportPrintingMixin, diff --git a/inventree/company.py b/inventree/company.py index fc08fd7..dbf7730 100644 --- a/inventree/company.py +++ b/inventree/company.py @@ -22,7 +22,10 @@ class Address(inventree.base.InventreeObject): MIN_API_VERSION = 126 -class Company(inventree.base.ImageMixin, inventree.base.MetadataMixin, inventree.base.InventreeObject): +class Company( + inventree.base.AttachmentMixin, + inventree.base.ParameterMixin, + inventree.base.ImageMixin, inventree.base.MetadataMixin, inventree.base.InventreeObject): """ Class representing the Company database model """ URL = 'company/' @@ -97,7 +100,10 @@ def createReturnOrder(self, **kwargs): return inventree.order.ReturnOrder.create(self._api, data=kwargs) -class SupplierPart(inventree.base.BarcodeMixin, inventree.base.BulkDeleteMixin, inventree.base.MetadataMixin, inventree.base.InventreeObject): +class SupplierPart( + inventree.base.AttachmentMixin, + inventree.base.ParameterMixin, + inventree.base.BarcodeMixin, inventree.base.BulkDeleteMixin, inventree.base.MetadataMixin, inventree.base.InventreeObject): """Class representing the SupplierPart database model - Implements the BulkDeleteMixin @@ -113,6 +119,7 @@ def getPriceBreaks(self): class ManufacturerPart( inventree.base.AttachmentMixin, + inventree.base.ParameterMixin, inventree.base.BulkDeleteMixin, inventree.base.MetadataMixin, inventree.base.InventreeObject, diff --git a/inventree/part.py b/inventree/part.py index 7284290..1cf42a6 100644 --- a/inventree/part.py +++ b/inventree/part.py @@ -60,6 +60,7 @@ def getCategoryParameterTemplates(self, fetch_parent: bool = True) -> list: class Part( inventree.base.AttachmentMixin, + inventree.base.ParameterMixin, inventree.base.BarcodeMixin, inventree.base.MetadataMixin, inventree.base.ImageMixin, diff --git a/inventree/purchase_order.py b/inventree/purchase_order.py index 812ff9a..02c4233 100644 --- a/inventree/purchase_order.py +++ b/inventree/purchase_order.py @@ -10,6 +10,7 @@ class PurchaseOrder( inventree.base.AttachmentMixin, + inventree.base.ParameterMixin, inventree.base.MetadataMixin, inventree.base.StatusMixin, inventree.report.ReportPrintingMixin, diff --git a/inventree/return_order.py b/inventree/return_order.py index d2be36f..7534a22 100644 --- a/inventree/return_order.py +++ b/inventree/return_order.py @@ -11,6 +11,7 @@ class ReturnOrder( inventree.base.AttachmentMixin, + inventree.base.ParameterMixin, inventree.base.MetadataMixin, inventree.base.StatusMixin, inventree.report.ReportPrintingMixin, diff --git a/inventree/sales_order.py b/inventree/sales_order.py index c3affe9..411d311 100644 --- a/inventree/sales_order.py +++ b/inventree/sales_order.py @@ -11,6 +11,7 @@ class SalesOrder( inventree.base.AttachmentMixin, + inventree.base.ParameterMixin, inventree.base.MetadataMixin, inventree.base.StatusMixin, inventree.report.ReportPrintingMixin, From 02ffa418637ab9bc437d4790f50ff42adb1c0027 Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Mon, 1 Dec 2025 22:03:04 +1100 Subject: [PATCH 03/14] Add logic for fetching parameters based on API version --- inventree/base.py | 12 ++++++++++++ inventree/part.py | 28 +++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/inventree/base.py b/inventree/base.py index b7afe1c..fcd7262 100644 --- a/inventree/base.py +++ b/inventree/base.py @@ -552,6 +552,15 @@ class Parameter(BulkDeleteMixin, InventreeObject): MIN_API_VERSION = 429 +class ParameterTemplate(InventreeObject): + """Class representing a parameter template object.""" + + URL = "parameter/template/" + + # Ref: https://github.com/inventree/InvenTree/pull/10699 + MIN_API_VERSION = 429 + + class ParameterMixin: """Mixin class which allows a model class to interact with parameters. @@ -561,6 +570,9 @@ class ParameterMixin: def getParameters(self): """Return a list of parameters associated with this object.""" + if self._api.get_api_version() < Parameter.MIN_API_VERSION: + raise NotImplementedError(f"Server API Version ({self._api.api_version}) is too old for ParameterMixin, which requires API version >= {Parameter.MIN_API_VERSION}") + return Parameter.list( self._api, model_type=self.getModelType(), diff --git a/inventree/part.py b/inventree/part.py index 1cf42a6..168f705 100644 --- a/inventree/part.py +++ b/inventree/part.py @@ -109,7 +109,12 @@ def getStockItems(self, **kwargs): def getParameters(self): """ Return parameters associated with this part """ - return Parameter.list(self._api, part=self.pk) + + if self._api.get_api_version() < inventree.base.Parameter.MIN_API_VERSION: + # Return legacy PartParameter objects + return PartParameter.list(self._api, part=self.pk) + + return super().getParameters() def getRelated(self): """ Return related parts associated with this part """ @@ -265,17 +270,30 @@ def add_related(cls, api, part1, part2): return api.post(cls.URL, data) -class Parameter(inventree.base.InventreeObject): - """class representing the Parameter database model """ +class PartParameter(inventree.base.InventreeObject): + """Legacy class representing the PartParameter database model. + + This has now been replaced with the generic Parameter model. + + Ref: https://github.com/inventree/InvenTree/pull/10699 + """ URL = 'part/parameter/' + MAX_API_VERSION = 428 + def getunits(self): """ Get the units for this parameter """ return self._data['template_detail']['units'] -class ParameterTemplate(inventree.base.InventreeObject): - """ class representing the Parameter Template database model""" +class PartParameterTemplate(inventree.base.InventreeObject): + """Legacy class representing the PartParameterTemplate database model. + + This has now been replaced with the generic ParameterTemplate model. + + Ref: https://github.com/inventree/InvenTree/pull/10699 + """ URL = 'part/parameter/template/' + MAX_API_VERSION = 428 From fbbb37fe9bd9d01ee003cdba0f5487301c1f4d1b Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Mon, 1 Dec 2025 22:07:01 +1100 Subject: [PATCH 04/14] Updated unit tests --- test/test_part.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/test/test_part.py b/test/test_part.py index c16e35e..f51bcab 100644 --- a/test/test_part.py +++ b/test/test_part.py @@ -15,11 +15,11 @@ from test_api import InvenTreeTestCase # noqa: E402 -from inventree.base import Attachment # noqa: E402 +from inventree.base import Attachment, Parameter, ParameterTemplate # noqa: E402 from inventree.company import SupplierPart # noqa: E402 from inventree.part import InternalPrice # noqa: E402 -from inventree.part import (BomItem, Parameter, # noqa: E402 - ParameterTemplate, Part, +from inventree.part import (BomItem, PartParameter, # noqa: E402 + Part, PartCategory, PartCategoryParameterTemplate, PartRelated, PartTestTemplate) from inventree.stock import StockItem # noqa: E402 @@ -186,11 +186,15 @@ def test_part_get_functions(self): 'getBomItems': BomItem, 'isUsedIn': BomItem, 'getStockItems': StockItem, - 'getParameters': Parameter, 'getRelated': PartRelated, 'getInternalPriceList': InternalPrice, } + if self.api.api_version >= Parameter.MIN_API_VERSION: + functions['getParameters'] = Parameter + else: + functions['getParameters'] = PartParameter + if self.api.api_version >= Attachment.MIN_API_VERSION: functions['getAttachments'] = Attachment @@ -567,9 +571,11 @@ def test_set_price(self): self.assertEqual(ip_price_clean, test_price) def test_parameters(self): - """ - Test setting and getting Part parameter templates, as well as parameter values - """ + """Test setting and getting PartParameterTemplates, as well as PartParameter values.""" + + # Skip test if modernized Parameter API is not supported + if self.api.api_version < Parameter.MIN_API_VERSION: + return # Count number of existing Parameter Templates existingTemplates = len(ParameterTemplate.list(self.api)) From be4486efba44ee8399985f89a350cb78ce722b2b Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Mon, 1 Dec 2025 22:10:29 +1100 Subject: [PATCH 05/14] Fix class type --- .github/workflows/ci.yaml | 2 +- inventree/part.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f3acf4d..c5b41ea 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -27,7 +27,7 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: [3.9] + python-version: [3.11] steps: - name: Checkout Code diff --git a/inventree/part.py b/inventree/part.py index 168f705..16f5b50 100644 --- a/inventree/part.py +++ b/inventree/part.py @@ -24,7 +24,7 @@ def getCategory(self): def getTemplate(self): """Return the referenced ParameterTemplate instance""" - return ParameterTemplate(self._api, self.parameter_template) + return PartParameterTemplate(self._api, self.parameter_template) class PartCategory(inventree.base.MetadataMixin, inventree.base.InventreeObject): From 0c5918aae98b5a92734aff004eb97d7c13722726 Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Mon, 1 Dec 2025 22:18:45 +1100 Subject: [PATCH 06/14] pep checks --- inventree/company.py | 11 +++++++++-- setup.cfg | 2 +- test/test_part.py | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/inventree/company.py b/inventree/company.py index dbf7730..a5fb46f 100644 --- a/inventree/company.py +++ b/inventree/company.py @@ -25,7 +25,10 @@ class Address(inventree.base.InventreeObject): class Company( inventree.base.AttachmentMixin, inventree.base.ParameterMixin, - inventree.base.ImageMixin, inventree.base.MetadataMixin, inventree.base.InventreeObject): + inventree.base.ImageMixin, + inventree.base.MetadataMixin, + inventree.base.InventreeObject +): """ Class representing the Company database model """ URL = 'company/' @@ -103,7 +106,11 @@ def createReturnOrder(self, **kwargs): class SupplierPart( inventree.base.AttachmentMixin, inventree.base.ParameterMixin, - inventree.base.BarcodeMixin, inventree.base.BulkDeleteMixin, inventree.base.MetadataMixin, inventree.base.InventreeObject): + inventree.base.BarcodeMixin, + inventree.base.BulkDeleteMixin, + inventree.base.MetadataMixin, + inventree.base.InventreeObject +): """Class representing the SupplierPart database model - Implements the BulkDeleteMixin diff --git a/setup.cfg b/setup.cfg index d59997b..e3ab9f2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -6,5 +6,5 @@ ignore = # - E501 - line too long (82 characters) E501 N802 -exclude = .git,__pycache__,inventree_server,dist,build,test.py +exclude = .git,.eggs,__pycache__,inventree_server,dist,build,test.py max-complexity = 20 diff --git a/test/test_part.py b/test/test_part.py index f51bcab..64f89f5 100644 --- a/test/test_part.py +++ b/test/test_part.py @@ -15,7 +15,7 @@ from test_api import InvenTreeTestCase # noqa: E402 -from inventree.base import Attachment, Parameter, ParameterTemplate # noqa: E402 +from inventree.base import Attachment, Parameter, ParameterTemplate # noqa: E402 from inventree.company import SupplierPart # noqa: E402 from inventree.part import InternalPrice # noqa: E402 from inventree.part import (BomItem, PartParameter, # noqa: E402 @@ -192,7 +192,7 @@ def test_part_get_functions(self): if self.api.api_version >= Parameter.MIN_API_VERSION: functions['getParameters'] = Parameter - else: + else: functions['getParameters'] = PartParameter if self.api.api_version >= Attachment.MIN_API_VERSION: From a92f9ccf29291cc71d074a4b3795b15953cf4dfc Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Mon, 1 Dec 2025 22:51:45 +1100 Subject: [PATCH 07/14] Fix unit tests --- inventree/base.py | 2 +- inventree/part.py | 2 +- test/test_part.py | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/inventree/base.py b/inventree/base.py index fcd7262..535231a 100644 --- a/inventree/base.py +++ b/inventree/base.py @@ -570,7 +570,7 @@ class ParameterMixin: def getParameters(self): """Return a list of parameters associated with this object.""" - if self._api.get_api_version() < Parameter.MIN_API_VERSION: + if self._api.api_version < Parameter.MIN_API_VERSION: raise NotImplementedError(f"Server API Version ({self._api.api_version}) is too old for ParameterMixin, which requires API version >= {Parameter.MIN_API_VERSION}") return Parameter.list( diff --git a/inventree/part.py b/inventree/part.py index 16f5b50..7f7dd5e 100644 --- a/inventree/part.py +++ b/inventree/part.py @@ -110,7 +110,7 @@ def getStockItems(self, **kwargs): def getParameters(self): """ Return parameters associated with this part """ - if self._api.get_api_version() < inventree.base.Parameter.MIN_API_VERSION: + if self._api.api_version < inventree.base.Parameter.MIN_API_VERSION: # Return legacy PartParameter objects return PartParameter.list(self._api, part=self.pk) diff --git a/test/test_part.py b/test/test_part.py index 64f89f5..53f76ed 100644 --- a/test/test_part.py +++ b/test/test_part.py @@ -130,6 +130,10 @@ def test_caps(self): def test_part_category_parameter_templates(self): """Unit tests for the PartCategoryParameterTemplate model""" + # Ignore these tests for "legacy" Parameter API + if self.api.api_version < Parameter.MIN_API_VERSION: + return + electronics = PartCategory(self.api, pk=3) # Ensure there are some parameter templates associated with this category From add8203cb73e3111532762920dba55cfb4121fb4 Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Tue, 2 Dec 2025 08:55:47 +1100 Subject: [PATCH 08/14] Fix for ManufacturerPartParameter --- inventree/company.py | 9 ++++-- test/test_company.py | 71 -------------------------------------------- 2 files changed, 7 insertions(+), 73 deletions(-) diff --git a/inventree/company.py b/inventree/company.py index a5fb46f..a48bac4 100644 --- a/inventree/company.py +++ b/inventree/company.py @@ -144,16 +144,21 @@ def getParameters(self, **kwargs): GET a list of all ManufacturerPartParameter objects for this ManufacturerPart """ - return ManufacturerPartParameter.list(self._api, manufacturer_part=self.pk, **kwargs) + # Support legacy API version which uses a different endpoint + if self._api.api_version < inventree.base.Parameter.MIN_API_VERSION: + return ManufacturerPartParameter.list(self._api, manufacturer_part=self.pk, **kwargs) + return super().getParameters(**kwargs) class ManufacturerPartParameter(inventree.base.BulkDeleteMixin, inventree.base.InventreeObject): """Class representing the ManufacturerPartParameter database model. - - Implements the BulkDeleteMixin + Note: This class was removed in API version 418 and later. + Ref: https://github.com/inventree/InvenTree/pull/10699 """ URL = 'company/part/manufacturer/parameter/' + MAX_API_VERSION = 428 class SupplierPriceBreak(inventree.base.InventreeObject): diff --git a/test/test_company.py b/test/test_company.py index bb05156..dda7bd7 100644 --- a/test/test_company.py +++ b/test/test_company.py @@ -127,77 +127,6 @@ def test_manufacturer_part_create(self): man_parts = company.ManufacturerPart.list(self.api, manufacturer=manufacturer.pk) self.assertEqual(len(man_parts), n + 1) - def test_manufacturer_part_parameters(self): - """ - Test that we can create, retrieve and edit ManufacturerPartParameter objects - """ - - n = len(company.ManufacturerPart.list(self.api)) - - mpn = f"XYZ-12345678-{n}" - - # First, create a new ManufacturerPart - part = company.ManufacturerPart.create(self.api, { - 'manufacturer': 6, - 'part': 1, - 'MPN': mpn, - }) - - self.assertIsNotNone(part) - self.assertEqual(len(company.ManufacturerPart.list(self.api)), n + 1) - - # Part should (initially) not have any parameters - self.assertEqual(len(part.getParameters()), 0) - - # Now, let's create some! - for idx in range(10): - - parameter = company.ManufacturerPartParameter.create(self.api, { - 'manufacturer_part': part.pk, - 'name': f"param {idx}", - 'value': f"{idx}", - }) - - self.assertIsNotNone(parameter) - - # Now should have 10 unique parameters - self.assertEqual(len(part.getParameters()), 10) - - # Attempt to create a duplicate parameter - with self.assertRaises(HTTPError): - company.ManufacturerPartParameter.create(self.api, { - 'manufacturer_part': part.pk, - 'name': 'param 0', - 'value': 'some value', - }) - - self.assertEqual(len(part.getParameters()), 10) - - # Test that we can edit a ManufacturerPartParameter - parameter = part.getParameters()[0] - - self.assertEqual(parameter.value, '0') - - parameter['value'] = 'new value' - parameter.save() - - self.assertEqual(parameter.value, 'new value') - - parameter['value'] = 'dummy value' - parameter.reload() - - self.assertEqual(parameter.value, 'new value') - - # Test that the "list" function works correctly - results = company.ManufacturerPartParameter.list(self.api) - self.assertGreaterEqual(len(results), 10) - - results = company.ManufacturerPartParameter.list(self.api, name='param 1') - self.assertGreaterEqual(len(results), 1) - - results = company.ManufacturerPartParameter.list(self.api, manufacturer_part=part.pk) - self.assertGreaterEqual(len(results), 10) - def test_supplier_part_create(self): """ Test that we can create SupplierPart objects via the API From cf70099e917d8161bbd2de853ee09a8c3b3f1788 Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Tue, 2 Dec 2025 09:00:49 +1100 Subject: [PATCH 09/14] Support optional filtering kwargs --- inventree/base.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/inventree/base.py b/inventree/base.py index 535231a..05d4206 100644 --- a/inventree/base.py +++ b/inventree/base.py @@ -506,13 +506,14 @@ def download(self, destination, **kwargs): class AttachmentMixin: """Mixin class which allows a model class to interact with attachments.""" - def getAttachments(self): + def getAttachments(self, **kwargs): """Return a list of attachments associated with this object.""" return Attachment.list( self._api, model_type=self.getModelType(), - model_id=self.pk + model_id=self.pk, + **kwargs ) def uploadAttachment(self, attachment, comment=""): @@ -567,7 +568,7 @@ class ParameterMixin: Ref: https://github.com/inventree/InvenTree/pull/10699 """ - def getParameters(self): + def getParameters(self, **kwargs): """Return a list of parameters associated with this object.""" if self._api.api_version < Parameter.MIN_API_VERSION: @@ -576,7 +577,8 @@ def getParameters(self): return Parameter.list( self._api, model_type=self.getModelType(), - model_id=self.pk + model_id=self.pk, + **kwargs ) From 0f8b121aa0dc67d27a95b57d8bbf9e7ed8f1bc19 Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Tue, 2 Dec 2025 09:16:02 +1100 Subject: [PATCH 10/14] Style fixes --- inventree/company.py | 1 + test/test_company.py | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/inventree/company.py b/inventree/company.py index a48bac4..29f43c9 100644 --- a/inventree/company.py +++ b/inventree/company.py @@ -150,6 +150,7 @@ def getParameters(self, **kwargs): return super().getParameters(**kwargs) + class ManufacturerPartParameter(inventree.base.BulkDeleteMixin, inventree.base.InventreeObject): """Class representing the ManufacturerPartParameter database model. diff --git a/test/test_company.py b/test/test_company.py index dda7bd7..db8d4a8 100644 --- a/test/test_company.py +++ b/test/test_company.py @@ -3,8 +3,6 @@ import os import sys -from requests.exceptions import HTTPError - try: import Image except ImportError: From 658ae1c35a6fbd5e4c0bc141a975465143223b8f Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Tue, 2 Dec 2025 09:37:40 +1100 Subject: [PATCH 11/14] Specify model type --- test/test_part.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/test_part.py b/test/test_part.py index 53f76ed..45db27d 100644 --- a/test/test_part.py +++ b/test/test_part.py @@ -589,7 +589,15 @@ def test_parameters(self): parametertemplate = ParameterTemplate.create(self.api, data={'units': "kg A"}) # Now create a proper parameter template - parametertemplate = ParameterTemplate.create(self.api, data={'name': f'Test parameter no {existingTemplates}', 'units': "kg A"}) + parametertemplate = ParameterTemplate.create( + self.api, + data={ + 'name': f'Test parameter no {existingTemplates}', + 'description': 'A parameter template for testing', + 'model_type': None, + 'units': "kg A" + } + ) # result should not be None self.assertIsNotNone(parametertemplate) From 4d62e07112d1e1b7b61d4898b8312cca1f7759ef Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Tue, 2 Dec 2025 14:35:40 +1100 Subject: [PATCH 12/14] Fix unit test --- test/test_part.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test_part.py b/test/test_part.py index 45db27d..6cb55c2 100644 --- a/test/test_part.py +++ b/test/test_part.py @@ -613,14 +613,14 @@ def test_parameters(self): # Define parameter value for this part - without all required values with self.assertRaises(HTTPError): - Parameter.create(self.api, data={'part': p.pk, 'template': parametertemplate.pk}) + Parameter.create(self.api, data={'model_type': 'part', 'model_id': p.pk, 'template': parametertemplate.pk}) # Define parameter value for this part - without all required values with self.assertRaises(HTTPError): - Parameter.create(self.api, data={'part': p.pk, 'data': 10}) + Parameter.create(self.api, data={'model_type': 'part', 'model_id': p.pk, 'data': 10}) # Define w. required values - integer - param = Parameter.create(self.api, data={'part': p.pk, 'template': parametertemplate.pk, 'data': 10}) + param = Parameter.create(self.api, data={'model_type': 'part', 'model_id': p.pk, 'template': parametertemplate.pk, 'data': 10}) # Unit should be equal self.assertEqual(param.getunits(), 'kg A') @@ -631,7 +631,7 @@ def test_parameters(self): # Same parameter for same part - should fail # Define w. required values - string with self.assertRaises(HTTPError): - Parameter.create(self.api, data={'part': p.pk, 'template': parametertemplate.pk, 'data': 'String value'}) + Parameter.create(self.api, data={'model_type': 'part', 'model_id': p.pk, 'template': parametertemplate.pk, 'data': 'String value'}) # Number of parameters should be one higher than before self.assertEqual(len(p.getParameters()), existingParameters + 1) From 93a862648c4c5ff69fc8848b1a2c53e8ba806543 Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Tue, 2 Dec 2025 15:18:17 +1100 Subject: [PATCH 13/14] Simplify unit test --- test/test_part.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/test_part.py b/test/test_part.py index 6cb55c2..a48523f 100644 --- a/test/test_part.py +++ b/test/test_part.py @@ -622,9 +622,6 @@ def test_parameters(self): # Define w. required values - integer param = Parameter.create(self.api, data={'model_type': 'part', 'model_id': p.pk, 'template': parametertemplate.pk, 'data': 10}) - # Unit should be equal - self.assertEqual(param.getunits(), 'kg A') - # result should not be None self.assertIsNotNone(param) From 3e8a7ec9a091abbcdd6c625624ad9bf776aff7a9 Mon Sep 17 00:00:00 2001 From: "Asterix\\Oliver" Date: Tue, 2 Dec 2025 16:20:10 +1100 Subject: [PATCH 14/14] Fix references for PartCategoryParameterTemplate --- inventree/part.py | 9 ++++++++- test/test_part.py | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/inventree/part.py b/inventree/part.py index 7f7dd5e..8e94240 100644 --- a/inventree/part.py +++ b/inventree/part.py @@ -24,7 +24,14 @@ def getCategory(self): def getTemplate(self): """Return the referenced ParameterTemplate instance""" - return PartParameterTemplate(self._api, self.parameter_template) + + template_id = getattr(self, 'template', None) or getattr(self, 'parameter_template', None) + + if self._api.api_version < inventree.base.ParameterTemplate.MIN_API_VERSION: + # Return legacy PartParameterTemplate object + return PartParameterTemplate(self._api, template_id) + + return inventree.base.ParameterTemplate(self._api, template_id) class PartCategory(inventree.base.MetadataMixin, inventree.base.InventreeObject): diff --git a/test/test_part.py b/test/test_part.py index a48523f..d2e2513 100644 --- a/test/test_part.py +++ b/test/test_part.py @@ -150,7 +150,7 @@ def test_part_category_parameter_templates(self): self.api, data={ 'category': electronics.pk, - 'parameter_template': template.pk, + 'template': template.pk, 'default_value': 123, } )