[Checkins] SVN: z3c.pt/trunk/ Move implementation-specific context setup to ``render`` method.

Malthe Borch mborch at gmail.com
Thu Jul 14 02:50:20 EDT 2011


Log message for revision 122205:
  Move implementation-specific context setup to ``render`` method.

Changed:
  U   z3c.pt/trunk/CHANGES.txt
  U   z3c.pt/trunk/src/z3c/pt/pagetemplate.py

-=-
Modified: z3c.pt/trunk/CHANGES.txt
===================================================================
--- z3c.pt/trunk/CHANGES.txt	2011-07-14 06:23:04 UTC (rev 122204)
+++ z3c.pt/trunk/CHANGES.txt	2011-07-14 06:50:20 UTC (rev 122205)
@@ -1,7 +1,9 @@
 Changelog
 =========
 
-In next release ...
+- Move implementation-specific context setup to ``render``
+  method. This allows use of template class with an already prepared
+  context.
 
 - Fixed issue with the call flag on the Zope traverser compiler.
 

Modified: z3c.pt/trunk/src/z3c/pt/pagetemplate.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/pagetemplate.py	2011-07-14 06:23:04 UTC (rev 122204)
+++ z3c.pt/trunk/src/z3c/pt/pagetemplate.py	2011-07-14 06:50:20 UTC (rev 122205)
@@ -70,45 +70,53 @@
     default_expression = "path"
 
     def bind(self, ob, request=None):
-        def render(target_language=None, request=request, **kwargs):
+        def render(request=request, **kwargs):
             context = self._pt_get_context(ob, request, kwargs)
-            request = request or context.get('request')
+            return self.render(**context)
+
+        return BoundPageTemplate(self, render)
+
+    def render(self, target_language=None, **context):
+        # We always include a ``request`` variable; it is (currently)
+        # depended on in various expression types and must be defined
+        request = context.setdefault('request', None)
+
+        if target_language is None:
+            if hasattr(request, "get"):
+                target_language = request.get("LANGUAGE", None)
             if target_language is None:
-                if hasattr(request, "get"):
-                    target_language = request.get("LANGUAGE", None)
-                if target_language is None:
-                    try:
-                        target_language = i18n.negotiate(request)
-                    except:
-                        target_language = None
+                try:
+                    target_language = i18n.negotiate(request)
+                except:
+                    target_language = None
 
-            context['target_language'] = target_language
-            context['path'] = self.evaluate_path
-            context['exists'] = self.evaluate_exists
+        context['target_language'] = target_language
+        context['path'] = self.evaluate_path
+        context['exists'] = self.evaluate_exists
 
-            # bind translation-method to request
-            def translate(
-                msgid, domain=None, mapping=None,
-                target_language=None, default=None):
-                if msgid is MV:
-                    # Special case handling of Zope2's Missing.MV
-                    # (Missing.Value) used by the ZCatalog but is
-                    # unhashable
-                    return
-                return fast_translate(
-                    msgid, domain, mapping, request, target_language, default)
-            context["translate"] = translate
+        # bind translation-method to request
+        def translate(
+            msgid, domain=None, mapping=None,
+            target_language=None, default=None):
+            if msgid is MV:
+                # Special case handling of Zope2's Missing.MV
+                # (Missing.Value) used by the ZCatalog but is
+                # unhashable
+                return
+            return fast_translate(
+                msgid, domain, mapping, request, target_language, default)
+        context["translate"] = translate
 
-            if request is not None and not isinstance(request, basestring):
-                content_type = self.content_type or 'text/html'
-                response = request.response
-                if response and not response.getHeader("Content-Type"):
-                    response.setHeader(
-                        "Content-Type", content_type)
+        if request is not None and not isinstance(request, basestring):
+            content_type = self.content_type or 'text/html'
+            response = request.response
+            if response and not response.getHeader("Content-Type"):
+                response.setHeader(
+                    "Content-Type", content_type)
 
-            return "".join(self.render(**context))
+        base_renderer = super(BaseTemplate, self).render
+        return base_renderer(**context)
 
-        return BoundPageTemplate(self, render)
 
     def __call__(self, *args, **kwargs):
         bound_pt = self.bind(self)



More information about the checkins mailing list