Factor out a getUniversalContext() function so that views that do not call
authorTodd Larsen <tlarsen@google.com>
Thu, 28 Aug 2008 22:06:31 +0000
changeset 116 68b5ce15fff9
parent 115 d55ee63603cd
child 117 6e44a4478ece
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
app/soc/views/helpers/response_helpers.py
--- 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