Factor out a getUniversalContext() function so that views that do not call
response_helpers.response() can benefit from the code that constructs shared
template context variables common to many templates.
Patch by: Todd Larsen
Review by: to-be-reviewed
--- a/app/soc/views/helpers/response_helpers.py Thu Aug 28 21:49:53 2008 +0000
+++ b/app/soc/views/helpers/response_helpers.py Thu Aug 28 22:06:31 2008 +0000
@@ -18,17 +18,16 @@
"""
__authors__ = [
+ '"Todd Larsen" <tlarsen@google.com>',
'"Pawel Solyga" <pawel.solyga@gmail.com>',
]
-import os
from google.appengine.api import users
+
from django import http
from django import shortcuts
-IS_DEV = os.environ['SERVER_SOFTWARE'].startswith('Dev')
-
# DeadlineExceededError can live in two different places
try:
# When deployed
@@ -37,31 +36,28 @@
# In the development server
from google.appengine.runtime.apiproxy_errors import DeadlineExceededError
-def respond(request, template, params=None):
+from soc.logic import system
+from soc.logic.site import id_user
+
+
+def respond(request, template, context=None):
"""Helper to render a response, passing standard stuff to the response.
Args:
- request: The request object.
- template: The template name; '.html' is appended automatically.
- params: A dict giving the template parameters; modified in-place.
+ request: the Django HTTP request object
+ template: the template (or search list of templates) to render
+ context: the context supplied to the template (implements dict)
Returns:
- Whatever render_to_response(template, params) returns.
+ django.shortcuts.render_to_response(template, context) results
Raises:
- Whatever render_to_response(template, params) raises.
+ Whatever django.shortcuts.render_to_response(template, context) raises.
"""
- if params is None:
- params = {}
-
- params['request'] = request
- params['id'] = users.get_current_user()
- params['is_admin'] = users.is_current_user_admin()
- params['is_dev'] = IS_DEV
- params['sign_in'] = users.create_login_url(request.path)
- params['sign_out'] = users.create_logout_url(request.path)
+ context = getUniversalContext(request, context=context)
+
try:
- return shortcuts.render_to_response(template, params)
+ return shortcuts.render_to_response(template, context)
except DeadlineExceededError:
logging.exception('DeadlineExceededError')
return http.HttpResponse('DeadlineExceededError')
@@ -70,4 +66,48 @@
return http.HttpResponse('MemoryError')
except AssertionError:
logging.exception('AssertionError')
- return http.HttpResponse('AssertionError')
\ No newline at end of file
+ return http.HttpResponse('AssertionError')
+
+
+def getUniversalContext(request, context=None):
+ """Constructs a template context dict will many common variables defined.
+
+ Args:
+ request: the Django HTTP request object
+ context: the template context dict to be updated in-place (pass in a copy
+ if the original must not be modified), or None if a new one is to be
+ created; any existing fields already present in the context dict passed
+ in by the caller are left unaltered
+
+ Returns:
+ updated template context dict supplied by the caller, or a new context
+ dict if the caller supplied None
+
+ {
+ 'request': the Django HTTP request object passed in by the caller
+ 'id': the logged-in Google Account if there is one
+ 'user': the User entity corresponding to the Google Account in
+ context['id']
+ 'is_admin': True if users.is_current_user_admin() is True
+ 'is_debug': True if system.isDebug() is True
+ 'sign_in': a Google Account login URL
+ 'sign_out': a Google Account logout URL
+ }
+ """
+ if context is None:
+ context = {}
+
+ # set some universal values if caller did not already set them
+ context['request'] = context.get('request', request)
+ context['id'] = id_user.getIdIfMissing(context.get('id', None))
+ context['user'] = id_user.getUserIfMissing(context.get('user', None),
+ context['id'])
+ context['is_admin'] = context.get(
+ 'is_admin', users.is_current_user_admin())
+ context['is_debug'] = context.get('is_debug', system.isDebug())
+ context['sign_in'] = context.get(
+ 'sign_in', users.create_login_url(request.path))
+ context['sign_out'] = context.get(
+ 'sign_out', users.create_logout_url(request.path))
+
+ return context