Fixed #2364: added NumberIsInRange validator. Thanks, Matt McClanahan.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@4039 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jacob Kaplan-Moss 2006-11-07 04:29:07 +00:00
parent 4cb2247327
commit 3a0733e12c
2 changed files with 41 additions and 0 deletions

View File

@ -353,6 +353,38 @@ class UniqueAmongstFieldsWithPrefix(object):
if field_name != self.field_name and value == field_data: if field_name != self.field_name and value == field_data:
raise ValidationError, self.error_message raise ValidationError, self.error_message
class NumberIsInRange(object):
"""
Validator that tests if a value is in a range (inclusive).
"""
def __init__(self, lower=None, upper=None, error_message=''):
self.lower, self.upper = lower, upper
if not error_message:
if lower and upper:
self.error_message = gettext("This value must be between %s and %s.") % (lower, upper)
elif lower:
self.error_message = gettext("This value must be at least %s.") % lower
elif upper:
self.error_message = gettext("This value must be no more than %s.") % upper
else:
self.error_message = error_message
def __call__(self, field_data, all_data):
# Try to make the value numeric. If this fails, we assume another
# validator will catch the problem.
try:
val = float(field_data)
except ValueError:
return
# Now validate
if self.lower and self.upper and (val < self.lower or val > self.upper):
raise ValidationError(self.error_message)
elif self.lower and val < self.lower:
raise ValidationError(self.error_message)
elif self.upper and val > self.upper:
raise ValidationError(self.error_message)
class IsAPowerOf(object): class IsAPowerOf(object):
""" """
>>> v = IsAPowerOf(2) >>> v = IsAPowerOf(2)

View File

@ -610,6 +610,15 @@ fails. If no message is passed in, a default message is used.
string "123" is less than the string "2", for example. If you don't want string "123" is less than the string "2", for example. If you don't want
string comparison here, you will need to write your own validator. string comparison here, you will need to write your own validator.
``NumberIsInRange``
Takes two boundary number, ``lower`` and ``upper`` and checks that the
field is greater than ``lower`` (if given) and less than ``upper`` (if
given).
Both checks are inclusive; that is, ``NumberIsInRange(10, 20)`` will allow
values of both 10 and 20. This validator only checks numeric fields
(i.e. floats and integer fields).
``IsAPowerOf`` ``IsAPowerOf``
Takes an integer argument and when called as a validator, checks that the Takes an integer argument and when called as a validator, checks that the
field being validated is a power of the integer. field being validated is a power of the integer.