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

View File

@ -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.

View File

@ -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",
),
]

View File

@ -80,7 +80,6 @@ class Build(
InvenTree.models.InvenTreeAttachmentMixin,
InvenTree.models.InvenTreeBarcodeMixin,
InvenTree.models.InvenTreeNoteMixin,
InvenTree.models.InvenTreeNotesMixin,
InvenTree.models.ReferenceIndexingMixin,
StateTransitionMixin,
StatusCodeMixin,

View File

@ -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',
)

View File

@ -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",
),
]

View File

@ -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,
):

View File

@ -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',

View File

@ -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",
),
]

View File

@ -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,

View File

@ -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,

View File

@ -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",
),
]

View File

@ -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,

View File

@ -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',

View File

@ -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",
),
]

View File

@ -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,

View File

@ -356,7 +356,6 @@ class StockItemSerializer(
'in_stock',
'is_building',
'link',
'notes',
'owner',
'packaging',
'parent',