Skip to content

Commit

Permalink
Fixes netbox-community#1489: Corrected server error on validation of …
Browse files Browse the repository at this point in the history
…empty required custom field
  • Loading branch information
jeremystretch authored and John Anderson committed Oct 13, 2017
1 parent 1971a17 commit aa6749d
Showing 1 changed file with 41 additions and 28 deletions.
69 changes: 41 additions & 28 deletions netbox/extras/api/customfields.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,34 +29,47 @@ def to_internal_value(self, data):

for field_name, value in data.items():

cf = custom_fields[field_name]

# Validate custom field name
if field_name not in custom_fields:
raise ValidationError("Invalid custom field for {} objects: {}".format(content_type, field_name))

# Validate boolean
if cf.type == CF_TYPE_BOOLEAN and value not in [True, False, 1, 0]:
raise ValidationError("Invalid value for boolean field {}: {}".format(field_name, value))

# Validate date
if cf.type == CF_TYPE_DATE:
try:
datetime.strptime(value, '%Y-%m-%d')
except ValueError:
raise ValidationError("Invalid date for field {}: {}. (Required format is YYYY-MM-DD.)".format(
field_name, value
))

# Validate selected choice
if cf.type == CF_TYPE_SELECT:
try:
value = int(value)
except ValueError:
raise ValidationError("{}: Choice selections must be passed as integers.".format(field_name))
valid_choices = [c.pk for c in cf.choices.all()]
if value not in valid_choices:
raise ValidationError("Invalid choice for field {}: {}".format(field_name, value))
try:
cf = custom_fields[field_name]
except KeyError:
raise ValidationError(
"Invalid custom field for {} objects: {}".format(content_type, field_name)
)

# Data validation
if value not in [None, '']:

# Validate boolean
if cf.type == CF_TYPE_BOOLEAN and value not in [True, False, 1, 0]:
raise ValidationError(
"Invalid value for boolean field {}: {}".format(field_name, value)
)

# Validate date
if cf.type == CF_TYPE_DATE:
try:
datetime.strptime(value, '%Y-%m-%d')
except ValueError:
raise ValidationError(
"Invalid date for field {}: {}. (Required format is YYYY-MM-DD.)".format(field_name, value)
)

# Validate selected choice
if cf.type == CF_TYPE_SELECT:
try:
value = int(value)
except ValueError:
raise ValidationError(
"{}: Choice selections must be passed as integers.".format(field_name)
)
valid_choices = [c.pk for c in cf.choices.all()]
if value not in valid_choices:
raise ValidationError(
"Invalid choice for field {}: {}".format(field_name, value)
)

elif cf.required:
raise ValidationError("Required field {} cannot be empty.".format(field_name))

# Check for missing required fields
missing_fields = []
Expand Down

0 comments on commit aa6749d

Please sign in to comment.