Added redirect and link validators to allow internal-style absolute and relative...
authormelinath <stephen.r.burrows@gmail.com>
Thu, 17 Jun 2010 20:25:24 +0000 (16:25 -0400)
committermelinath <stephen.r.burrows@gmail.com>
Thu, 17 Jun 2010 20:25:24 +0000 (16:25 -0400)
models.py
validators.py

index f866ee6..0063c86 100644 (file)
--- a/models.py
+++ b/models.py
@@ -19,6 +19,7 @@ from django.template.loader import get_template
 from django.http import Http404, HttpResponse, HttpResponseServerError, HttpResponseRedirect
 from django.core.servers.basehttp import FileWrapper
 from django.conf import settings
+from philo.validators import URLRedirectValidator
 
 
 def register_value_model(model):
@@ -275,7 +276,7 @@ class Redirect(Node):
                (302, 'Temporary'),
                (301, 'Permanent'),
        )
-       target = models.URLField(help_text='Must be a valid, absolute URL (i.e. http://)')
+       target = models.CharField(max_length=200,validators=[URLRedirectValidator()])
        status_code = models.IntegerField(choices=STATUS_CODES, default=302, verbose_name='redirect type')
        
        def render_to_response(self, request, path=None, subpath=None):
index bc41d02..68ba293 100644 (file)
@@ -1,5 +1,7 @@
 from django.core.exceptions import ValidationError
 from django.utils.translation import ugettext_lazy as _
+from django.core.validators import URLValidator
+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,25 @@ 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 URLRedirectValidator(URLValidator):
+       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 redirects
+        r'(?:/?|[/?]?\S+)$', re.IGNORECASE)
+
+
+class URLLinkValidator(URLValidator):
+       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)