[Checkins] SVN: z3ext.skintool/trunk/src/z3ext/skintool/ added custom field property
Nikolay Kim
fafhrd91 at gmail.com
Thu Jul 16 08:29:01 EDT 2009
Log message for revision 101945:
added custom field property
Changed:
U z3ext.skintool/trunk/src/z3ext/skintool/skindatatype.py
U z3ext.skintool/trunk/src/z3ext/skintool/tool.py
-=-
Modified: z3ext.skintool/trunk/src/z3ext/skintool/skindatatype.py
===================================================================
--- z3ext.skintool/trunk/src/z3ext/skintool/skindatatype.py 2009-07-16 08:27:55 UTC (rev 101944)
+++ z3ext.skintool/trunk/src/z3ext/skintool/skindatatype.py 2009-07-16 12:29:00 UTC (rev 101945)
@@ -19,7 +19,6 @@
from zope.schema import getFields
from persistent import Persistent
from zope.app.container.contained import Contained
-from zope.schema.fieldproperty import FieldProperty
from interfaces import _
from z3ext.controlpanel.storage import ConfigletData
@@ -30,17 +29,57 @@
_marker = object()
+class SkinData(object):
+
+ __data__ = None
+
+ def __init__(self, data):
+ self.__data__ = data
+
+
+class ConfigProperty(object):
+
+ def __init__(self, field, name=None):
+ if name is None:
+ name = field.__name__
+
+ self.__field = field
+ self.__name = name
+
+ def __get__(self, inst, klass):
+ if inst is None:
+ return self
+
+ value = inst.__data__.get(self.__name, _marker)
+ if value is _marker:
+ return self.__field.default
+
+ return value
+
+ def __set__(self, inst, value):
+ field = self.__field.bind(inst)
+ field.validate(value)
+ if field.readonly and \
+ inst.__data__.get(self.__name, _marker) is not _marker:
+ raise ValueError(self.__name, _(u'Field is readonly'))
+
+ inst.__data__[self.__name] = value
+
+ def __delete__(self, inst):
+ del inst.__data__[self.__name]
+
+
class SkinDataType(type):
""" Metaclass for skin data """
def __new__(cls, name, schema, class_=None, *args, **kw):
cname = 'SkinData<%s>'%name
if type(class_) is tuple:
- bases = class_ + (Persistent, Contained,)
+ bases = class_ + (SkinData,)
elif class_ is not None:
- bases = (class_, Persistent, Contained)
+ bases = (class_, SkinData)
else:
- bases = (Persistent, Contained,)
+ bases = (SkinData,)
tp = type.__new__(cls, str(cname), bases, {})
setattr(sys.modules['z3ext.skintool.skindatatype'], cname, tp)
@@ -50,7 +89,7 @@
def __init__(cls, name, schema, class_=None, title='', description=''):
for f_id in getFields(schema):
if not hasattr(cls, f_id):
- setattr(cls, f_id, FieldProperty(schema[f_id]))
+ setattr(cls, f_id, ConfigProperty(schema[f_id]))
cls.__id__ = unicode(name)
cls.__title__ = title
Modified: z3ext.skintool/trunk/src/z3ext/skintool/tool.py
===================================================================
--- z3ext.skintool/trunk/src/z3ext/skintool/tool.py 2009-07-16 08:27:55 UTC (rev 101944)
+++ z3ext.skintool/trunk/src/z3ext/skintool/tool.py 2009-07-16 12:29:00 UTC (rev 101945)
@@ -15,6 +15,8 @@
$Id$
"""
+from BTrees import OOBTree
+
from zope import interface, component
from zope.component import getSiteManager
from zope.component import getUtility, getAdapters, getUtilitiesFor
@@ -89,10 +91,10 @@
skin = skins_byname.get(self.skin)
if skin:
data = self.data.get('skinData')
- if data is None:
- data = skins_registry[skin][-1]()
+ if data is None or not isinstance(data, OOBTree.OOBTree):
+ data = OOBTree.OOBTree()
self.data['skinData'] = data
- return data
+ return skins_registry[skin][-1](data)
return None
More information about the Checkins
mailing list