[Checkins] SVN: z3c.jbot/trunk/z3c/jbot/__init__.py Fixed lookup-order and added attributes content_type and is_html.

Malthe Borch mborch at gmail.com
Tue Jul 15 08:11:07 EDT 2008


Log message for revision 88378:
  Fixed lookup-order and added attributes content_type and is_html.

Changed:
  U   z3c.jbot/trunk/z3c/jbot/__init__.py

-=-
Modified: z3c.jbot/trunk/z3c/jbot/__init__.py
===================================================================
--- z3c.jbot/trunk/z3c/jbot/__init__.py	2008-07-15 12:09:12 UTC (rev 88377)
+++ z3c.jbot/trunk/z3c/jbot/__init__.py	2008-07-15 12:11:07 UTC (rev 88378)
@@ -3,40 +3,54 @@
 import manager
 import utility
 
-NO_DEFAULT = object()
 PT_CLASSES = [PageTemplateFile]
 
 if utility.ZOPE_2:
-    from Products.PageTemplates.PageTemplateFile import PageTemplateFile as Z2PageTemplateFile
-    PT_CLASSES.append(Z2PageTemplateFile)
+    import Products.PageTemplates.PageTemplateFile
+    PT_CLASSES.append(Products.PageTemplates.PageTemplateFile.PageTemplateFile)
 
 class LayerProperty(property):
     """Layer-specific property class.
 
     Instance attributes are instance *and* layer-specific when defined
     using this property class.
+
+    Lookup order:
+
+      1. By layer
+      2. By instance
+      3. By class
+
+    This pattern takes into account that attributes may be set before
+    the property is defined on the class.
     """
     
-    def __init__(self, name):
+    def __init__(self, cls, name):
         self.name = name
-        self.default = getattr(PageTemplateFile, name, NO_DEFAULT)
+        self.default = getattr(cls, name, None)
         property.__init__(self, self._get, self._set)
         
     def _get(self, template):
+        key = self.name
         layer = utility.getLayer()
-        attributes = getattr(template, '_v_attrs', template.__dict__)
-        key = self.name
-        if (layer, key) in attributes:
-            return attributes[layer, key]
-
-        return self.default
+        attrs = getattr(template, '_v_attrs', template.__dict__)
+        if (layer, key) in attrs:
+            return attrs[layer, key]
+        return attrs.get(key) or template.__dict__.get(key) or self.default
     
     def _set(self, template, value):
+        key = self.name
         layer = utility.getLayer()
-        template.__dict__.setdefault('_v_attrs', {})[layer, self.name] = value
-        if self.default is NO_DEFAULT:
-            self.default = value
+        attrs = template.__dict__.get('_v_attrs')
+        if attrs is None:
+            attrs = template._v_attrs = {}
+
+        # set value
+        attrs[layer, key] = value
             
+        # set default value
+        attrs.setdefault(key, value)
+            
 # registration hook to template manager
 def jbot(func):
     def patch(self, *args, **kwargs):
@@ -53,5 +67,6 @@
 
     # munge per-layer attribute descriptors on class
     for name in ('_v_macros', '_v_program', '_v_cooked', '_v_errors',
-                 '_v_last_read', '_v_warning', '_text_', 'filename'):
-        setattr(pt_class, name, LayerProperty(name))
+                 '_v_last_read', '_v_warning', '_text_',
+                 'filename', 'content_type', 'is_html'):
+        setattr(pt_class, name, LayerProperty(pt_class, name))



More information about the Checkins mailing list