From 09987ad79bff2fead96902955012c5148df78d98 Mon Sep 17 00:00:00 2001
From: Matthias Mair <code@mjmair.com>
Date: Thu, 21 Jul 2022 03:33:21 +0200
Subject: [PATCH] Remove special characters restriction in category names
 (#3370)

* [FR]Special characters restriction in category names
Fixes #3358

* remove old validation test
---
 InvenTree/InvenTree/models.py                  |  2 --
 InvenTree/InvenTree/validators.py              |  5 +----
 .../migrations/0081_alter_partcategory_name.py | 18 ++++++++++++++++++
 InvenTree/part/test_category.py                | 14 --------------
 .../0079_alter_stocklocation_name.py           | 18 ++++++++++++++++++
 5 files changed, 37 insertions(+), 20 deletions(-)
 create mode 100644 InvenTree/part/migrations/0081_alter_partcategory_name.py
 create mode 100644 InvenTree/stock/migrations/0079_alter_stocklocation_name.py

diff --git a/InvenTree/InvenTree/models.py b/InvenTree/InvenTree/models.py
index 740671f1dd..889eea0176 100644
--- a/InvenTree/InvenTree/models.py
+++ b/InvenTree/InvenTree/models.py
@@ -24,7 +24,6 @@ import InvenTree.format
 import InvenTree.helpers
 from common.models import InvenTreeSetting
 from InvenTree.fields import InvenTreeURLField
-from InvenTree.validators import validate_tree_name
 
 logger = logging.getLogger('inventree')
 
@@ -538,7 +537,6 @@ class InvenTreeTree(MPTTModel):
     name = models.CharField(
         blank=False,
         max_length=100,
-        validators=[validate_tree_name],
         verbose_name=_("Name"),
         help_text=_("Name"),
     )
diff --git a/InvenTree/InvenTree/validators.py b/InvenTree/InvenTree/validators.py
index 46b02ca506..ecc624d966 100644
--- a/InvenTree/InvenTree/validators.py
+++ b/InvenTree/InvenTree/validators.py
@@ -80,10 +80,7 @@ def validate_sales_order_reference(value):
 
 
 def validate_tree_name(value):
-    """Prevent illegal characters in tree item names."""
-    for c in "!@#$%^&*'\"\\/[]{}<>,|+=~`\"":  # noqa: P103
-        if c in str(value):
-            raise ValidationError(_('Illegal character in name ({x})'.format(x=c)))
+    """Placeholder for legacy function used in migrations."""
 
 
 def validate_overage(value):
diff --git a/InvenTree/part/migrations/0081_alter_partcategory_name.py b/InvenTree/part/migrations/0081_alter_partcategory_name.py
new file mode 100644
index 0000000000..d91912980b
--- /dev/null
+++ b/InvenTree/part/migrations/0081_alter_partcategory_name.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.14 on 2022-07-20 16:09
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('part', '0080_alter_part_image'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='partcategory',
+            name='name',
+            field=models.CharField(help_text='Name', max_length=100, verbose_name='Name'),
+        ),
+    ]
diff --git a/InvenTree/part/test_category.py b/InvenTree/part/test_category.py
index 267e9a9733..d15154b66a 100644
--- a/InvenTree/part/test_category.py
+++ b/InvenTree/part/test_category.py
@@ -1,6 +1,5 @@
 """Unit tests for the PartCategory model"""
 
-from django.core.exceptions import ValidationError
 from django.test import TestCase
 
 from .models import Part, PartCategory, PartParameter, PartParameterTemplate
@@ -109,19 +108,6 @@ class CategoryTest(TestCase):
                     part_parameter.pop(item)
                 self.assertEqual(len(part_parameter), 1)
 
-    def test_invalid_name(self):
-        """Test that an illegal character is prohibited in a category name"""
-        cat = PartCategory(name='test/with/illegal/chars', description='Test category', parent=None)
-
-        with self.assertRaises(ValidationError) as err:
-            cat.full_clean()
-            cat.save()  # pragma: no cover
-
-        self.assertIn('Illegal character in name', str(err.exception.error_dict.get('name')))
-
-        cat.name = 'good name'
-        cat.save()
-
     def test_delete(self):
         """Test that category deletion moves the children properly."""
         # Delete the 'IC' category and 'Transceiver' should move to be under 'Electronics'
diff --git a/InvenTree/stock/migrations/0079_alter_stocklocation_name.py b/InvenTree/stock/migrations/0079_alter_stocklocation_name.py
new file mode 100644
index 0000000000..70f930b21c
--- /dev/null
+++ b/InvenTree/stock/migrations/0079_alter_stocklocation_name.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.14 on 2022-07-20 16:09
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('stock', '0078_alter_stockitem_supplier_part'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='stocklocation',
+            name='name',
+            field=models.CharField(help_text='Name', max_length=100, verbose_name='Name'),
+        ),
+    ]