[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