Remove legacy "notes" field from older models

This commit is contained in:
Oliver Walters
2026-05-25 12:43:12 +00:00
parent be132bf21d
commit 256cae228f
16 changed files with 126 additions and 96 deletions
+8 -57
View File
@@ -27,7 +27,6 @@ from stdimage.models import StdImageField
import common.settings import common.settings
import InvenTree.exceptions import InvenTree.exceptions
import InvenTree.fields
import InvenTree.format import InvenTree.format
import InvenTree.helpers import InvenTree.helpers
import InvenTree.helpers_model import InvenTree.helpers_model
@@ -664,16 +663,15 @@ class InvenTreeNoteMixin(InvenTreePermissionCheckMixin):
'common.Note', content_type_field='model_type', object_id_field='model_id' 'common.Note', content_type_field='model_type', object_id_field='model_id'
) )
# TODO: Un-comment this once the InvenTreeNotesMixin class is removed @property
# @property def notes(self) -> QuerySet:
# def notes(self) -> QuerySet: """Return a queryset containing all notes for this model."""
# """Return a queryset containing all notes for this model.""" # Check the query cache for pre-fetched parameters
# # Check the query cache for pre-fetched parameters if cache := getattr(self, '_prefetched_objects_cache', None):
# if cache := getattr(self, '_prefetched_objects_cache', None): if 'notes_list' in cache:
# if 'notes_list' in cache: return cache['notes_list']
# return cache['notes_list']
# return self.notes_list.all() return self.notes_list.all()
def delete(self, *args, **kwargs): def delete(self, *args, **kwargs):
"""Handle the deletion of a model instance. """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): class InvenTreeBarcodeMixin(models.Model):
"""A mixin class for adding barcode functionality to a model class. """A mixin class for adding barcode functionality to a model class.
@@ -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",
),
]
-1
View File
@@ -80,7 +80,6 @@ class Build(
InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeAttachmentMixin,
InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeBarcodeMixin,
InvenTree.models.InvenTreeNoteMixin, InvenTree.models.InvenTreeNoteMixin,
InvenTree.models.InvenTreeNotesMixin,
InvenTree.models.ReferenceIndexingMixin, InvenTree.models.ReferenceIndexingMixin,
StateTransitionMixin, StateTransitionMixin,
StatusCodeMixin, StatusCodeMixin,
@@ -34,7 +34,6 @@ from InvenTree.serializers import (
FilterableSerializerMixin, FilterableSerializerMixin,
InvenTreeDecimalField, InvenTreeDecimalField,
InvenTreeModelSerializer, InvenTreeModelSerializer,
NotesFieldMixin,
OptionalField, OptionalField,
) )
from stock.generators import generate_batch_code from stock.generators import generate_batch_code
@@ -53,7 +52,6 @@ from .status_codes import BuildStatus
class BuildSerializer( class BuildSerializer(
FilterableSerializerMixin, FilterableSerializerMixin,
NotesFieldMixin,
DataImportExportSerializerMixin, DataImportExportSerializerMixin,
InvenTreeCustomStatusSerializerMixin, InvenTreeCustomStatusSerializerMixin,
InvenTreeModelSerializer, InvenTreeModelSerializer,
@@ -91,7 +89,6 @@ class BuildSerializer(
'status_custom_key', 'status_custom_key',
'target_date', 'target_date',
'take_from', 'take_from',
'notes',
'link', 'link',
'issued_by', 'issued_by',
'issued_by_detail', 'issued_by_detail',
@@ -1503,12 +1500,9 @@ class BuildLineSerializer(
# Defer expensive fields which we do not need for this serializer # Defer expensive fields which we do not need for this serializer
queryset = queryset.defer( queryset = queryset.defer(
'build__notes',
'build__metadata', 'build__metadata',
'bom_item__metadata', 'bom_item__metadata',
'bom_item__part__notes',
'bom_item__part__metadata', 'bom_item__part__metadata',
'bom_item__sub_part__notes',
'bom_item__sub_part__metadata', 'bom_item__sub_part__metadata',
) )
@@ -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",
),
]
-3
View File
@@ -80,7 +80,6 @@ class Company(
InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeAttachmentMixin,
InvenTree.models.InvenTreeParameterMixin, InvenTree.models.InvenTreeParameterMixin,
InvenTree.models.InvenTreeNoteMixin, InvenTree.models.InvenTreeNoteMixin,
InvenTree.models.InvenTreeNotesMixin,
report.mixins.InvenTreeReportMixin, report.mixins.InvenTreeReportMixin,
InvenTree.models.InvenTreeImageMixin, InvenTree.models.InvenTreeImageMixin,
InvenTree.models.InvenTreeMetadataModel, InvenTree.models.InvenTreeMetadataModel,
@@ -488,7 +487,6 @@ class ManufacturerPart(
InvenTree.models.InvenTreeParameterMixin, InvenTree.models.InvenTreeParameterMixin,
InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeBarcodeMixin,
InvenTree.models.InvenTreeNoteMixin, InvenTree.models.InvenTreeNoteMixin,
InvenTree.models.InvenTreeNotesMixin,
InvenTree.models.InvenTreeMetadataModel, 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. """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.MetadataMixin,
InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeBarcodeMixin,
InvenTree.models.InvenTreeNoteMixin, InvenTree.models.InvenTreeNoteMixin,
InvenTree.models.InvenTreeNotesMixin,
common.models.MetaMixin, common.models.MetaMixin,
InvenTree.models.InvenTreeModel, InvenTree.models.InvenTreeModel,
): ):
+1 -10
View File
@@ -21,7 +21,6 @@ from InvenTree.serializers import (
InvenTreeModelSerializer, InvenTreeModelSerializer,
InvenTreeMoneySerializer, InvenTreeMoneySerializer,
InvenTreeTagModelSerializer, InvenTreeTagModelSerializer,
NotesFieldMixin,
OptionalField, OptionalField,
) )
@@ -106,10 +105,7 @@ class AddressBriefSerializer(InvenTreeModelSerializer):
@register_importer() @register_importer()
class CompanySerializer( class CompanySerializer(
FilterableSerializerMixin, FilterableSerializerMixin, DataImportExportSerializerMixin, InvenTreeModelSerializer
DataImportExportSerializerMixin,
NotesFieldMixin,
InvenTreeModelSerializer,
): ):
"""Serializer for Company object (full detail).""" """Serializer for Company object (full detail)."""
@@ -137,7 +133,6 @@ class CompanySerializer(
'is_customer', 'is_customer',
'is_manufacturer', 'is_manufacturer',
'is_supplier', 'is_supplier',
'notes',
'parts_supplied', 'parts_supplied',
'parts_manufactured', 'parts_manufactured',
'primary_address', 'primary_address',
@@ -208,7 +203,6 @@ class ManufacturerPartSerializer(
FilterableSerializerMixin, FilterableSerializerMixin,
DataImportExportSerializerMixin, DataImportExportSerializerMixin,
InvenTreeTagModelSerializer, InvenTreeTagModelSerializer,
NotesFieldMixin,
): ):
"""Serializer for ManufacturerPart object.""" """Serializer for ManufacturerPart object."""
@@ -227,7 +221,6 @@ class ManufacturerPartSerializer(
'MPN', 'MPN',
'link', 'link',
'barcode_hash', 'barcode_hash',
'notes',
'tags', 'tags',
'parameters', 'parameters',
] ]
@@ -309,7 +302,6 @@ class SupplierPartSerializer(
FilterableSerializerMixin, FilterableSerializerMixin,
DataImportExportSerializerMixin, DataImportExportSerializerMixin,
InvenTreeTagModelSerializer, InvenTreeTagModelSerializer,
NotesFieldMixin,
): ):
"""Serializer for SupplierPart object.""" """Serializer for SupplierPart object."""
@@ -354,7 +346,6 @@ class SupplierPartSerializer(
'supplier', 'supplier',
'supplier_detail', 'supplier_detail',
'updated', 'updated',
'notes',
'part_detail', 'part_detail',
'tags', 'tags',
'price_breaks', 'price_breaks',
@@ -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",
),
]
-2
View File
@@ -300,7 +300,6 @@ class Order(
InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeAttachmentMixin,
InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeBarcodeMixin,
InvenTree.models.InvenTreeNoteMixin, InvenTree.models.InvenTreeNoteMixin,
InvenTree.models.InvenTreeNotesMixin,
report.mixins.InvenTreeReportMixin, report.mixins.InvenTreeReportMixin,
InvenTree.models.MetadataMixin, InvenTree.models.MetadataMixin,
InvenTree.models.ReferenceIndexingMixin, InvenTree.models.ReferenceIndexingMixin,
@@ -2331,7 +2330,6 @@ class SalesOrderShipment(
InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeAttachmentMixin,
InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeBarcodeMixin,
InvenTree.models.InvenTreeNoteMixin, InvenTree.models.InvenTreeNoteMixin,
InvenTree.models.InvenTreeNotesMixin,
report.mixins.InvenTreeReportMixin, report.mixins.InvenTreeReportMixin,
InvenTree.models.MetadataMixin, InvenTree.models.MetadataMixin,
InvenTree.models.InvenTreeModel, InvenTree.models.InvenTreeModel,
+3 -12
View File
@@ -36,7 +36,6 @@ from InvenTree.serializers import (
InvenTreeDecimalField, InvenTreeDecimalField,
InvenTreeModelSerializer, InvenTreeModelSerializer,
InvenTreeMoneySerializer, InvenTreeMoneySerializer,
NotesFieldMixin,
OptionalField, OptionalField,
) )
from order.status_codes import ( from order.status_codes import (
@@ -104,9 +103,9 @@ class AbstractOrderSerializer(
): ):
"""Abstract serializer class which provides fields common to all order types.""" """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 # Number of line items in this order
line_items = serializers.IntegerField( line_items = serializers.IntegerField(
@@ -224,7 +223,6 @@ class AbstractOrderSerializer(
'status', 'status',
'status_text', 'status_text',
'status_custom_key', 'status_custom_key',
'notes',
'barcode_hash', 'barcode_hash',
'overdue', 'overdue',
'duplicate', 'duplicate',
@@ -373,7 +371,6 @@ class AbstractExtraLineMeta:
@register_importer() @register_importer()
class PurchaseOrderSerializer( class PurchaseOrderSerializer(
NotesFieldMixin,
TotalPriceMixin, TotalPriceMixin,
InvenTreeCustomStatusSerializerMixin, InvenTreeCustomStatusSerializerMixin,
AbstractOrderSerializer, AbstractOrderSerializer,
@@ -1060,7 +1057,6 @@ class PurchaseOrderReceiveSerializer(serializers.Serializer):
@register_importer() @register_importer()
class SalesOrderSerializer( class SalesOrderSerializer(
NotesFieldMixin,
TotalPriceMixin, TotalPriceMixin,
InvenTreeCustomStatusSerializerMixin, InvenTreeCustomStatusSerializerMixin,
AbstractOrderSerializer, AbstractOrderSerializer,
@@ -1360,10 +1356,7 @@ class SalesOrderLineItemSerializer(
@register_importer() @register_importer()
class SalesOrderShipmentSerializer( class SalesOrderShipmentSerializer(
DataImportExportSerializerMixin, DataImportExportSerializerMixin, FilterableSerializerMixin, InvenTreeModelSerializer
FilterableSerializerMixin,
NotesFieldMixin,
InvenTreeModelSerializer,
): ):
"""Serializer for the SalesOrderShipment class.""" """Serializer for the SalesOrderShipment class."""
@@ -2015,7 +2008,6 @@ class SalesOrderExtraLineSerializer(
@register_importer() @register_importer()
class ReturnOrderSerializer( class ReturnOrderSerializer(
NotesFieldMixin,
InvenTreeCustomStatusSerializerMixin, InvenTreeCustomStatusSerializerMixin,
AbstractOrderSerializer, AbstractOrderSerializer,
TotalPriceMixin, TotalPriceMixin,
@@ -2303,7 +2295,6 @@ class ReturnOrderExtraLineSerializer(
@register_importer() @register_importer()
class TransferOrderSerializer( class TransferOrderSerializer(
NotesFieldMixin,
InvenTreeCustomStatusSerializerMixin, InvenTreeCustomStatusSerializerMixin,
AbstractOrderSerializer, AbstractOrderSerializer,
InvenTreeModelSerializer, InvenTreeModelSerializer,
@@ -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",
),
]
-1
View File
@@ -466,7 +466,6 @@ class Part(
InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeAttachmentMixin,
InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeBarcodeMixin,
InvenTree.models.InvenTreeNoteMixin, InvenTree.models.InvenTreeNoteMixin,
InvenTree.models.InvenTreeNotesMixin,
report.mixins.InvenTreeReportMixin, report.mixins.InvenTreeReportMixin,
InvenTree.models.InvenTreeImageMixin, InvenTree.models.InvenTreeImageMixin,
InvenTree.models.MetadataMixin, InvenTree.models.MetadataMixin,
@@ -577,7 +577,6 @@ class DefaultLocationSerializer(InvenTree.serializers.InvenTreeModelSerializer):
class PartSerializer( class PartSerializer(
InvenTree.serializers.FilterableSerializerMixin, InvenTree.serializers.FilterableSerializerMixin,
DataImportExportSerializerMixin, DataImportExportSerializerMixin,
InvenTree.serializers.NotesFieldMixin,
InvenTree.serializers.InvenTreeTaggitSerializer, InvenTree.serializers.InvenTreeTaggitSerializer,
InvenTree.serializers.InvenTreeModelSerializer, InvenTree.serializers.InvenTreeModelSerializer,
): ):
@@ -619,7 +618,6 @@ class PartSerializer(
'minimum_stock', 'minimum_stock',
'maximum_stock', 'maximum_stock',
'name', 'name',
'notes',
'parameters', 'parameters',
'pk', 'pk',
'purchaseable', 'purchaseable',
@@ -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",
),
]
-1
View File
@@ -404,7 +404,6 @@ class StockItem(
InvenTree.models.InvenTreeAttachmentMixin, InvenTree.models.InvenTreeAttachmentMixin,
InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeBarcodeMixin,
InvenTree.models.InvenTreeNoteMixin, InvenTree.models.InvenTreeNoteMixin,
InvenTree.models.InvenTreeNotesMixin,
StatusCodeMixin, StatusCodeMixin,
report.mixins.InvenTreeReportMixin, report.mixins.InvenTreeReportMixin,
common.models.MetaMixin, common.models.MetaMixin,
@@ -356,7 +356,6 @@ class StockItemSerializer(
'in_stock', 'in_stock',
'is_building', 'is_building',
'link', 'link',
'notes',
'owner', 'owner',
'packaging', 'packaging',
'parent', 'parent',