|
@@ -29,34 +29,47 @@ class CustomFieldsSerializer(serializers.BaseSerializer):
|
|
|
|
|
|
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 = []
|