diff --git a/InvenTree/InvenTree/fields.py b/InvenTree/InvenTree/fields.py index 9f5d63312b1..d521d48cc73 100644 --- a/InvenTree/InvenTree/fields.py +++ b/InvenTree/InvenTree/fields.py @@ -157,3 +157,19 @@ def formfield(self, **kwargs): defaults.update(kwargs) return super().formfield(**kwargs) + + +class InvenTreeNotesField(models.TextField): + """Custom implementation of a 'notes' field""" + + # Maximum character limit for the various 'notes' fields + NOTES_MAX_LENGTH = 50000 + + def __init__(self, **kwargs): + """Configure default initial values for this field""" + kwargs['max_length'] = self.NOTES_MAX_LENGTH + kwargs['verbose_name'] = _('Notes') + kwargs['blank'] = True + kwargs['null'] = True + + super().__init__(**kwargs) diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 9487de5e6ad..e50c8fceaea 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -15,7 +15,6 @@ import socket import string import sys -from datetime import datetime import django.conf.locale from django.core.files.storage import default_storage @@ -253,7 +252,6 @@ def _is_true(x): 'import_export', # Import / export tables to file 'django_cleanup.apps.CleanupConfig', # Automatically delete orphaned MEDIA files 'mptt', # Modified Preorder Tree Traversal - 'markdownx', # Markdown editing 'markdownify', # Markdown template rendering 'django_admin_shell', # Python shell for the admin interface 'djmoney', # django-money integration @@ -875,10 +873,6 @@ def _is_true(x): REMOTE_LOGIN = get_setting('INVENTREE_REMOTE_LOGIN', CONFIG.get('remote_login', False)) REMOTE_LOGIN_HEADER = get_setting('INVENTREE_REMOTE_LOGIN_HEADER', CONFIG.get('remote_login_header', 'REMOTE_USER')) -# Markdownx configuration -# Ref: https://neutronx.github.io/django-markdownx/customization/ -MARKDOWNX_MEDIA_PATH = datetime.now().strftime('markdownx/%Y/%m/%d') - # Markdownify configuration # Ref: https://django-markdownify.readthedocs.io/en/latest/settings.html diff --git a/InvenTree/InvenTree/static/css/color-themes/dark-reader.css b/InvenTree/InvenTree/static/css/color-themes/dark-reader.css index 9a383d4fdec..ef44c7d063d 100644 --- a/InvenTree/InvenTree/static/css/color-themes/dark-reader.css +++ b/InvenTree/InvenTree/static/css/color-themes/dark-reader.css @@ -3539,15 +3539,6 @@ a.ui-button:active, .index-action-selected { background-color: rgb(32, 34, 36); } -.markdownx .row { - border-color: rgb(31, 31, 92); -} -.markdownx-editor { - border-color: rgb(31, 31, 92); -} -.markdownx-preview { - border-color: rgb(31, 31, 92); -} .progress { background-image: initial; background-color: rgb(32, 34, 36); diff --git a/InvenTree/InvenTree/static/css/inventree.css b/InvenTree/InvenTree/static/css/inventree.css index 018697823e7..96409dc9a1d 100644 --- a/InvenTree/InvenTree/static/css/inventree.css +++ b/InvenTree/InvenTree/static/css/inventree.css @@ -63,30 +63,10 @@ main { background-color: #EEEEF5; } -.markdownx .row { - margin: 5px; - padding: 5px; - border: 1px solid #cce; - border-radius: 4px; -} - -.markdownx-editor { - width: 100%; - border: 1px solid #cce; - border-radius: 3px; - padding: 10px; -} - .panel-content { padding: 10px; } -.markdownx-preview { - border: 1px solid #cce; - border-radius: 3px; - padding: 10px; -} - /* Progress bars */ .progress { diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 54bd4dd88d0..2ccbe6d2595 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -126,9 +126,6 @@ re_path(r'^api/', include(apipatterns)), re_path(r'^api-doc/', include_docs_urls(title='InvenTree API')), - - # 3rd party endpoints - re_path(r'^markdownx/', include('markdownx.urls')), ] frontendpatterns = [ diff --git a/InvenTree/build/migrations/0008_auto_20200201_1247.py b/InvenTree/build/migrations/0008_auto_20200201_1247.py index 99e916cd323..ff311ee1848 100644 --- a/InvenTree/build/migrations/0008_auto_20200201_1247.py +++ b/InvenTree/build/migrations/0008_auto_20200201_1247.py @@ -1,7 +1,6 @@ # Generated by Django 2.2.9 on 2020-02-01 12:47 -from django.db import migrations -import markdownx.models +from django.db import migrations, models class Migration(migrations.Migration): @@ -14,6 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='build', name='notes', - field=markdownx.models.MarkdownxField(blank=True, help_text='Extra build notes'), + field=models.TextField(blank=True, help_text='Extra build notes'), ), ] diff --git a/InvenTree/build/migrations/0014_auto_20200425_1243.py b/InvenTree/build/migrations/0014_auto_20200425_1243.py index c8148b6c1bf..af65a12cb31 100644 --- a/InvenTree/build/migrations/0014_auto_20200425_1243.py +++ b/InvenTree/build/migrations/0014_auto_20200425_1243.py @@ -4,7 +4,6 @@ import django.core.validators from django.db import migrations, models import django.db.models.deletion -import markdownx.models import mptt.fields @@ -31,7 +30,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='build', name='notes', - field=markdownx.models.MarkdownxField(blank=True, help_text='Extra build notes', verbose_name='Notes'), + field=models.TextField(blank=True, help_text='Extra build notes', verbose_name='Notes'), ), migrations.AlterField( model_name='build', diff --git a/InvenTree/build/migrations/0035_alter_build_notes.py b/InvenTree/build/migrations/0035_alter_build_notes.py new file mode 100644 index 00000000000..a86570069a4 --- /dev/null +++ b/InvenTree/build/migrations/0035_alter_build_notes.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2022-06-20 07:28 + +import InvenTree.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('build', '0034_alter_build_reference_int'), + ] + + operations = [ + migrations.AlterField( + model_name='build', + name='notes', + field=InvenTree.fields.InvenTreeNotesField(blank=True, help_text='Extra build notes', max_length=50000, null=True, verbose_name='Notes'), + ), + ] diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 3659ad4b52d..9ed09586913 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -16,8 +16,6 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from markdownx.models import MarkdownxField - from mptt.models import MPTTModel, TreeForeignKey from mptt.exceptions import InvalidMove @@ -320,9 +318,8 @@ def get_absolute_url(self): blank=True, help_text=_('Link to external URL') ) - notes = MarkdownxField( - verbose_name=_('Notes'), - blank=True, help_text=_('Extra build notes') + notes = InvenTree.fields.InvenTreeNotesField( + help_text=_('Extra build notes') ) def sub_builds(self, cascade=True): diff --git a/InvenTree/company/migrations/0010_auto_20200201_1231.py b/InvenTree/company/migrations/0010_auto_20200201_1231.py index c5afeae2d15..c3839f68de0 100644 --- a/InvenTree/company/migrations/0010_auto_20200201_1231.py +++ b/InvenTree/company/migrations/0010_auto_20200201_1231.py @@ -1,7 +1,6 @@ # Generated by Django 2.2.9 on 2020-02-01 12:31 -from django.db import migrations -import markdownx.models +from django.db import migrations, models class Migration(migrations.Migration): @@ -14,6 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='company', name='notes', - field=markdownx.models.MarkdownxField(blank=True), + field=models.TextField(blank=True), ), ] diff --git a/InvenTree/company/migrations/0032_auto_20210403_1837.py b/InvenTree/company/migrations/0032_auto_20210403_1837.py index 41b6977d312..d9c83d75ed1 100644 --- a/InvenTree/company/migrations/0032_auto_20210403_1837.py +++ b/InvenTree/company/migrations/0032_auto_20210403_1837.py @@ -5,7 +5,6 @@ import django.core.validators from django.db import migrations, models import django.db.models.deletion -import markdownx.models import stdimage.models @@ -44,7 +43,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='company', name='notes', - field=markdownx.models.MarkdownxField(blank=True, verbose_name='Notes'), + field=models.TextField(blank=True, verbose_name='Notes'), ), migrations.AlterField( model_name='supplierpart', diff --git a/InvenTree/company/migrations/0045_alter_company_notes.py b/InvenTree/company/migrations/0045_alter_company_notes.py new file mode 100644 index 00000000000..3aefa54afd4 --- /dev/null +++ b/InvenTree/company/migrations/0045_alter_company_notes.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2022-06-20 11:23 + +import InvenTree.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('company', '0044_auto_20220607_2204'), + ] + + operations = [ + migrations.AlterField( + model_name='company', + name='notes', + field=InvenTree.fields.InvenTreeNotesField(blank=True, help_text='Company Notes', max_length=50000, null=True, verbose_name='Notes'), + ), + ] diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index 6702761cf8e..1a18d39d147 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -11,12 +11,12 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from markdownx.models import MarkdownxField from moneyed import CURRENCIES from stdimage.models import StdImageField import common.models import common.settings +import InvenTree.fields import InvenTree.validators from common.settings import currency_code_default from InvenTree.fields import InvenTreeURLField @@ -135,7 +135,7 @@ class Meta: verbose_name=_('Image'), ) - notes = MarkdownxField(blank=True, verbose_name=_('Notes')) + notes = InvenTree.fields.InvenTreeNotesField(help_text=_("Company Notes")) is_customer = models.BooleanField(default=False, verbose_name=_('is customer'), help_text=_('Do you sell items to this company?')) diff --git a/InvenTree/order/migrations/0015_auto_20200201_2346.py b/InvenTree/order/migrations/0015_auto_20200201_2346.py index 3407420fc44..f59a05fcfb6 100644 --- a/InvenTree/order/migrations/0015_auto_20200201_2346.py +++ b/InvenTree/order/migrations/0015_auto_20200201_2346.py @@ -1,7 +1,6 @@ # Generated by Django 2.2.9 on 2020-02-01 23:46 -from django.db import migrations -import markdownx.models +from django.db import migrations, models class Migration(migrations.Migration): @@ -14,6 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='purchaseorder', name='notes', - field=markdownx.models.MarkdownxField(blank=True, help_text='Order notes'), + field=models.TextField(blank=True, help_text='Order notes'), ), ] diff --git a/InvenTree/order/migrations/0020_auto_20200420_0940.py b/InvenTree/order/migrations/0020_auto_20200420_0940.py index 59431353ddf..aef57a34377 100644 --- a/InvenTree/order/migrations/0020_auto_20200420_0940.py +++ b/InvenTree/order/migrations/0020_auto_20200420_0940.py @@ -6,7 +6,6 @@ import django.core.validators from django.db import migrations, models import django.db.models.deletion -import markdownx.models class Migration(migrations.Migration): @@ -29,7 +28,7 @@ class Migration(migrations.Migration): ('status', models.PositiveIntegerField(choices=[(10, 'Pending'), (20, 'Placed'), (30, 'Complete'), (40, 'Cancelled'), (50, 'Lost'), (60, 'Returned')], default=10, help_text='Order status')), ('issue_date', models.DateField(blank=True, null=True)), ('complete_date', models.DateField(blank=True, null=True)), - ('notes', markdownx.models.MarkdownxField(blank=True, help_text='Order notes')), + ('notes', models.TextField(blank=True, help_text='Order notes')), ('customer_reference', models.CharField(blank=True, help_text='Customer order reference code', max_length=64)), ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), ('customer', models.ForeignKey(help_text='Customer', limit_choices_to={True, 'is_supplier'}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sales_orders', to='company.Company')), diff --git a/InvenTree/order/migrations/0044_auto_20210404_2016.py b/InvenTree/order/migrations/0044_auto_20210404_2016.py index f683ce0aae9..ef69235545e 100644 --- a/InvenTree/order/migrations/0044_auto_20210404_2016.py +++ b/InvenTree/order/migrations/0044_auto_20210404_2016.py @@ -6,7 +6,6 @@ import django.core.validators from django.db import migrations, models import django.db.models.deletion -import markdownx.models class Migration(migrations.Migration): @@ -43,7 +42,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='purchaseorder', name='notes', - field=markdownx.models.MarkdownxField(blank=True, help_text='Order notes', verbose_name='Notes'), + field=models.TextField(blank=True, help_text='Order notes', verbose_name='Notes'), ), migrations.AlterField( model_name='purchaseorder', @@ -148,7 +147,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='salesorder', name='notes', - field=markdownx.models.MarkdownxField(blank=True, help_text='Order notes', verbose_name='Notes'), + field=models.TextField(blank=True, help_text='Order notes', verbose_name='Notes'), ), migrations.AlterField( model_name='salesorder', diff --git a/InvenTree/order/migrations/0053_salesordershipment.py b/InvenTree/order/migrations/0053_salesordershipment.py index f36895c5ee6..85ab90f46ad 100644 --- a/InvenTree/order/migrations/0053_salesordershipment.py +++ b/InvenTree/order/migrations/0053_salesordershipment.py @@ -4,10 +4,6 @@ from django.db import migrations, models import django.db.models.deletion -import order.models - -import markdownx.models - class Migration(migrations.Migration): @@ -23,7 +19,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('shipment_date', models.DateField(blank=True, help_text='Date of shipment', null=True, verbose_name='Shipment Date')), ('reference', models.CharField(default='1', help_text='Shipment reference', max_length=100, verbose_name='Reference')), - ('notes', markdownx.models.MarkdownxField(blank=True, help_text='Shipment notes', verbose_name='Notes')), + ('notes', models.TextField(blank=True, help_text='Shipment notes', verbose_name='Notes')), ('checked_by', models.ForeignKey(blank=True, help_text='User who checked this shipment', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Checked By')), ('order', models.ForeignKey(help_text='Sales Order', on_delete=django.db.models.deletion.CASCADE, related_name='shipments', to='order.salesorder', verbose_name='Order')), ], diff --git a/InvenTree/order/migrations/0070_auto_20220620_0728.py b/InvenTree/order/migrations/0070_auto_20220620_0728.py new file mode 100644 index 00000000000..660a68fcce5 --- /dev/null +++ b/InvenTree/order/migrations/0070_auto_20220620_0728.py @@ -0,0 +1,29 @@ +# Generated by Django 3.2.13 on 2022-06-20 07:28 + +import InvenTree.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('order', '0069_auto_20220524_0508'), + ] + + operations = [ + migrations.AlterField( + model_name='purchaseorder', + name='notes', + field=InvenTree.fields.InvenTreeNotesField(blank=True, help_text='Order notes', max_length=50000, null=True, verbose_name='Notes'), + ), + migrations.AlterField( + model_name='salesorder', + name='notes', + field=InvenTree.fields.InvenTreeNotesField(blank=True, help_text='Order notes', max_length=50000, null=True, verbose_name='Notes'), + ), + migrations.AlterField( + model_name='salesordershipment', + name='notes', + field=InvenTree.fields.InvenTreeNotesField(blank=True, help_text='Shipment notes', max_length=50000, null=True, verbose_name='Notes'), + ), + ] diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index bdced458c00..2f82d6af958 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -20,7 +20,6 @@ from djmoney.contrib.exchange.exceptions import MissingRate from djmoney.contrib.exchange.models import convert_money from djmoney.money import Money -from markdownx.models import MarkdownxField from mptt.models import TreeForeignKey import InvenTree.helpers @@ -28,7 +27,8 @@ from common.settings import currency_code_default from company.models import Company, SupplierPart from InvenTree.exceptions import log_error -from InvenTree.fields import InvenTreeModelMoneyField, RoundingDecimalField +from InvenTree.fields import (InvenTreeModelMoneyField, InvenTreeNotesField, + RoundingDecimalField) from InvenTree.helpers import (decimal2string, getSetting, increment, notify_responsible) from InvenTree.models import InvenTreeAttachment, ReferenceIndexingMixin @@ -152,7 +152,7 @@ class Meta: related_name='+', ) - notes = MarkdownxField(blank=True, verbose_name=_('Notes'), help_text=_('Order notes')) + notes = InvenTreeNotesField(help_text=_('Order notes')) def get_total_price(self, target_currency=None): """Calculates the total price of all order lines, and converts to the specified target currency. @@ -1210,11 +1210,7 @@ def get_api_url(): default='1', ) - notes = MarkdownxField( - blank=True, - verbose_name=_('Notes'), - help_text=_('Shipment notes'), - ) + notes = InvenTreeNotesField(help_text=_('Shipment notes')) tracking_number = models.CharField( max_length=100, diff --git a/InvenTree/part/migrations/0026_auto_20200131_1022.py b/InvenTree/part/migrations/0026_auto_20200131_1022.py index f3a3af73a44..c0f1ead30b2 100644 --- a/InvenTree/part/migrations/0026_auto_20200131_1022.py +++ b/InvenTree/part/migrations/0026_auto_20200131_1022.py @@ -1,7 +1,6 @@ # Generated by Django 2.2.9 on 2020-01-31 10:22 -from django.db import migrations -import markdownx.models +from django.db import migrations, models class Migration(migrations.Migration): @@ -14,6 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='part', name='notes', - field=markdownx.models.MarkdownxField(help_text='Part notes - supports Markdown formatting'), + field=models.TextField(help_text='Part notes - supports Markdown formatting'), ), ] diff --git a/InvenTree/part/migrations/0029_auto_20200223_0901.py b/InvenTree/part/migrations/0029_auto_20200223_0901.py index 2ed86c51014..c0db32fb606 100644 --- a/InvenTree/part/migrations/0029_auto_20200223_0901.py +++ b/InvenTree/part/migrations/0029_auto_20200223_0901.py @@ -1,7 +1,6 @@ # Generated by Django 2.2.9 on 2020-02-23 09:01 -from django.db import migrations -import markdownx.models +from django.db import migrations, models class Migration(migrations.Migration): @@ -14,6 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='part', name='notes', - field=markdownx.models.MarkdownxField(blank=True, help_text='Part notes - supports Markdown formatting'), + field=models.TextField(blank=True, help_text='Part notes - supports Markdown formatting'), ), ] diff --git a/InvenTree/part/migrations/0048_auto_20200902_1404.py b/InvenTree/part/migrations/0048_auto_20200902_1404.py index bd163fa41d8..4f3584f3c44 100644 --- a/InvenTree/part/migrations/0048_auto_20200902_1404.py +++ b/InvenTree/part/migrations/0048_auto_20200902_1404.py @@ -3,8 +3,6 @@ import InvenTree.fields import InvenTree.validators -import markdownx - from django.db import migrations, models @@ -38,7 +36,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='part', name='notes', - field=markdownx.models.MarkdownxField(blank=True, help_text='Part notes - supports Markdown formatting', null=True), + field=models.TextField(blank=True, help_text='Part notes - supports Markdown formatting', null=True), ), migrations.AlterField( model_name='part', diff --git a/InvenTree/part/migrations/0061_auto_20210103_2313.py b/InvenTree/part/migrations/0061_auto_20210103_2313.py index ca0c2a277f4..502ff7c8e25 100644 --- a/InvenTree/part/migrations/0061_auto_20210103_2313.py +++ b/InvenTree/part/migrations/0061_auto_20210103_2313.py @@ -4,7 +4,6 @@ import InvenTree.validators from django.db import migrations, models import django.db.models.deletion -import markdownx.models import mptt.fields import part.settings @@ -65,7 +64,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='part', name='notes', - field=markdownx.models.MarkdownxField(blank=True, help_text='Part notes - supports Markdown formatting', null=True, verbose_name='Notes'), + field=models.TextField(blank=True, help_text='Part notes - supports Markdown formatting', null=True, verbose_name='Notes'), ), migrations.AlterField( model_name='part', diff --git a/InvenTree/part/migrations/0079_alter_part_notes.py b/InvenTree/part/migrations/0079_alter_part_notes.py new file mode 100644 index 00000000000..7d4cd5b80ac --- /dev/null +++ b/InvenTree/part/migrations/0079_alter_part_notes.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2022-06-20 07:28 + +import InvenTree.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('part', '0078_auto_20220606_0024'), + ] + + operations = [ + migrations.AlterField( + model_name='part', + name='notes', + field=InvenTree.fields.InvenTreeNotesField(blank=True, help_text='Part notes', max_length=50000, null=True, verbose_name='Notes'), + ), + ] diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 219a8f71cfe..4c02ee34f60 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -25,7 +25,6 @@ from djmoney.contrib.exchange.exceptions import MissingRate from djmoney.contrib.exchange.models import convert_money from jinja2 import Template -from markdownx.models import MarkdownxField from mptt.exceptions import InvalidMove from mptt.managers import TreeManager from mptt.models import MPTTModel, TreeForeignKey @@ -41,7 +40,7 @@ from common.settings import currency_code_default from company.models import SupplierPart from InvenTree import helpers, validators -from InvenTree.fields import InvenTreeURLField +from InvenTree.fields import InvenTreeNotesField, InvenTreeURLField from InvenTree.helpers import decimal2money, decimal2string, normalize from InvenTree.models import (DataImportMixin, InvenTreeAttachment, InvenTreeTree) @@ -920,11 +919,7 @@ def get_default_supplier(self): verbose_name=_('Virtual'), help_text=_('Is this a virtual part, such as a software product or license?')) - notes = MarkdownxField( - blank=True, null=True, - verbose_name=_('Notes'), - help_text=_('Part notes - supports Markdown formatting') - ) + notes = InvenTreeNotesField(help_text=_('Part notes')) bom_checksum = models.CharField(max_length=128, blank=True, verbose_name=_('BOM checksum'), help_text=_('Stored BOM checksum')) diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index eb7364eca62..b39f4f2e195 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -1305,6 +1305,22 @@ def test_part_metadata(self): self.assertFalse('hello' in part.metadata) self.assertEqual(part.metadata['x'], 'y') + def test_part_notes(self): + """Unit tests for the part 'notes' field""" + + # Ensure that we cannot upload a very long piece of text + url = reverse('api-part-detail', kwargs={'pk': 1}) + + response = self.patch( + url, + { + 'notes': 'abcde' * 10001 + }, + expected_code=400 + ) + + self.assertIn('Ensure this field has no more than 50000 characters', str(response.data['notes'])) + class PartAPIAggregationTest(InvenTreeAPITestCase): """Tests to ensure that the various aggregation annotations are working correctly...""" diff --git a/InvenTree/stock/migrations/0018_auto_20200202_0103.py b/InvenTree/stock/migrations/0018_auto_20200202_0103.py index 9cf90ceebed..50bccf6e193 100644 --- a/InvenTree/stock/migrations/0018_auto_20200202_0103.py +++ b/InvenTree/stock/migrations/0018_auto_20200202_0103.py @@ -1,7 +1,6 @@ # Generated by Django 2.2.9 on 2020-02-02 01:03 -from django.db import migrations -import markdownx.models +from django.db import migrations, models class Migration(migrations.Migration): @@ -14,6 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='stockitem', name='notes', - field=markdownx.models.MarkdownxField(blank=True, help_text='Stock Item Notes'), + field=models.TextField(blank=True, help_text='Stock Item Notes'), ), ] diff --git a/InvenTree/stock/migrations/0020_auto_20200206_1213.py b/InvenTree/stock/migrations/0020_auto_20200206_1213.py index 34be29fd39c..e36bc6a0cd2 100644 --- a/InvenTree/stock/migrations/0020_auto_20200206_1213.py +++ b/InvenTree/stock/migrations/0020_auto_20200206_1213.py @@ -1,7 +1,6 @@ # Generated by Django 2.2.9 on 2020-02-06 12:13 -from django.db import migrations -import markdownx.models +from django.db import migrations, models class Migration(migrations.Migration): @@ -14,6 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='stockitem', name='notes', - field=markdownx.models.MarkdownxField(blank=True, help_text='Stock Item Notes', null=True), + field=models.TextField(blank=True, help_text='Stock Item Notes', null=True), ), ] diff --git a/InvenTree/stock/migrations/0034_auto_20200426_0602.py b/InvenTree/stock/migrations/0034_auto_20200426_0602.py index 4bf3171aa26..53a44a69522 100644 --- a/InvenTree/stock/migrations/0034_auto_20200426_0602.py +++ b/InvenTree/stock/migrations/0034_auto_20200426_0602.py @@ -4,7 +4,6 @@ import django.core.validators from django.db import migrations, models import django.db.models.deletion -import markdownx.models import mptt.fields @@ -56,7 +55,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='stockitem', name='notes', - field=markdownx.models.MarkdownxField(blank=True, help_text='Stock Item Notes', null=True, verbose_name='Notes'), + field=models.TextField(blank=True, help_text='Stock Item Notes', null=True, verbose_name='Notes'), ), migrations.AlterField( model_name='stockitem', diff --git a/InvenTree/stock/migrations/0077_alter_stockitem_notes.py b/InvenTree/stock/migrations/0077_alter_stockitem_notes.py new file mode 100644 index 00000000000..5ea7834d71a --- /dev/null +++ b/InvenTree/stock/migrations/0077_alter_stockitem_notes.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2022-06-20 07:28 + +import InvenTree.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('stock', '0076_alter_stockitem_status'), + ] + + operations = [ + migrations.AlterField( + model_name='stockitem', + name='notes', + field=InvenTree.fields.InvenTreeNotesField(blank=True, help_text='Stock Item Notes', max_length=50000, null=True, verbose_name='Notes'), + ), + ] diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index 5093ce9bcb1..2f4e73521d5 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -18,7 +18,6 @@ from django.utils.translation import gettext_lazy as _ from jinja2 import Template -from markdownx.models import MarkdownxField from mptt.managers import TreeManager from mptt.models import MPTTModel, TreeForeignKey @@ -29,7 +28,8 @@ import label.models import report.models from company import models as CompanyModels -from InvenTree.fields import InvenTreeModelMoneyField, InvenTreeURLField +from InvenTree.fields import (InvenTreeModelMoneyField, InvenTreeNotesField, + InvenTreeURLField) from InvenTree.models import InvenTreeAttachment, InvenTreeTree from InvenTree.serializers import extract_int from InvenTree.status_codes import StockHistoryCode, StockStatus @@ -708,11 +708,7 @@ def barcode(self): choices=StockStatus.items(), validators=[MinValueValidator(0)]) - notes = MarkdownxField( - blank=True, null=True, - verbose_name=_("Notes"), - help_text=_('Stock Item Notes') - ) + notes = InvenTreeNotesField(help_text=_('Stock Item Notes')) purchase_price = InvenTreeModelMoneyField( max_digits=19, diff --git a/requirements.txt b/requirements.txt index eb908235ee4..9684c63b359 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,7 +19,6 @@ django-formtools==2.3 # Form wizard tools django-import-export==2.5.0 # Data import / export for admin interface django-maintenance-mode==0.16.1 # Shut down application while reloading etc. django-markdownify==0.8.0 # Markdown rendering -django-markdownx==3.0.1 # Markdown form fields django-money==1.1 # Django app for currency management django-mptt==0.11.0 # Modified Preorder Tree Traversal django-redis>=5.0.0 # Redis integration