1 from django
.core
.exceptions
import ObjectDoesNotExist
2 from django
.template
import Context
, RequestContext
, loader
3 from django
.contrib
.contenttypes
.models
import ContentType
4 from django
.contrib
.sites
.models
import Site
5 from django
import http
7 def shortcut(request
, content_type_id
, object_id
):
8 "Redirect to an object's page based on a content-type ID and an object ID."
9 # Look up the object, making sure it's got a get_absolute_url() function.
11 content_type
= ContentType
.objects
.get(pk
=content_type_id
)
12 obj
= content_type
.get_object_for_this_type(pk
=object_id
)
13 except ObjectDoesNotExist
:
14 raise http
.Http404
, "Content type %s object %s doesn't exist" % (content_type_id
, object_id
)
16 absurl
= obj
.get_absolute_url()
17 except AttributeError:
18 raise http
.Http404
, "%s objects don't have get_absolute_url() methods" % content_type
.name
20 # Try to figure out the object's domain, so we can do a cross-site redirect
23 # If the object actually defines a domain, we're done.
24 if absurl
.startswith('http://') or absurl
.startswith('https://'):
25 return http
.HttpResponseRedirect(absurl
)
29 # Otherwise, we need to introspect the object's relationships for a
30 # relation to the Site object
33 # First, look for an many-to-many relationship to sites
34 for field
in opts
.many_to_many
:
35 if field
.rel
.to
is Site
:
37 object_domain
= getattr(obj
, field
.name
).all()[0].domain
40 if object_domain
is not None:
43 # Next look for a many-to-one relationship to site
44 if object_domain
is None:
45 for field
in obj
._meta
.fields
:
46 if field
.rel
and field
.rel
.to
is Site
:
48 object_domain
= getattr(obj
, field
.name
).domain
49 except Site
.DoesNotExist
:
51 if object_domain
is not None:
54 # Fall back to the current site (if possible)
55 if object_domain
is None:
57 object_domain
= Site
.objects
.get_current().domain
58 except Site
.DoesNotExist
:
61 # If all that malarkey found an object domain, use it; otherwise fall back
62 # to whatever get_absolute_url() returned.
63 if object_domain
is not None:
64 protocol
= request
.is_secure() and 'https' or 'http'
65 return http
.HttpResponseRedirect('%s://%s%s' % (protocol
, object_domain
, absurl
))
67 return http
.HttpResponseRedirect(absurl
)
69 def page_not_found(request
, template_name
='404.html'):
76 The path of the requested URL (e.g., '/app/pages/bad_page/')
78 t
= loader
.get_template(template_name
) # You need to create a 404.html template.
79 return http
.HttpResponseNotFound(t
.render(RequestContext(request
, {'request_path': request
.path
})))
81 def server_error(request
, template_name
='500.html'):
88 t
= loader
.get_template(template_name
) # You need to create a 500.html template.
89 return http
.HttpResponseServerError(t
.render(Context({})))