mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-11-04 15:15:42 +00:00 
			
		
		
		
	Support image uploads in the "notes" markdown fields (#4615)
* Support image uploads in the "notes" markdown fields - Implemented using the existing EasyMDE library - Copy / paste support - Drag / drop support * Remove debug message * Updated API version * Better UX when saving notes * Pin PIP version (for testing) * Bug fixes - Fix typo - Use correct serializer type * Add unit testing * Update role permissions * Typo fix * Update migration file * Adds a notes mixin class to be used for refactoring * Refactor existing models with notes to use the new mixin * Add helper function for finding all model types with a certain mixin * Refactor barcode plugin to use new method * Typo fix * Add daily task to delete old / unused notes * Bug fix for barcode refactoring * Add unit testing for function
This commit is contained in:
		
							
								
								
									
										19
									
								
								InvenTree/part/migrations/0105_alter_part_notes.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								InvenTree/part/migrations/0105_alter_part_notes.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
# Generated by Django 3.2.18 on 2023-04-19 00:37
 | 
			
		||||
 | 
			
		||||
import InvenTree.fields
 | 
			
		||||
from django.db import migrations
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('part', '0104_alter_part_description'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.AlterField(
 | 
			
		||||
            model_name='part',
 | 
			
		||||
            name='notes',
 | 
			
		||||
            field=InvenTree.fields.InvenTreeNotesField(blank=True, help_text='Markdown notes (optional)', max_length=50000, null=True, verbose_name='Notes'),
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
@@ -43,10 +43,11 @@ from common.models import InvenTreeSetting
 | 
			
		||||
from common.settings import currency_code_default
 | 
			
		||||
from company.models import SupplierPart
 | 
			
		||||
from InvenTree import helpers, validators
 | 
			
		||||
from InvenTree.fields import InvenTreeNotesField, InvenTreeURLField
 | 
			
		||||
from InvenTree.fields import InvenTreeURLField
 | 
			
		||||
from InvenTree.helpers import decimal2money, decimal2string, normalize
 | 
			
		||||
from InvenTree.models import (DataImportMixin, InvenTreeAttachment,
 | 
			
		||||
                              InvenTreeBarcodeMixin, InvenTreeTree)
 | 
			
		||||
                              InvenTreeBarcodeMixin, InvenTreeNotesMixin,
 | 
			
		||||
                              InvenTreeTree)
 | 
			
		||||
from InvenTree.status_codes import (BuildStatus, PurchaseOrderStatus,
 | 
			
		||||
                                    SalesOrderStatus)
 | 
			
		||||
from order import models as OrderModels
 | 
			
		||||
@@ -338,7 +339,7 @@ class PartManager(TreeManager):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@cleanup.ignore
 | 
			
		||||
class Part(InvenTreeBarcodeMixin, MetadataMixin, MPTTModel):
 | 
			
		||||
class Part(InvenTreeBarcodeMixin, InvenTreeNotesMixin, MetadataMixin, MPTTModel):
 | 
			
		||||
    """The Part object represents an abstract part, the 'concept' of an actual entity.
 | 
			
		||||
 | 
			
		||||
    An actual physical instance of a Part is a StockItem which is treated separately.
 | 
			
		||||
@@ -1016,8 +1017,6 @@ class Part(InvenTreeBarcodeMixin, MetadataMixin, MPTTModel):
 | 
			
		||||
        verbose_name=_('Virtual'),
 | 
			
		||||
        help_text=_('Is this a virtual part, such as a software product or license?'))
 | 
			
		||||
 | 
			
		||||
    notes = InvenTreeNotesField(help_text=_('Part notes'))
 | 
			
		||||
 | 
			
		||||
    bom_checksum = models.CharField(max_length=128, blank=True, verbose_name=_('BOM checksum'), help_text=_('Stored BOM checksum'))
 | 
			
		||||
 | 
			
		||||
    bom_checked_by = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user