app/django/views/defaults.py
changeset 323 ff1a9aa48cfd
parent 54 03e267d67478
--- a/app/django/views/defaults.py	Tue Oct 14 12:36:55 2008 +0000
+++ b/app/django/views/defaults.py	Tue Oct 14 16:00:59 2008 +0000
@@ -1,75 +1,9 @@
-from django.core.exceptions import ObjectDoesNotExist
+from django import http
 from django.template import Context, RequestContext, loader
-from django.contrib.contenttypes.models import ContentType
-from django.contrib.sites.models import Site
-from django import http
-
-def shortcut(request, content_type_id, object_id):
-    "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 = ContentType.objects.get(pk=content_type_id)
-        obj = content_type.get_object_for_this_type(pk=object_id)
-    except ObjectDoesNotExist:
-        raise http.Http404, "Content type %s object %s doesn't exist" % (content_type_id, object_id)
-    try:
-        absurl = obj.get_absolute_url()
-    except AttributeError:
-        raise http.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://') or absurl.startswith('https://'):
-        return http.HttpResponseRedirect(absurl)
-
-    object_domain = None
-
-    # Otherwise, we need to introspect the object's relationships for a
-    # relation to the Site object
-    opts = obj._meta
-
-    # First, look for an many-to-many relationship to sites
-    for field in opts.many_to_many:
-        if field.rel.to is Site:
-            try:
-                object_domain = getattr(obj, field.name).all()[0].domain
-            except IndexError:
-                pass
-            if object_domain is not None:
-                break
-
-    # Next look for a many-to-one relationship to site
-    if object_domain is None:
-        for field in obj._meta.fields:
-            if field.rel and field.rel.to is Site:
-                try:
-                    object_domain = getattr(obj, field.name).domain
-                except Site.DoesNotExist:
-                    pass
-                if object_domain is not None:
-                    break
-
-    # Fall back to the current site (if possible)
-    if object_domain is None:
-        try:
-            object_domain = Site.objects.get_current().domain
-        except Site.DoesNotExist:
-            pass
-
-    # If all that malarkey found an object domain, use it; otherwise fall back
-    # to whatever get_absolute_url() returned.
-    if object_domain is not None:
-        protocol = request.is_secure() and 'https' or 'http'
-        return http.HttpResponseRedirect('%s://%s%s' % (protocol, object_domain, absurl))
-    else:
-        return http.HttpResponseRedirect(absurl)
 
 def page_not_found(request, template_name='404.html'):
     """
-    Default 404 handler, which looks for the requested URL in the redirects
-    table, redirects if found, and displays 404 page if not redirected.
+    Default 404 handler.
 
     Templates: `404.html`
     Context:
@@ -88,3 +22,14 @@
     """
     t = loader.get_template(template_name) # You need to create a 500.html template.
     return http.HttpResponseServerError(t.render(Context({})))
+
+def shortcut(request, content_type_id, object_id):
+    # TODO: Remove this in Django 2.0.
+    # This is a legacy view that depends on the contenttypes framework.
+    # The core logic was moved to django.contrib.contenttypes.views after
+    # Django 1.0, but this remains here for backwards compatibility.
+    # Note that the import is *within* this function, rather than being at
+    # module level, because we don't want to assume people have contenttypes
+    # installed.
+    from django.contrib.contenttypes.views import shortcut as real_shortcut
+    return real_shortcut(request, content_type_id, object_id)