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):
(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):
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):
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'
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)