Commit 196fa5e9 by Stephan Groß

Merge pull request #436 from minddust/regex_field

added RegexField
parents 3268c673 03100168
...@@ -153,6 +153,16 @@ A text representation, validates the text to be a valid e-mail address. ...@@ -153,6 +153,16 @@ A text representation, validates the text to be a valid e-mail address.
Corresponds to `django.db.models.fields.EmailField` Corresponds to `django.db.models.fields.EmailField`
## RegexField
A text representation, that validates the given value matches against a certain regular expression.
Uses Django's `django.core.validators.RegexValidator` for validation.
Corresponds to `django.forms.fields.RegexField`
**Signature:** `RegexField(regex, max_length=None, min_length=None)`
## DateField ## DateField
A date representation. A date representation.
......
...@@ -6,10 +6,11 @@ ...@@ -6,10 +6,11 @@
## Master ## Master
* Added `SerializerMethodField` * Added `RegexField`.
* Added `SerializerMethodField`.
* Serializer performance improvements. * Serializer performance improvements.
* Added `obtain_token_view` to get tokens when using `TokenAuthentication` * Added `obtain_token_view` to get tokens when using `TokenAuthentication`.
* Bugfix: Django 1.5 configurable user support for `TokenAuthentication` * Bugfix: Django 1.5 configurable user support for `TokenAuthentication`.
## 2.1.3 ## 2.1.3
......
import copy import copy
import datetime import datetime
import inspect import inspect
import re
import warnings import warnings
from io import BytesIO from io import BytesIO
...@@ -802,6 +803,34 @@ class EmailField(CharField): ...@@ -802,6 +803,34 @@ class EmailField(CharField):
return result return result
class RegexField(CharField):
type_name = 'RegexField'
def __init__(self, regex, max_length=None, min_length=None, *args, **kwargs):
super(RegexField, self).__init__(max_length, min_length, *args, **kwargs)
self.regex = regex
def _get_regex(self):
return self._regex
def _set_regex(self, regex):
if isinstance(regex, basestring):
regex = re.compile(regex)
self._regex = regex
if hasattr(self, '_regex_validator') and self._regex_validator in self.validators:
self.validators.remove(self._regex_validator)
self._regex_validator = validators.RegexValidator(regex=regex)
self.validators.append(self._regex_validator)
regex = property(_get_regex, _set_regex)
def __deepcopy__(self, memo):
result = copy.copy(self)
memo[id(self)] = result
result.validators = self.validators[:]
return result
class DateField(WritableField): class DateField(WritableField):
type_name = 'DateField' type_name = 'DateField'
......
...@@ -165,3 +165,8 @@ class BlankFieldModel(RESTFrameworkModel): ...@@ -165,3 +165,8 @@ class BlankFieldModel(RESTFrameworkModel):
# Model for issue #380 # Model for issue #380
class OptionalRelationModel(RESTFrameworkModel): class OptionalRelationModel(RESTFrameworkModel):
other = models.ForeignKey('OptionalRelationModel', blank=True, null=True) other = models.ForeignKey('OptionalRelationModel', blank=True, null=True)
# Model for RegexField
class Book(RESTFrameworkModel):
isbn = models.CharField(max_length=13)
...@@ -2,7 +2,7 @@ import datetime ...@@ -2,7 +2,7 @@ import datetime
from django.test import TestCase from django.test import TestCase
from rest_framework import serializers from rest_framework import serializers
from rest_framework.tests.models import (ActionItem, Anchor, BasicModel, from rest_framework.tests.models import (ActionItem, Anchor, BasicModel,
BlankFieldModel, BlogPost, CallableDefaultValueModel, DefaultValueModel, BlankFieldModel, BlogPost, Book, CallableDefaultValueModel, DefaultValueModel,
ManyToManyModel, Person, ReadOnlyManyToManyModel) ManyToManyModel, Person, ReadOnlyManyToManyModel)
...@@ -40,6 +40,13 @@ class CommentSerializer(serializers.Serializer): ...@@ -40,6 +40,13 @@ class CommentSerializer(serializers.Serializer):
return instance return instance
class BookSerializer(serializers.ModelSerializer):
isbn = serializers.RegexField(regex=r'^[0-9]{13}$', error_messages={'invalid': 'isbn has to be exact 13 numbers'})
class Meta:
model = Book
class ActionItemSerializer(serializers.ModelSerializer): class ActionItemSerializer(serializers.ModelSerializer):
class Meta: class Meta:
...@@ -258,6 +265,25 @@ class ValidationTests(TestCase): ...@@ -258,6 +265,25 @@ class ValidationTests(TestCase):
self.assertEquals(serializer.errors, {'info': [u'Ensure this value has at most 12 characters (it has 13).']}) self.assertEquals(serializer.errors, {'info': [u'Ensure this value has at most 12 characters (it has 13).']})
class RegexValidationTest(TestCase):
def test_create_failed(self):
serializer = BookSerializer(data={'isbn': '1234567890'})
self.assertFalse(serializer.is_valid())
self.assertEquals(serializer.errors, {'isbn': [u'isbn has to be exact 13 numbers']})
serializer = BookSerializer(data={'isbn': '12345678901234'})
self.assertFalse(serializer.is_valid())
self.assertEquals(serializer.errors, {'isbn': [u'isbn has to be exact 13 numbers']})
serializer = BookSerializer(data={'isbn': 'abcdefghijklm'})
self.assertFalse(serializer.is_valid())
self.assertEquals(serializer.errors, {'isbn': [u'isbn has to be exact 13 numbers']})
def test_create_success(self):
serializer = BookSerializer(data={'isbn': '1234567890123'})
self.assertTrue(serializer.is_valid())
class MetadataTests(TestCase): class MetadataTests(TestCase):
def test_empty(self): def test_empty(self):
serializer = CommentSerializer() serializer = CommentSerializer()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment