From 256cae228fa451c440626c66fc0cff350c0ce32d Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 25 May 2026 12:43:12 +0000 Subject: [PATCH] Remove legacy "notes" field from older models --- src/backend/InvenTree/InvenTree/models.py | 65 +++---------------- .../migrations/0059_remove_build_notes.py | 18 +++++ src/backend/InvenTree/build/models.py | 1 - src/backend/InvenTree/build/serializers.py | 6 -- ..._remove_manufacturerpart_notes_and_more.py | 26 ++++++++ src/backend/InvenTree/company/models.py | 3 - src/backend/InvenTree/company/serializers.py | 11 +--- ...notes_remove_returnorder_notes_and_more.py | 34 ++++++++++ src/backend/InvenTree/order/models.py | 2 - src/backend/InvenTree/order/serializers.py | 15 +---- .../part/migrations/0151_remove_part_notes.py | 18 +++++ src/backend/InvenTree/part/models.py | 1 - src/backend/InvenTree/part/serializers.py | 2 - .../migrations/0120_remove_stockitem_notes.py | 18 +++++ src/backend/InvenTree/stock/models.py | 1 - src/backend/InvenTree/stock/serializers.py | 1 - 16 files changed, 126 insertions(+), 96 deletions(-) create mode 100644 src/backend/InvenTree/build/migrations/0059_remove_build_notes.py create mode 100644 src/backend/InvenTree/company/migrations/0080_remove_company_notes_remove_manufacturerpart_notes_and_more.py create mode 100644 src/backend/InvenTree/order/migrations/0120_remove_purchaseorder_notes_remove_returnorder_notes_and_more.py create mode 100644 src/backend/InvenTree/part/migrations/0151_remove_part_notes.py create mode 100644 src/backend/InvenTree/stock/migrations/0120_remove_stockitem_notes.py diff --git a/src/backend/InvenTree/InvenTree/models.py b/src/backend/InvenTree/InvenTree/models.py index 99b42d5469..ce5be5e25c 100644 --- a/src/backend/InvenTree/InvenTree/models.py +++ b/src/backend/InvenTree/InvenTree/models.py @@ -27,7 +27,6 @@ from stdimage.models import StdImageField import common.settings import InvenTree.exceptions -import InvenTree.fields import InvenTree.format import InvenTree.helpers import InvenTree.helpers_model @@ -664,16 +663,15 @@ class InvenTreeNoteMixin(InvenTreePermissionCheckMixin): 'common.Note', content_type_field='model_type', object_id_field='model_id' ) - # TODO: Un-comment this once the InvenTreeNotesMixin class is removed - # @property - # def notes(self) -> QuerySet: - # """Return a queryset containing all notes for this model.""" - # # Check the query cache for pre-fetched parameters - # if cache := getattr(self, '_prefetched_objects_cache', None): - # if 'notes_list' in cache: - # return cache['notes_list'] + @property + def notes(self) -> QuerySet: + """Return a queryset containing all notes for this model.""" + # Check the query cache for pre-fetched parameters + if cache := getattr(self, '_prefetched_objects_cache', None): + if 'notes_list' in cache: + return cache['notes_list'] - # return self.notes_list.all() + return self.notes_list.all() def delete(self, *args, **kwargs): """Handle the deletion of a model instance. @@ -1284,53 +1282,6 @@ class PathStringMixin(models.Model): ] -class InvenTreeNotesMixin(models.Model): - """A mixin class for adding notes functionality to a model class. - - The following fields are added to any model which implements this mixin: - - - notes : A text field for storing notes - """ - - # TODO: THIS MIXIN IS TO BE REMOVED IN FAVOUR OF THE GENERIC RELATIONSHIP TO THE Note MODEL - - class Meta: - """Metaclass options for this mixin. - - Note: abstract must be true, as this is only a mixin, not a separate table - """ - - abstract = True - - def delete(self, *args, **kwargs): - """Custom delete method for InvenTreeNotesMixin. - - - Before deleting the object, check if there are any uploaded images associated with it. - - If so, delete the notes first - """ - from common.models import NotesImage - - images = NotesImage.objects.filter( - model_type=self.__class__.__name__.lower(), model_id=self.pk - ) - - if images.exists(): - logger.info( - 'Deleting %s uploaded images associated with %s <%s>', - images.count(), - self.__class__.__name__, - self.pk, - ) - - images.delete() - - super().delete(*args, **kwargs) - - notes = InvenTree.fields.InvenTreeNotesField( - verbose_name=_('Notes'), help_text=_('Markdown notes (optional)') - ) - - class InvenTreeBarcodeMixin(models.Model): """A mixin class for adding barcode functionality to a model class. diff --git a/src/backend/InvenTree/build/migrations/0059_remove_build_notes.py b/src/backend/InvenTree/build/migrations/0059_remove_build_notes.py new file mode 100644 index 0000000000..fff4c5c18a --- /dev/null +++ b/src/backend/InvenTree/build/migrations/0059_remove_build_notes.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.14 on 2026-05-25 12:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("build", "0058_buildline_consumed"), + ("common", "0046_remove_notesimage_model_id_and_more") + ] + + operations = [ + migrations.RemoveField( + model_name="build", + name="notes", + ), + ] diff --git a/src/backend/InvenTree/build/models.py b/src/backend/InvenTree/build/models.py index 088492775f..8767884d58 100644 --- a/src/backend/InvenTree/build/models.py +++ b/src/backend/InvenTree/build/models.py @@ -80,7 +80,6 @@ class Build( InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNoteMixin, - InvenTree.models.InvenTreeNotesMixin, InvenTree.models.ReferenceIndexingMixin, StateTransitionMixin, StatusCodeMixin, diff --git a/src/backend/InvenTree/build/serializers.py b/src/backend/InvenTree/build/serializers.py index d7cc0e5729..fccfa62d9c 100644 --- a/src/backend/InvenTree/build/serializers.py +++ b/src/backend/InvenTree/build/serializers.py @@ -34,7 +34,6 @@ from InvenTree.serializers import ( FilterableSerializerMixin, InvenTreeDecimalField, InvenTreeModelSerializer, - NotesFieldMixin, OptionalField, ) from stock.generators import generate_batch_code @@ -53,7 +52,6 @@ from .status_codes import BuildStatus class BuildSerializer( FilterableSerializerMixin, - NotesFieldMixin, DataImportExportSerializerMixin, InvenTreeCustomStatusSerializerMixin, InvenTreeModelSerializer, @@ -91,7 +89,6 @@ class BuildSerializer( 'status_custom_key', 'target_date', 'take_from', - 'notes', 'link', 'issued_by', 'issued_by_detail', @@ -1503,12 +1500,9 @@ class BuildLineSerializer( # Defer expensive fields which we do not need for this serializer queryset = queryset.defer( - 'build__notes', 'build__metadata', 'bom_item__metadata', - 'bom_item__part__notes', 'bom_item__part__metadata', - 'bom_item__sub_part__notes', 'bom_item__sub_part__metadata', ) diff --git a/src/backend/InvenTree/company/migrations/0080_remove_company_notes_remove_manufacturerpart_notes_and_more.py b/src/backend/InvenTree/company/migrations/0080_remove_company_notes_remove_manufacturerpart_notes_and_more.py new file mode 100644 index 0000000000..48bd558d06 --- /dev/null +++ b/src/backend/InvenTree/company/migrations/0080_remove_company_notes_remove_manufacturerpart_notes_and_more.py @@ -0,0 +1,26 @@ +# Generated by Django 5.2.14 on 2026-05-25 12:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("company", "0079_auto_20260212_1054"), + ("common", "0046_remove_notesimage_model_id_and_more") + ] + + operations = [ + migrations.RemoveField( + model_name="company", + name="notes", + ), + migrations.RemoveField( + model_name="manufacturerpart", + name="notes", + ), + migrations.RemoveField( + model_name="supplierpart", + name="notes", + ), + ] diff --git a/src/backend/InvenTree/company/models.py b/src/backend/InvenTree/company/models.py index d8049d3df7..a485787c40 100644 --- a/src/backend/InvenTree/company/models.py +++ b/src/backend/InvenTree/company/models.py @@ -80,7 +80,6 @@ class Company( InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeParameterMixin, InvenTree.models.InvenTreeNoteMixin, - InvenTree.models.InvenTreeNotesMixin, report.mixins.InvenTreeReportMixin, InvenTree.models.InvenTreeImageMixin, InvenTree.models.InvenTreeMetadataModel, @@ -488,7 +487,6 @@ class ManufacturerPart( InvenTree.models.InvenTreeParameterMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNoteMixin, - InvenTree.models.InvenTreeNotesMixin, InvenTree.models.InvenTreeMetadataModel, ): """Represents a unique part as provided by a Manufacturer Each ManufacturerPart is identified by a MPN (Manufacturer Part Number) Each ManufacturerPart is also linked to a Part object. A Part may be available from multiple manufacturers. @@ -606,7 +604,6 @@ class SupplierPart( InvenTree.models.MetadataMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNoteMixin, - InvenTree.models.InvenTreeNotesMixin, common.models.MetaMixin, InvenTree.models.InvenTreeModel, ): diff --git a/src/backend/InvenTree/company/serializers.py b/src/backend/InvenTree/company/serializers.py index 0ff71a39bc..63644b25d0 100644 --- a/src/backend/InvenTree/company/serializers.py +++ b/src/backend/InvenTree/company/serializers.py @@ -21,7 +21,6 @@ from InvenTree.serializers import ( InvenTreeModelSerializer, InvenTreeMoneySerializer, InvenTreeTagModelSerializer, - NotesFieldMixin, OptionalField, ) @@ -106,10 +105,7 @@ class AddressBriefSerializer(InvenTreeModelSerializer): @register_importer() class CompanySerializer( - FilterableSerializerMixin, - DataImportExportSerializerMixin, - NotesFieldMixin, - InvenTreeModelSerializer, + FilterableSerializerMixin, DataImportExportSerializerMixin, InvenTreeModelSerializer ): """Serializer for Company object (full detail).""" @@ -137,7 +133,6 @@ class CompanySerializer( 'is_customer', 'is_manufacturer', 'is_supplier', - 'notes', 'parts_supplied', 'parts_manufactured', 'primary_address', @@ -208,7 +203,6 @@ class ManufacturerPartSerializer( FilterableSerializerMixin, DataImportExportSerializerMixin, InvenTreeTagModelSerializer, - NotesFieldMixin, ): """Serializer for ManufacturerPart object.""" @@ -227,7 +221,6 @@ class ManufacturerPartSerializer( 'MPN', 'link', 'barcode_hash', - 'notes', 'tags', 'parameters', ] @@ -309,7 +302,6 @@ class SupplierPartSerializer( FilterableSerializerMixin, DataImportExportSerializerMixin, InvenTreeTagModelSerializer, - NotesFieldMixin, ): """Serializer for SupplierPart object.""" @@ -354,7 +346,6 @@ class SupplierPartSerializer( 'supplier', 'supplier_detail', 'updated', - 'notes', 'part_detail', 'tags', 'price_breaks', diff --git a/src/backend/InvenTree/order/migrations/0120_remove_purchaseorder_notes_remove_returnorder_notes_and_more.py b/src/backend/InvenTree/order/migrations/0120_remove_purchaseorder_notes_remove_returnorder_notes_and_more.py new file mode 100644 index 0000000000..709c58f038 --- /dev/null +++ b/src/backend/InvenTree/order/migrations/0120_remove_purchaseorder_notes_remove_returnorder_notes_and_more.py @@ -0,0 +1,34 @@ +# Generated by Django 5.2.14 on 2026-05-25 12:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("order", "0119_transferorderlineitem_line_int"), + ("common", "0046_remove_notesimage_model_id_and_more") + ] + + operations = [ + migrations.RemoveField( + model_name="purchaseorder", + name="notes", + ), + migrations.RemoveField( + model_name="returnorder", + name="notes", + ), + migrations.RemoveField( + model_name="salesorder", + name="notes", + ), + migrations.RemoveField( + model_name="salesordershipment", + name="notes", + ), + migrations.RemoveField( + model_name="transferorder", + name="notes", + ), + ] diff --git a/src/backend/InvenTree/order/models.py b/src/backend/InvenTree/order/models.py index f377f207b6..adcf57282a 100644 --- a/src/backend/InvenTree/order/models.py +++ b/src/backend/InvenTree/order/models.py @@ -300,7 +300,6 @@ class Order( InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNoteMixin, - InvenTree.models.InvenTreeNotesMixin, report.mixins.InvenTreeReportMixin, InvenTree.models.MetadataMixin, InvenTree.models.ReferenceIndexingMixin, @@ -2331,7 +2330,6 @@ class SalesOrderShipment( InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNoteMixin, - InvenTree.models.InvenTreeNotesMixin, report.mixins.InvenTreeReportMixin, InvenTree.models.MetadataMixin, InvenTree.models.InvenTreeModel, diff --git a/src/backend/InvenTree/order/serializers.py b/src/backend/InvenTree/order/serializers.py index c2d1b909ac..07f3ff955a 100644 --- a/src/backend/InvenTree/order/serializers.py +++ b/src/backend/InvenTree/order/serializers.py @@ -36,7 +36,6 @@ from InvenTree.serializers import ( InvenTreeDecimalField, InvenTreeModelSerializer, InvenTreeMoneySerializer, - NotesFieldMixin, OptionalField, ) from order.status_codes import ( @@ -104,9 +103,9 @@ class AbstractOrderSerializer( ): """Abstract serializer class which provides fields common to all order types.""" - export_exclude_fields = ['notes', 'duplicate'] + export_exclude_fields = ['duplicate'] - import_exclude_fields = ['notes', 'duplicate'] + import_exclude_fields = ['duplicate'] # Number of line items in this order line_items = serializers.IntegerField( @@ -224,7 +223,6 @@ class AbstractOrderSerializer( 'status', 'status_text', 'status_custom_key', - 'notes', 'barcode_hash', 'overdue', 'duplicate', @@ -373,7 +371,6 @@ class AbstractExtraLineMeta: @register_importer() class PurchaseOrderSerializer( - NotesFieldMixin, TotalPriceMixin, InvenTreeCustomStatusSerializerMixin, AbstractOrderSerializer, @@ -1060,7 +1057,6 @@ class PurchaseOrderReceiveSerializer(serializers.Serializer): @register_importer() class SalesOrderSerializer( - NotesFieldMixin, TotalPriceMixin, InvenTreeCustomStatusSerializerMixin, AbstractOrderSerializer, @@ -1360,10 +1356,7 @@ class SalesOrderLineItemSerializer( @register_importer() class SalesOrderShipmentSerializer( - DataImportExportSerializerMixin, - FilterableSerializerMixin, - NotesFieldMixin, - InvenTreeModelSerializer, + DataImportExportSerializerMixin, FilterableSerializerMixin, InvenTreeModelSerializer ): """Serializer for the SalesOrderShipment class.""" @@ -2015,7 +2008,6 @@ class SalesOrderExtraLineSerializer( @register_importer() class ReturnOrderSerializer( - NotesFieldMixin, InvenTreeCustomStatusSerializerMixin, AbstractOrderSerializer, TotalPriceMixin, @@ -2303,7 +2295,6 @@ class ReturnOrderExtraLineSerializer( @register_importer() class TransferOrderSerializer( - NotesFieldMixin, InvenTreeCustomStatusSerializerMixin, AbstractOrderSerializer, InvenTreeModelSerializer, diff --git a/src/backend/InvenTree/part/migrations/0151_remove_part_notes.py b/src/backend/InvenTree/part/migrations/0151_remove_part_notes.py new file mode 100644 index 0000000000..267642afc2 --- /dev/null +++ b/src/backend/InvenTree/part/migrations/0151_remove_part_notes.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.14 on 2026-05-25 12:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("part", "0150_part_maximum_stock"), + ("common", "0046_remove_notesimage_model_id_and_more") + ] + + operations = [ + migrations.RemoveField( + model_name="part", + name="notes", + ), + ] diff --git a/src/backend/InvenTree/part/models.py b/src/backend/InvenTree/part/models.py index aa1e207176..65c9831152 100644 --- a/src/backend/InvenTree/part/models.py +++ b/src/backend/InvenTree/part/models.py @@ -466,7 +466,6 @@ class Part( InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNoteMixin, - InvenTree.models.InvenTreeNotesMixin, report.mixins.InvenTreeReportMixin, InvenTree.models.InvenTreeImageMixin, InvenTree.models.MetadataMixin, diff --git a/src/backend/InvenTree/part/serializers.py b/src/backend/InvenTree/part/serializers.py index ccbce76492..2c55fba004 100644 --- a/src/backend/InvenTree/part/serializers.py +++ b/src/backend/InvenTree/part/serializers.py @@ -577,7 +577,6 @@ class DefaultLocationSerializer(InvenTree.serializers.InvenTreeModelSerializer): class PartSerializer( InvenTree.serializers.FilterableSerializerMixin, DataImportExportSerializerMixin, - InvenTree.serializers.NotesFieldMixin, InvenTree.serializers.InvenTreeTaggitSerializer, InvenTree.serializers.InvenTreeModelSerializer, ): @@ -619,7 +618,6 @@ class PartSerializer( 'minimum_stock', 'maximum_stock', 'name', - 'notes', 'parameters', 'pk', 'purchaseable', diff --git a/src/backend/InvenTree/stock/migrations/0120_remove_stockitem_notes.py b/src/backend/InvenTree/stock/migrations/0120_remove_stockitem_notes.py new file mode 100644 index 0000000000..1145ce9de6 --- /dev/null +++ b/src/backend/InvenTree/stock/migrations/0120_remove_stockitem_notes.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.14 on 2026-05-25 12:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("stock", "0119_alter_stockitemtestresult_date"), + ("common", "0046_remove_notesimage_model_id_and_more") + ] + + operations = [ + migrations.RemoveField( + model_name="stockitem", + name="notes", + ), + ] diff --git a/src/backend/InvenTree/stock/models.py b/src/backend/InvenTree/stock/models.py index 3d7538dee9..350fd86ec2 100644 --- a/src/backend/InvenTree/stock/models.py +++ b/src/backend/InvenTree/stock/models.py @@ -404,7 +404,6 @@ class StockItem( InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNoteMixin, - InvenTree.models.InvenTreeNotesMixin, StatusCodeMixin, report.mixins.InvenTreeReportMixin, common.models.MetaMixin, diff --git a/src/backend/InvenTree/stock/serializers.py b/src/backend/InvenTree/stock/serializers.py index 570b4f7e51..952bd6b6b7 100644 --- a/src/backend/InvenTree/stock/serializers.py +++ b/src/backend/InvenTree/stock/serializers.py @@ -356,7 +356,6 @@ class StockItemSerializer( 'in_stock', 'is_building', 'link', - 'notes', 'owner', 'packaging', 'parent',