From 18ea4b51e5d502a512ac18c514c782935d93f173 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Fri, 3 Jul 2026 14:56:21 +0000 Subject: [PATCH] implement note duplication serializers --- src/backend/InvenTree/build/serializers.py | 7 ++++++- src/backend/InvenTree/company/serializers.py | 17 ++++++++++++++--- src/backend/InvenTree/order/serializers.py | 18 ++++++++++++++++-- src/backend/InvenTree/part/serializers.py | 3 +-- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/backend/InvenTree/build/serializers.py b/src/backend/InvenTree/build/serializers.py index 09f4d5217a..c9098ad921 100644 --- a/src/backend/InvenTree/build/serializers.py +++ b/src/backend/InvenTree/build/serializers.py @@ -191,7 +191,9 @@ class BuildSerializer( return queryset - duplicate = DuplicateOptionsSerializer(Build.objects.all(), copy_parameters=True) + duplicate = DuplicateOptionsSerializer( + Build.objects.all(), copy_parameters=True, copy_notes=True + ) def __init__(self, *args, **kwargs): """Determine if extra serializer fields are required.""" @@ -212,6 +214,9 @@ class BuildSerializer( if duplicate.get('copy_parameters', True): instance.copy_parameters_from(original) + if duplicate.get('copy_notes', True): + instance.copy_notes_from(original) + return instance def validate_reference(self, reference): diff --git a/src/backend/InvenTree/company/serializers.py b/src/backend/InvenTree/company/serializers.py index 058e3e2e6a..2ca5c59754 100644 --- a/src/backend/InvenTree/company/serializers.py +++ b/src/backend/InvenTree/company/serializers.py @@ -193,7 +193,9 @@ class CompanySerializer( parameters = common.filters.enable_parameters_filter() - duplicate = DuplicateOptionsSerializer(Company.objects.all(), copy_parameters=True) + duplicate = DuplicateOptionsSerializer( + Company.objects.all(), copy_parameters=True, copy_notes=True + ) @transaction.atomic def create(self, validated_data): @@ -208,6 +210,9 @@ class CompanySerializer( if duplicate.get('copy_parameters', True): instance.copy_parameters_from(original) + if duplicate.get('copy_notes', True): + instance.copy_notes_from(original) + return instance @@ -262,7 +267,7 @@ class ManufacturerPartSerializer( parameters = common.filters.enable_parameters_filter() duplicate = DuplicateOptionsSerializer( - ManufacturerPart.objects.all(), copy_parameters=True + ManufacturerPart.objects.all(), copy_parameters=True, copy_notes=True ) @transaction.atomic @@ -278,6 +283,9 @@ class ManufacturerPartSerializer( if duplicate.get('copy_parameters', True): instance.copy_parameters_from(original) + if duplicate.get('copy_notes', True): + instance.copy_notes_from(original) + return instance part_detail = OptionalField( @@ -535,7 +543,7 @@ class SupplierPartSerializer( updated = serializers.DateTimeField(allow_null=True, read_only=True) duplicate = DuplicateOptionsSerializer( - SupplierPart.objects.all(), copy_parameters=True + SupplierPart.objects.all(), copy_parameters=True, copy_notes=True ) @staticmethod @@ -594,6 +602,9 @@ class SupplierPartSerializer( if duplicate.get('copy_parameters', True): supplier_part.copy_parameters_from(original) + if duplicate.get('copy_notes', True): + supplier_part.copy_notes_from(original) + return supplier_part diff --git a/src/backend/InvenTree/order/serializers.py b/src/backend/InvenTree/order/serializers.py index 5abc85515a..5831ca2470 100644 --- a/src/backend/InvenTree/order/serializers.py +++ b/src/backend/InvenTree/order/serializers.py @@ -269,6 +269,9 @@ class AbstractOrderSerializer( if duplicate.get('copy_parameters', False): instance.copy_parameters_from(original) + if duplicate.get('copy_notes', False): + instance.copy_notes_from(original) + return instance @@ -407,6 +410,7 @@ class PurchaseOrderSerializer( copy_lines=True, copy_extra_lines=True, copy_parameters=True, + copy_notes=True, ) @staticmethod @@ -1095,6 +1099,7 @@ class SalesOrderSerializer( copy_lines=True, copy_extra_lines=True, copy_parameters=True, + copy_notes=True, ) @staticmethod @@ -1472,7 +1477,9 @@ class SalesOrderShipmentSerializer( tags = common.filters.enable_tags_filter() duplicate = DuplicateOptionsSerializer( - order.models.SalesOrderShipment.objects.all(), copy_parameters=True + order.models.SalesOrderShipment.objects.all(), + copy_parameters=True, + copy_notes=True, ) @transaction.atomic @@ -1488,6 +1495,9 @@ class SalesOrderShipmentSerializer( if duplicate.get('copy_parameters', True): instance.copy_parameters_from(original) + if duplicate.get('copy_notes', True): + instance.copy_notes_from(original) + return instance @@ -2186,6 +2196,7 @@ class ReturnOrderSerializer( order.models.ReturnOrder.objects.all(), copy_extra_lines=True, copy_parameters=True, + copy_notes=True, ) @staticmethod @@ -2476,7 +2487,10 @@ class TransferOrderSerializer( # Note: TransferOrder does not have "extra" line items duplicate = DuplicateOptionsSerializer( - order.models.TransferOrder.objects.all(), copy_lines=True, copy_parameters=True + order.models.TransferOrder.objects.all(), + copy_lines=True, + copy_parameters=True, + copy_notes=True, ) @staticmethod diff --git a/src/backend/InvenTree/part/serializers.py b/src/backend/InvenTree/part/serializers.py index 8f27bbb71c..760f3e56ee 100644 --- a/src/backend/InvenTree/part/serializers.py +++ b/src/backend/InvenTree/part/serializers.py @@ -1046,8 +1046,7 @@ class PartSerializer( instance.copy_bom_from(original) if duplicate.get('copy_notes', False): - instance.notes = original.notes - instance.save() + instance.copy_notes_from(original) if duplicate.get('copy_image', False): instance.image = original.image