From e3c975e15726ac19118a750ed1c82e3c39bb81c8 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 25 Nov 2025 07:31:13 +0000 Subject: [PATCH] Fix code for copying parameters from category --- src/backend/InvenTree/part/models.py | 58 +++++++++++-------- .../InvenTree/report/templatetags/report.py | 3 + 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/backend/InvenTree/part/models.py b/src/backend/InvenTree/part/models.py index aad14ac62d..db10a21557 100644 --- a/src/backend/InvenTree/part/models.py +++ b/src/backend/InvenTree/part/models.py @@ -14,6 +14,7 @@ from typing import cast from django.conf import settings from django.contrib.auth.models import User +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models, transaction @@ -2417,26 +2418,37 @@ class Part( This function is normally called when the Part is first created. """ - # TODO: https://github.com/inventree/InvenTree/pull/10699 - # TODO: Reimplement this - # for template in templates: - # # First ensure that the part doesn't have that parameter - # if PartParameter.objects.filter( - # part=instance, template=template.parameter_template - # ).exists(): - # continue + from common.models import Parameter - # try: - # PartParameter.create( - # part=instance, - # template=template.parameter_template, - # data=template.default_value, - # save=True, - # ) - # except IntegrityError: - # logger.exception( - # 'Could not create new PartParameter for part %s', instance - # ) + from .models import PartCategoryParameterTemplate + + categories = category.get_ancestors(include_self=True) + + category_templates = PartCategoryParameterTemplate.objects.filter( + category__in=categories + ).order_by('-category__level') + + parameters = [] + content_type = ContentType.objects.get_for_model(Part) + + for category_template in category_templates: + # First ensure that the part doesn't have that parameter + if self.parameters_list.filter( + template=category_template.template + ).exists(): + continue + + parameters.append( + Parameter( + template=category_template.template, + model_type=content_type, + model_id=self.pk, + data=category_template.default_value, + ) + ) + + if len(parameters) > 0: + Parameter.objects.bulk_create(parameters) def getTestTemplates( self, required=None, include_parent: bool = True, enabled=None @@ -3734,8 +3746,8 @@ class PartCategoryParameterTemplate(InvenTree.models.InvenTreeMetadataModel): def __str__(self): """String representation of a PartCategoryParameterTemplate (admin interface).""" if self.default_value: - return f'{self.category.name} | {self.parameter_template.name} | {self.default_value}' - return f'{self.category.name} | {self.parameter_template.name}' + return f'{self.category.name} | {self.template.name} | {self.default_value}' + return f'{self.category.name} | {self.template.name}' def clean(self): """Validate this PartCategoryParameterTemplate instance. @@ -3753,11 +3765,11 @@ class PartCategoryParameterTemplate(InvenTree.models.InvenTreeMetadataModel): and get_global_setting( 'PART_PARAMETER_ENFORCE_UNITS', True, cache=False, create=False ) - and self.parameter_template.units + and self.template.units ): try: InvenTree.conversion.convert_physical_value( - self.default_value, self.parameter_template.units + self.default_value, self.template.units ) except ValidationError as e: raise ValidationError({'default_value': e.message}) diff --git a/src/backend/InvenTree/report/templatetags/report.py b/src/backend/InvenTree/report/templatetags/report.py index 13a5db4650..146bcd6539 100644 --- a/src/backend/InvenTree/report/templatetags/report.py +++ b/src/backend/InvenTree/report/templatetags/report.py @@ -343,6 +343,9 @@ def parameter( Returns: A Parameter object, or None if not found """ + if not hasattr(instance, 'parameters'): + raise TypeError("parameter tag requires a Model with 'parameters' attribute") + return ( instance.parameters.prefetch_related('template') .filter(template__name=parameter_name)