Fix missing number validators on custom form widgets
This commit is contained in:
parent
089dbb663a
commit
bab9d636ee
2 changed files with 65 additions and 1 deletions
|
|
@ -310,8 +310,10 @@ class CustomFormMixin(FormGeneratorMixin):
|
||||||
validators = []
|
validators = []
|
||||||
if min_val is not None:
|
if min_val is not None:
|
||||||
validators.append(MinValueValidator(min_val))
|
validators.append(MinValueValidator(min_val))
|
||||||
|
field.widget.attrs["min"] = min_val
|
||||||
if max_val is not None:
|
if max_val is not None:
|
||||||
validators.append(MaxValueValidator(max_val))
|
validators.append(MaxValueValidator(max_val))
|
||||||
|
field.widget.attrs["max"] = max_val
|
||||||
|
|
||||||
if validators:
|
if validators:
|
||||||
field.validators.extend(validators)
|
field.validators.extend(validators)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
from unittest.mock import Mock
|
from unittest.mock import Mock
|
||||||
|
|
||||||
import jsonschema
|
import jsonschema
|
||||||
|
from django.core.validators import MaxValueValidator, MinValueValidator
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
from servala.core.crd import generate_custom_form_class
|
from servala.core.crd import generate_custom_form_class
|
||||||
|
|
@ -374,7 +375,6 @@ def test_choice_field_validates_against_control_plane_choices():
|
||||||
|
|
||||||
|
|
||||||
def test_admin_form_validates_choice_values_against_schema():
|
def test_admin_form_validates_choice_values_against_schema():
|
||||||
from servala.core.forms import ServiceDefinitionAdminForm
|
|
||||||
|
|
||||||
form = ServiceDefinitionAdminForm()
|
form = ServiceDefinitionAdminForm()
|
||||||
mock_crd = Mock()
|
mock_crd = Mock()
|
||||||
|
|
@ -457,3 +457,65 @@ def test_admin_form_validates_choice_values_against_schema():
|
||||||
error_message = str(errors[0])
|
error_message = str(errors[0])
|
||||||
assert "invalid" in error_message.lower()
|
assert "invalid" in error_message.lower()
|
||||||
assert "Environment" in error_message
|
assert "Environment" in error_message
|
||||||
|
|
||||||
|
|
||||||
|
def test_number_field_min_max_sets_widget_attributes():
|
||||||
|
class TestModel(models.Model):
|
||||||
|
name = models.CharField(max_length=100)
|
||||||
|
port = models.IntegerField()
|
||||||
|
replica_count = models.IntegerField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
app_label = "test"
|
||||||
|
|
||||||
|
form_config = {
|
||||||
|
"fieldsets": [
|
||||||
|
{
|
||||||
|
"title": "General",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"label": "Name",
|
||||||
|
"controlplane_field_mapping": "name",
|
||||||
|
"required": True,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "number",
|
||||||
|
"label": "Port",
|
||||||
|
"controlplane_field_mapping": "port",
|
||||||
|
"required": True,
|
||||||
|
"min_value": 1,
|
||||||
|
"max_value": 65535,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "number",
|
||||||
|
"label": "Replicas",
|
||||||
|
"controlplane_field_mapping": "replica_count",
|
||||||
|
"required": True,
|
||||||
|
"min_value": 1,
|
||||||
|
"max_value": 10,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
form_class = generate_custom_form_class(form_config, TestModel)
|
||||||
|
form = form_class()
|
||||||
|
|
||||||
|
port_field = form.fields["port"]
|
||||||
|
assert port_field.widget.attrs.get("min") == 1
|
||||||
|
assert port_field.widget.attrs.get("max") == 65535
|
||||||
|
|
||||||
|
replica_field = form.fields["replica_count"]
|
||||||
|
assert replica_field.widget.attrs.get("min") == 1
|
||||||
|
assert replica_field.widget.attrs.get("max") == 10
|
||||||
|
|
||||||
|
port_validators = port_field.validators
|
||||||
|
assert any(
|
||||||
|
isinstance(v, MinValueValidator) and v.limit_value == 1 for v in port_validators
|
||||||
|
)
|
||||||
|
assert any(
|
||||||
|
isinstance(v, MaxValueValidator) and v.limit_value == 65535
|
||||||
|
for v in port_validators
|
||||||
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue