[Checkins] SVN: grok/branches/regebro-guido-templates/src/grok/components.py Also refactored the Zope Page Templates to fit the new story. Two more

Lennart Regebro regebro at gmail.com
Sat Nov 3 13:06:22 EDT 2007


Log message for revision 81435:
  Also refactored the Zope Page Templates to fit the new story. Two more 
  classes, but less code.
  

Changed:
  U   grok/branches/regebro-guido-templates/src/grok/components.py

-=-
Modified: grok/branches/regebro-guido-templates/src/grok/components.py
===================================================================
--- grok/branches/regebro-guido-templates/src/grok/components.py	2007-11-03 16:34:06 UTC (rev 81434)
+++ grok/branches/regebro-guido-templates/src/grok/components.py	2007-11-03 17:06:22 UTC (rev 81435)
@@ -129,7 +129,8 @@
         return {}
 
     def __getitem__(self, key):
-        if getattr(self.template, 'macros', None) is None:
+        # This is BBB code for Zope page templates only:
+        if not isinstance(self.template, PageTemplate):
             raise AttributeError("View has no item %s" % key)
         # When this deprecation is done with, this whole __getitem__ can 
         # be removed.
@@ -137,7 +138,7 @@
                       "Please use view/@@viewname/macros/macroname\n"
                       "View %r, macro %s" % (self, key),
                       DeprecationWarning)
-        return self.template.macros[key]
+        return self.template.getTemplate().macros[key]
     
     def url(self, obj=None, name=None):
         # if the first argument is a string, that's the name. There should
@@ -222,7 +223,8 @@
         # __grok_module__ is needed to make defined_locally() return True for
         # inline templates
         # XXX unfortunately using caller_module means that care must be taken
-        # when GrokTemplate is subclassed.
+        # when GrokTemplate is subclassed. You can in fact not override 
+        # __init__ unless you override all of it.
         self.__grok_module__ = martian.util.caller_module()
         
         if not (template is None) ^ (filename is None):
@@ -265,76 +267,44 @@
     def getTemplate(self):
         return self._template
 
+class TrustedPageTemplate(TrustedAppPT, pagetemplate.PageTemplate):
+    pass
 
-class PageTemplate(BaseTemplate, TrustedAppPT, pagetemplate.PageTemplate):
-    expand = 0
+class TrustedFilePageTemplate(TrustedAppPT, pagetemplatefile.PageTemplateFile):
+    pass
 
-    def __init__(self, template):
-        super(PageTemplate, self).__init__()
+class PageTemplate(GrokTemplate):
+    
+    def fromTemplate(self, template):
+        zpt = TrustedPageTemplate()
         if martian.util.not_unicode_or_ascii(template):
             raise ValueError("Invalid page template. Page templates must be "
                              "unicode or ASCII.")
-        self.write(template)
+        zpt.write(template)
+        return zpt
 
-        # __grok_module__ is needed to make defined_locally() return True for
-        # inline templates
-        # XXX unfortunately using caller_module means that
-        # PageTemplate cannot be subclassed
-        self.__grok_module__ = martian.util.caller_module()
+    def fromFile(self, filename, _prefix=None):
+        #_prefix = PageTemplateFile.get_path_from_prefix(_prefix)
+        return TrustedFilePageTemplate(filename, _prefix)
 
     def _initFactory(self, factory):
-        factory.macros = self.macros
+        factory.macros = self.getTemplate().macros
 
-    def namespace(self, view):
-        namespace = {}
-        namespace['request'] = view.request
-        namespace['view'] = view
-        namespace['context'] = view.context
-        # XXX need to check whether we really want to put None here if missing
-        namespace['static'] = view.static
-        
-        namespace.update(self.pt_getContext())
-        return namespace
-
     def render(self, view):
-        namespace = self.namespace(view)
-        namespace.update(view.namespace())
-        return self.pt_render(namespace)
-
-
-class PageTemplateFile(BaseTemplate, TrustedAppPT,
-                       pagetemplatefile.PageTemplateFile):
+        namespace = self.getNamespace(view)
+        template = self.getTemplate()
+        namespace.update(template.pt_getContext())
+        return template.pt_render(namespace)
     
+class PageTemplateFile(PageTemplate):
+    # For BBB
     def __init__(self, filename, _prefix=None):
-        _prefix = self.get_path_from_prefix(_prefix)
-        super(PageTemplateFile, self).__init__(filename, _prefix)
-
-        # __grok_module__ is needed to make defined_locally() return True for
-        # inline templates
-        # XXX unfortunately using caller_module means that
-        # PageTemplateFile cannot be subclassed
         self.__grok_module__ = martian.util.caller_module()
+        if _prefix is None:
+            module = sys.modules[self.__grok_module__]
+            _prefix = os.path.dirname(module.__file__)
+        self._template = self.fromFile(filename, _prefix)
     
-    def _initFactory(self, factory):
-        factory.macros = self.macros
-
-    def namespace(self, view):
-        namespace = {}
-        namespace['request'] = view.request
-        namespace['view'] = view
-        namespace['context'] = view.context
-        # XXX need to check whether we really want to put None here if missing
-        namespace['static'] = view.static
-        
-        namespace.update(self.pt_getContext())
-        return namespace
-
-    def render(self, view):
-        namespace = self.namespace(view)
-        namespace.update(view.namespace())
-        return self.pt_render(namespace)
-
-    
 class DirectoryResource(directoryresource.DirectoryResource):
     # We subclass this, because we want to override the default factories for
     # the resources so that .pt and .html do not get created as page



More information about the Checkins mailing list