← Back to team overview

sts-sponsors team mailing list archive

[Merge] ~ack/maas:drop-verbose-regex-validator into maas:master

 

Alberto Donato has proposed merging ~ack/maas:drop-verbose-regex-validator into maas:master.

Commit message:
drop VerboseRegexValidator since the builtin RegexValidator already provides the value



Requested reviews:
  MAAS Maintainers (maas-maintainers)

For more details, see:
https://code.launchpad.net/~ack/maas/+git/maas/+merge/437951
-- 
Your team MAAS Maintainers is requested to review the proposed merge of ~ack/maas:drop-verbose-regex-validator into maas:master.
diff --git a/src/maasserver/fields.py b/src/maasserver/fields.py
index 94d64cf..bc8277d 100644
--- a/src/maasserver/fields.py
+++ b/src/maasserver/fields.py
@@ -14,7 +14,6 @@ __all__ = [
     "MACAddressFormField",
     "MODEL_NAME_VALIDATOR",
     "NodeChoiceField",
-    "VerboseRegexValidator",
     "VersionedTextFileField",
 ]
 
@@ -57,27 +56,7 @@ MAC_RE = re.compile(
 MAC_ERROR_MSG = "'%(value)s' is not a valid MAC address."
 
 
-class VerboseRegexValidator(RegexValidator):
-    """A verbose `RegexValidator`.
-
-    This `RegexValidator` includes the checked value in the rendered error
-    message when the validation fails.
-    """
-
-    # Set a bugus code to circumvent Django's attempt to re-interpret a
-    # validator's error message using the field's message it is attached
-    # to.
-    code = "bogus-code"
-
-    def __call__(self, value):
-        """Validates that the input matches the regular expression."""
-        if not self.regex.search(force_str(value)):
-            raise ValidationError(
-                self.message % {"value": value}, code=self.code
-            )
-
-
-mac_validator = VerboseRegexValidator(regex=MAC_RE, message=MAC_ERROR_MSG)
+mac_validator = RegexValidator(regex=MAC_RE, message=MAC_ERROR_MSG)
 
 
 class StrippedCharField(forms.CharField):
@@ -108,26 +87,16 @@ class UnstrippedCharField(forms.CharField):
             parent_init(*args, **kwargs)
 
 
-class VerboseRegexField(forms.CharField):
-    def __init__(self, regex, message, *args, **kwargs):
-        """A field that validates its value with a regular expression.
+class MACAddressFormField(forms.CharField):
+    """Form field type: MAC address."""
 
-        :param regex: Either a string or a compiled regular expression object.
-        :param message: Error message to use when the validation fails.
-        """
+    def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
         self.validators.append(
-            VerboseRegexValidator(regex=regex, message=message)
+            RegexValidator(regex=MAC_RE, message=MAC_ERROR_MSG)
         )
 
 
-class MACAddressFormField(VerboseRegexField):
-    """Form field type: MAC address."""
-
-    def __init__(self, *args, **kwargs):
-        super().__init__(regex=MAC_RE, message=MAC_ERROR_MSG, *args, **kwargs)
-
-
 class MACAddressField(Field):
     """Model field type: MAC address."""
 
diff --git a/src/maasserver/migrations/maasserver/0001_initial.py b/src/maasserver/migrations/maasserver/0001_initial.py
index 681c113..2fadac9 100644
--- a/src/maasserver/migrations/maasserver/0001_initial.py
+++ b/src/maasserver/migrations/maasserver/0001_initial.py
@@ -780,7 +780,7 @@ class Migration(migrations.Migration):
                         help_text="Interface name.",
                         max_length=255,
                         validators=[
-                            maasserver.fields.VerboseRegexValidator(
+                            django.core.validators.RegexValidator(
                                 "^[\\w\\-_.:]+$"
                             )
                         ],
@@ -1220,7 +1220,7 @@ class Migration(migrations.Migration):
                         max_length=255,
                         blank=True,
                         validators=[
-                            maasserver.fields.VerboseRegexValidator(
+                            django.core.validators.RegexValidator(
                                 "^[\\w:.-]+$"
                             )
                         ],
diff --git a/src/maasserver/migrations/maasserver/0293_drop_verbose_regex_validator.py b/src/maasserver/migrations/maasserver/0293_drop_verbose_regex_validator.py
new file mode 100644
index 0000000..f5ede0a
--- /dev/null
+++ b/src/maasserver/migrations/maasserver/0293_drop_verbose_regex_validator.py
@@ -0,0 +1,26 @@
+# Generated by Django 3.2.12 on 2023-02-27 12:53
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("maasserver", "0292_use_builtin_json_field"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="interface",
+            name="name",
+            field=models.CharField(
+                help_text="Interface name.",
+                max_length=255,
+                validators=[
+                    django.core.validators.RegexValidator(
+                        regex="^[\\w\\-_.:]+$"
+                    )
+                ],
+            ),
+        ),
+    ]
diff --git a/src/maasserver/models/interface.py b/src/maasserver/models/interface.py
index 5b765e4..1dba5f8 100644
--- a/src/maasserver/models/interface.py
+++ b/src/maasserver/models/interface.py
@@ -17,6 +17,7 @@ from zlib import crc32
 
 from django.contrib.postgres.fields import ArrayField
 from django.core.exceptions import PermissionDenied, ValidationError
+from django.core.validators import RegexValidator
 from django.db.models import (
     BooleanField,
     CASCADE,
@@ -48,11 +49,7 @@ from maasserver.exceptions import (
     StaticIPAddressOutOfRange,
     StaticIPAddressUnavailable,
 )
-from maasserver.fields import (
-    mac_validator,
-    MACAddressField,
-    VerboseRegexValidator,
-)
+from maasserver.fields import mac_validator, MACAddressField
 from maasserver.models.cleansave import CleanSave
 from maasserver.models.staticipaddress import StaticIPAddress
 from maasserver.models.timestampedmodel import TimestampedModel
@@ -551,7 +548,7 @@ class Interface(CleanSave, TimestampedModel):
         blank=False,
         editable=True,
         max_length=255,
-        validators=[VerboseRegexValidator(INTERFACE_NAME_REGEXP)],
+        validators=[RegexValidator(regex=INTERFACE_NAME_REGEXP)],
         help_text="Interface name.",
     )
 
diff --git a/src/maasserver/tests/test_fields.py b/src/maasserver/tests/test_fields.py
index 1f14e3b..ea6ce96 100644
--- a/src/maasserver/tests/test_fields.py
+++ b/src/maasserver/tests/test_fields.py
@@ -23,8 +23,6 @@ from maasserver.fields import (
     SystemdIntervalField,
     URLOrPPAFormField,
     URLOrPPAValidator,
-    VerboseRegexField,
-    VerboseRegexValidator,
     VersionedTextFileField,
 )
 from maasserver.models import Interface, Node, VersionedTextFile
@@ -65,34 +63,6 @@ class TestModelNameValidator(MAASServerTestCase):
         )
 
 
-class TestVerboseRegexValidator(MAASServerTestCase):
-    def test_VerboseRegexValidator_validates_value(self):
-        validator = VerboseRegexValidator(
-            regex="test", message="Unknown value"
-        )
-        self.assertIsNone(validator("test"))
-
-    def test_VerboseRegexValidator_validation_error_includes_value(self):
-        message = "Unknown value: %(value)s"
-        validator = VerboseRegexValidator(regex="test", message=message)
-        value = factory.make_name("value")
-        error = self.assertRaises(ValidationError, validator, value)
-        self.assertEqual(message % {"value": value}, error.message)
-
-
-class TestVerboseRegexField(MAASServerTestCase):
-    def test_VerboseRegexField_accepts_valid_value(self):
-        field = VerboseRegexField(regex="test", message="Unknown value")
-        self.assertEqual("test", field.clean("test"))
-
-    def test_VerboseRegexField_validation_error_includes_value(self):
-        message = "Unknown value: %(value)s"
-        field = VerboseRegexField(regex="test", message=message)
-        value = factory.make_name("value")
-        error = self.assertRaises(ValidationError, field.clean, value)
-        self.assertEqual([message % {"value": value}], error.messages)
-
-
 class TestMACAddressField(MAASServerTestCase):
     def test_mac_address_is_stored_normalized_and_loaded(self):
         interface = factory.make_Interface(

Follow ups