From 3a0733e12c2b0a03f80ff828f49f2cf6a258c138 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Tue, 7 Nov 2006 04:29:07 +0000 Subject: [PATCH] Fixed #2364: added NumberIsInRange validator. Thanks, Matt McClanahan. git-svn-id: http://code.djangoproject.com/svn/django/trunk@4039 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/validators.py | 32 ++++++++++++++++++++++++++++++++ docs/forms.txt | 9 +++++++++ 2 files changed, 41 insertions(+) diff --git a/django/core/validators.py b/django/core/validators.py index 816b8af8a3..a2f3dc3bc3 100644 --- a/django/core/validators.py +++ b/django/core/validators.py @@ -353,6 +353,38 @@ class UniqueAmongstFieldsWithPrefix(object): if field_name != self.field_name and value == field_data: 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): """ >>> v = IsAPowerOf(2) diff --git a/docs/forms.txt b/docs/forms.txt index 4a4ba37289..1c683c44f7 100644 --- a/docs/forms.txt +++ b/docs/forms.txt @@ -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 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`` Takes an integer argument and when called as a validator, checks that the field being validated is a power of the integer.