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 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):
 
 
 def register_value_model(model):
@@ -275,7 +276,7 @@ class Redirect(Node):
                (302, 'Temporary'),
                (301, 'Permanent'),
        )
                (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):
        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.exceptions import ValidationError
 from django.utils.translation import ugettext_lazy as _
+from django.core.validators import URLValidator
+import re
 
 
 class TreeParentValidator(object):
 
 
 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)
        
                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'
        
 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)
        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)