[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