X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/0c94e37b081bc3aa3a903af6ad0b5eb76def7924..7515976d9cc927f6f72a191442c5788856f610fd:/validators.py diff --git a/validators.py b/validators.py index bc41d02..1e73c0b 100644 --- a/validators.py +++ b/validators.py @@ -1,5 +1,7 @@ from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ +from django.core.validators import RegexValidator +import re class TreeParentValidator(object): @@ -43,6 +45,7 @@ class TreeParentValidator(object): return self.static_message or _(u"A %s can't be its own parent." % self.instance.__class__.__name__) message = property(get_message) + class TreePositionValidator(object): code = 'invalid' @@ -75,3 +78,30 @@ class TreePositionValidator(object): def get_message(self): return self.static_message or _(u"A %s with that path (parent and slug) already exists." % self.obj_class.__name__) message = property(get_message) + + +class RedirectValidator(RegexValidator): + """Based loosely on the URLValidator, but no option to verify_exists""" + regex = re.compile( + r'^(?:https?://' # http:// or https:// + r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' #domain... + r'localhost|' #localhost... + r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip + r'(?::\d+)?' # optional port + r'(?:/?|[/?#]?\S+)|' + r'[^?#\s]\S*)$', + re.IGNORECASE) + message = _(u'Enter a valid absolute or relative redirect target') + + +class URLLinkValidator(RegexValidator): + """Based loosely on the URLValidator, but no option to verify_exists""" + regex = re.compile( + r'^(?:https?://' # http:// or https:// + r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' #domain... + r'localhost|' #localhost... + r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip + r'(?::\d+)?' # optional port + r'|)' # also allow internal links + r'(?:/?|[/?#]?\S+)$', re.IGNORECASE) + message = _(u'Enter a valid absolute or relative redirect target')