mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
af27bf5eff
* 15049 add missing gettext to error strings * 15049 add missing gettext to error strings * 15094 review change * 15094 review change * Formatting cleanup --------- Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
from django import forms
|
|
from django.core.exceptions import ValidationError
|
|
from django.core.validators import validate_ipv4_address, validate_ipv6_address
|
|
from django.utils.translation import gettext_lazy as _
|
|
from netaddr import IPAddress, IPNetwork, AddrFormatError
|
|
|
|
|
|
#
|
|
# Form fields
|
|
#
|
|
|
|
class IPAddressFormField(forms.Field):
|
|
default_error_messages = {
|
|
'invalid': _("Enter a valid IPv4 or IPv6 address (without a mask)."),
|
|
}
|
|
|
|
def to_python(self, value):
|
|
if not value:
|
|
return None
|
|
|
|
if isinstance(value, IPAddress):
|
|
return value
|
|
|
|
# netaddr is a bit too liberal with what it accepts as a valid IP address. For example, '1.2.3' will become
|
|
# IPAddress('1.2.0.3'). Here, we employ Django's built-in IPv4 and IPv6 address validators as a sanity check.
|
|
try:
|
|
validate_ipv4_address(value)
|
|
except ValidationError:
|
|
try:
|
|
validate_ipv6_address(value)
|
|
except ValidationError:
|
|
raise ValidationError(_("Invalid IPv4/IPv6 address format: {address}").format(address=value))
|
|
|
|
try:
|
|
return IPAddress(value)
|
|
except ValueError:
|
|
raise ValidationError(_('This field requires an IP address without a mask.'))
|
|
except AddrFormatError:
|
|
raise ValidationError(_("Please specify a valid IPv4 or IPv6 address."))
|
|
|
|
|
|
class IPNetworkFormField(forms.Field):
|
|
default_error_messages = {
|
|
'invalid': _("Enter a valid IPv4 or IPv6 address (with CIDR mask)."),
|
|
}
|
|
|
|
def to_python(self, value):
|
|
if not value:
|
|
return None
|
|
|
|
if isinstance(value, IPNetwork):
|
|
return value
|
|
|
|
# Ensure that a subnet mask has been specified. This prevents IPs from defaulting to a /32 or /128.
|
|
if len(value.split('/')) != 2:
|
|
raise ValidationError(_('CIDR mask (e.g. /24) is required.'))
|
|
|
|
try:
|
|
return IPNetwork(value)
|
|
except AddrFormatError:
|
|
raise ValidationError(_("Please specify a valid IPv4 or IPv6 address."))
|