mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-23 01:57:00 +03:00
Tests and tweaks for text fields
This commit is contained in:
parent
af46fd6b00
commit
afb3f8ab0a
|
@ -12,6 +12,7 @@ from rest_framework.utils import html, representation, humanize_datetime
|
||||||
import datetime
|
import datetime
|
||||||
import decimal
|
import decimal
|
||||||
import inspect
|
import inspect
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
class empty:
|
class empty:
|
||||||
|
@ -325,7 +326,11 @@ class EmailField(CharField):
|
||||||
default_error_messages = {
|
default_error_messages = {
|
||||||
'invalid': _('Enter a valid email address.')
|
'invalid': _('Enter a valid email address.')
|
||||||
}
|
}
|
||||||
default_validators = [validators.validate_email]
|
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
super(EmailField, self).__init__(**kwargs)
|
||||||
|
validator = validators.EmailValidator(message=self.error_messages['invalid'])
|
||||||
|
self.validators = [validator] + self.validators
|
||||||
|
|
||||||
def to_internal_value(self, data):
|
def to_internal_value(self, data):
|
||||||
if data == '' and not self.allow_blank:
|
if data == '' and not self.allow_blank:
|
||||||
|
@ -341,26 +346,37 @@ class EmailField(CharField):
|
||||||
|
|
||||||
|
|
||||||
class RegexField(CharField):
|
class RegexField(CharField):
|
||||||
|
default_error_messages = {
|
||||||
|
'invalid': _('This value does not match the required pattern.')
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self, regex, **kwargs):
|
def __init__(self, regex, **kwargs):
|
||||||
kwargs['validators'] = (
|
|
||||||
[validators.RegexValidator(regex)] +
|
|
||||||
kwargs.get('validators', [])
|
|
||||||
)
|
|
||||||
super(RegexField, self).__init__(**kwargs)
|
super(RegexField, self).__init__(**kwargs)
|
||||||
|
validator = validators.RegexValidator(regex, message=self.error_messages['invalid'])
|
||||||
|
self.validators = [validator] + self.validators
|
||||||
|
|
||||||
|
|
||||||
class SlugField(CharField):
|
class SlugField(CharField):
|
||||||
default_error_messages = {
|
default_error_messages = {
|
||||||
'invalid': _("Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.")
|
'invalid': _("Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.")
|
||||||
}
|
}
|
||||||
default_validators = [validators.validate_slug]
|
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
super(SlugField, self).__init__(**kwargs)
|
||||||
|
slug_regex = re.compile(r'^[-a-zA-Z0-9_]+$')
|
||||||
|
validator = validators.RegexValidator(slug_regex, message=self.error_messages['invalid'])
|
||||||
|
self.validators = [validator] + self.validators
|
||||||
|
|
||||||
|
|
||||||
class URLField(CharField):
|
class URLField(CharField):
|
||||||
default_error_messages = {
|
default_error_messages = {
|
||||||
'invalid': _("Enter a valid URL.")
|
'invalid': _("Enter a valid URL.")
|
||||||
}
|
}
|
||||||
default_validators = [validators.URLValidator()]
|
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
super(URLField, self).__init__(**kwargs)
|
||||||
|
validator = validators.URLValidator(message=self.error_messages['invalid'])
|
||||||
|
self.validators = [validator] + self.validators
|
||||||
|
|
||||||
|
|
||||||
# Number types...
|
# Number types...
|
||||||
|
@ -642,7 +658,7 @@ class TimeField(Field):
|
||||||
self.input_formats = input_formats if input_formats is not None else self.input_formats
|
self.input_formats = input_formats if input_formats is not None else self.input_formats
|
||||||
super(TimeField, self).__init__(*args, **kwargs)
|
super(TimeField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
def from_native(self, value):
|
def to_internal_value(self, value):
|
||||||
if value in (None, ''):
|
if value in (None, ''):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
@ -26,16 +26,7 @@ class ValidAndInvalidValues:
|
||||||
assert exc_info.value.messages == expected_failure
|
assert exc_info.value.messages == expected_failure
|
||||||
|
|
||||||
|
|
||||||
class TestCharField(ValidAndInvalidValues):
|
# Boolean types...
|
||||||
valid_mappings = {
|
|
||||||
1: '1',
|
|
||||||
'abc': 'abc'
|
|
||||||
}
|
|
||||||
invalid_mappings = {
|
|
||||||
'': ['This field may not be blank.']
|
|
||||||
}
|
|
||||||
field = fields.CharField()
|
|
||||||
|
|
||||||
|
|
||||||
class TestBooleanField(ValidAndInvalidValues):
|
class TestBooleanField(ValidAndInvalidValues):
|
||||||
valid_mappings = {
|
valid_mappings = {
|
||||||
|
@ -54,6 +45,60 @@ class TestBooleanField(ValidAndInvalidValues):
|
||||||
field = fields.BooleanField()
|
field = fields.BooleanField()
|
||||||
|
|
||||||
|
|
||||||
|
# String types...
|
||||||
|
|
||||||
|
class TestCharField(ValidAndInvalidValues):
|
||||||
|
valid_mappings = {
|
||||||
|
1: '1',
|
||||||
|
'abc': 'abc'
|
||||||
|
}
|
||||||
|
invalid_mappings = {
|
||||||
|
'': ['This field may not be blank.']
|
||||||
|
}
|
||||||
|
field = fields.CharField()
|
||||||
|
|
||||||
|
|
||||||
|
class TestEmailField(ValidAndInvalidValues):
|
||||||
|
valid_mappings = {
|
||||||
|
'example@example.com': 'example@example.com',
|
||||||
|
' example@example.com ': 'example@example.com',
|
||||||
|
}
|
||||||
|
invalid_mappings = {
|
||||||
|
'example.com': ['Enter a valid email address.']
|
||||||
|
}
|
||||||
|
field = fields.EmailField()
|
||||||
|
|
||||||
|
|
||||||
|
class TestRegexField(ValidAndInvalidValues):
|
||||||
|
valid_mappings = {
|
||||||
|
'a9': 'a9',
|
||||||
|
}
|
||||||
|
invalid_mappings = {
|
||||||
|
'A9': ["This value does not match the required pattern."]
|
||||||
|
}
|
||||||
|
field = fields.RegexField(regex='[a-z][0-9]')
|
||||||
|
|
||||||
|
|
||||||
|
class TestSlugField(ValidAndInvalidValues):
|
||||||
|
valid_mappings = {
|
||||||
|
'slug-99': 'slug-99',
|
||||||
|
}
|
||||||
|
invalid_mappings = {
|
||||||
|
'slug 99': ["Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."]
|
||||||
|
}
|
||||||
|
field = fields.SlugField()
|
||||||
|
|
||||||
|
|
||||||
|
class TestURLField(ValidAndInvalidValues):
|
||||||
|
valid_mappings = {
|
||||||
|
'http://example.com': 'http://example.com',
|
||||||
|
}
|
||||||
|
invalid_mappings = {
|
||||||
|
'example.com': ['Enter a valid URL.']
|
||||||
|
}
|
||||||
|
field = fields.URLField()
|
||||||
|
|
||||||
|
|
||||||
# Number types...
|
# Number types...
|
||||||
|
|
||||||
class TestIntegerField(ValidAndInvalidValues):
|
class TestIntegerField(ValidAndInvalidValues):
|
||||||
|
@ -249,6 +294,34 @@ class TestNaiveDateTimeField(ValidAndInvalidValues):
|
||||||
field = fields.DateTimeField(default_timezone=None)
|
field = fields.DateTimeField(default_timezone=None)
|
||||||
|
|
||||||
|
|
||||||
|
class TestTimeField(ValidAndInvalidValues):
|
||||||
|
"""
|
||||||
|
Valid and invalid values for `TimeField`.
|
||||||
|
"""
|
||||||
|
valid_mappings = {
|
||||||
|
'13:00': datetime.time(13, 00),
|
||||||
|
datetime.time(13, 00): datetime.time(13, 00),
|
||||||
|
}
|
||||||
|
invalid_mappings = {
|
||||||
|
'abc': ['Time has wrong format. Use one of these formats instead: hh:mm[:ss[.uuuuuu]]'],
|
||||||
|
'99:99': ['Time has wrong format. Use one of these formats instead: hh:mm[:ss[.uuuuuu]]'],
|
||||||
|
}
|
||||||
|
field = fields.TimeField()
|
||||||
|
|
||||||
|
|
||||||
|
class TestCustomInputFormatTimeField(ValidAndInvalidValues):
|
||||||
|
"""
|
||||||
|
Valid and invalid values for `TimeField` with a custom input format.
|
||||||
|
"""
|
||||||
|
valid_mappings = {
|
||||||
|
'1:00pm': datetime.time(13, 00),
|
||||||
|
}
|
||||||
|
invalid_mappings = {
|
||||||
|
'13:00': ['Time has wrong format. Use one of these formats instead: hh:mm[AM|PM]'],
|
||||||
|
}
|
||||||
|
field = fields.TimeField(input_formats=['%I:%M%p'])
|
||||||
|
|
||||||
|
|
||||||
# Choice types...
|
# Choice types...
|
||||||
|
|
||||||
class TestChoiceField(ValidAndInvalidValues):
|
class TestChoiceField(ValidAndInvalidValues):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user