From c3377c1eae8c330e86999ce2b58dc8e7339f40cb Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Wed, 26 Oct 2005 14:01:53 +0000 Subject: [PATCH] Fixed shortcut redirect handler git-svn-id: http://code.djangoproject.com/svn/django/trunk@1012 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/defaults.py | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/django/views/defaults.py b/django/views/defaults.py index decc220cf7..45e5636c5a 100644 --- a/django/views/defaults.py +++ b/django/views/defaults.py @@ -1,10 +1,11 @@ from django.core.exceptions import Http404, ObjectDoesNotExist from django.core.template import Context, loader -from django.models.core import sites +from django.models.core import sites, contenttypes from django.utils import httpwrappers def shortcut(request, content_type_id, object_id): - from django.models.core import contenttypes + """Redirect to an object's page based on a content-type ID and an object ID""" + # Look up the object, making sure it's got a get_absolute_url() function. try: content_type = contenttypes.get_object(pk=content_type_id) obj = content_type.get_object_for_this_type(pk=object_id) @@ -14,25 +15,37 @@ def shortcut(request, content_type_id, object_id): absurl = obj.get_absolute_url() except AttributeError: raise Http404, "%s objects don't have get_absolute_url() methods" % content_type.name + + # Try to figure out the object's domain so we can do a cross-site redirect + # if necessary + + # If the object actually defines a domain, we're done. if absurl.startswith('http://'): return httpwrappers.HttpResponseRedirect(absurl) + object_domain = None + + # Next, look for an many-to-many relationship to sites if hasattr(obj, 'get_site_list'): site_list = obj.get_site_list() if site_list: object_domain = site_list[0].domain + + # Next, look for a many-to-one relationship to sites elif hasattr(obj, 'get_site'): try: object_domain = obj.get_site().domain except sites.SiteDoesNotExist: pass - try: - object_domain = sites.get_current().domain - except sites.SiteDoesNotExist: - pass - if not object_domain: - return httpwrappers.HttpResponseRedirect(absurl) - return httpwrappers.HttpResponseRedirect('http://%s%s' % (object_domain, absurl)) + + # Then, fall back to the current site (if possible) + else: + try: + object_domain = sites.get_current().domain + except sites.SiteDoesNotExist: + # Finally, give up and use a URL without the domain name + return httpwrappers.HttpResponseRedirect(obj.get_absolute_url()) + return httpwrappers.HttpResponseRedirect('http://%s%s' % (object_domain, obj.get_absolute_url())) def page_not_found(request): """