[Zapp-cvs-commit] ZApp ZApp_Base.py,1.16,1.17 ZApp_MiscData.py,1.8,1.9 __init__.py,1.12,1.13
Brought to you by:
sspickle
|
From: <ssp...@us...> - 2003-06-18 19:11:22
|
Update of /cvsroot/zapp/ZApp
In directory sc8-pr-cvs1:/tmp/cvs-serv13885
Modified Files:
ZApp_Base.py ZApp_MiscData.py __init__.py
Log Message:
added propertysheet and attribute providers to ZApp_Misc data so we can more easily store attributes in other places!
Index: ZApp_Base.py
===================================================================
RCS file: /cvsroot/zapp/ZApp/ZApp_Base.py,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** ZApp_Base.py 13 Jun 2003 13:59:52 -0000 1.16
--- ZApp_Base.py 18 Jun 2003 19:11:19 -0000 1.17
***************
*** 15,18 ****
--- 15,21 ----
from Products.ZPatterns.SkinScript.Components import Trigger, Compute
from ZApp_LOG import ZApp_LOG
+ from Products.ZPatterns.DataSkins import _v_dm_
+ from Products.ZPatterns.SheetProviders import SheetProvider
+ from OFS import PropertySheets
_marker = []
Index: ZApp_MiscData.py
===================================================================
RCS file: /cvsroot/zapp/ZApp/ZApp_MiscData.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** ZApp_MiscData.py 13 Jun 2003 13:59:53 -0000 1.8
--- ZApp_MiscData.py 18 Jun 2003 19:11:19 -0000 1.9
***************
*** 4,8 ****
from Products.ZApp.ZApp_LOG import ZApp_LOG
! from xmlrpclib import dumps, loads
import ZApp_Base
--- 4,18 ----
from Products.ZApp.ZApp_LOG import ZApp_LOG
! import xmlrpclib
!
! dumps, loads = xmlrpclib.dumps, xmlrpclib.loads
!
! from Products.ZPatterns.DataSkins import _v_dm_
! from Products.ZPatterns.SheetProviders import SheetProvider
! from Products.ZPatterns.AttributeProviders import AttributeProvider
! from OFS import PropertySheets
! from Products.PlugIns import defaultConstructors
!
! from DateTime import DateTime
import ZApp_Base
***************
*** 49,58 ****
def buildXML(self):
""" create the XML to represent this object."""
! result = dumps( (self._v_xmlDict,))
! return result
def getXMLAttr(self, attr, default=None, escNL=0):
""" get an XML based attribute."""
! return self._v_xmlDict.get(attr, default)
def XMLAttrs(self):
--- 59,79 ----
def buildXML(self):
""" create the XML to represent this object."""
! try:
! self.xml = dumps( (self._v_xmlDict,))
! except:
! import pdb
! pdb.set_trace()
!
! return self.xml
def getXMLAttr(self, attr, default=None, escNL=0):
""" get an XML based attribute."""
! value = self._v_xmlDict.get(attr, default)
! if isinstance(value, xmlrpclib.DateTime):
! value = value.value
! if len(value)>4 and value[4] != '-':
! value = '-'.join([value[:4],value[4:6],value[6:]])
! value = DateTime(value)
! return value
def XMLAttrs(self):
***************
*** 60,69 ****
return self._v_xmlDict.keys()
! def setXMLAttr(self, attr, value):
! """ set an XML attribute to a value."""
- d = self._v_xmlDict # getting _v_xmlDict insures the cache is setup
d[attr] = value
! self.xml = self.buildXML()
def setXMLAttrs(self, dict=None, **kw):
--- 81,97 ----
return self._v_xmlDict.keys()
! def _setXMLAttr(self, attr, value, d=None):
! if d is None:
! d = self._v_xmlDict # getting _v_xmlDict insures the cache is setup
!
! if isinstance(value, DateTime):
! value = xmlrpclib.DateTime(value.timeTime())
d[attr] = value
!
! def setXMLAttr(self, attr, value):
! """ set an XML attribute to a value."""
! selt._setXMLAttr( attr, value)
! self.buildXML()
def setXMLAttrs(self, dict=None, **kw):
***************
*** 80,86 ****
for k in saveDict.keys():
! d[k] = saveDict[k]
! self.xml = self.buildXML()
def storeInXML(self, obj, attr_list):
--- 108,114 ----
for k in saveDict.keys():
! self._setXMLAttr(k, saveDict[k], d)
! self.buildXML()
def storeInXML(self, obj, attr_list):
***************
*** 158,160 ****
--- 186,427 ----
return currentBag
+ def getDataPropertyManagers(self, withID=''):
+ """
+ return a list of propertyManagers in my 'miscDataDef' class extender..
+ """
+
+ result = []
+ myDM = self.__dict__[_v_dm_]
+ for provider in getattr(myDM,myDM.DataPlugins.attr):
+ if provider.meta_type == 'DataSkin Class Extender':
+ if withID:
+ thePropManager = getattr(provider, withID, None)
+ if thePropManager:
+ result = [thePropManager]
+ break
+ else:
+ thePropManagers = filter(lambda x,ha=hasattr: ha(x,'propertyMap'), provider.objectValues())
+ result += thePropManagers
+ return result
+
+ def getMiscDataObj(self, Manager=None, dataType=''):
+ """
+ get all of my misc data objects that have my manager, objectID, and (optionally) specified data type
+ """
+
+ if Manager is None:
+ Manager = self.miscDataManager
+
+ mds = self.getMiscDataSpecialist()
+ mdobs = mds and mds.ZApp_getItems( objectID=self.id, Manager=Manager, dataType=dataType)
+ return mdobs and mdobs[0]
+
+ def getObjectInfo(self):
+ """
+ return known attributes/values for object..
+ """
+ result = {'objectID':self.getId()}
+ for p in self._properties:
+ if p['id']:
+ val = getattr(self, p['id'])
+ if p['type'] != 'string':
+ val = `val`
+ result[p['id']] = val
+
+
+ result.update( self.getMiscDataFor( 'miscAttributes' ))
+
+ return result
+
ZApp_Base.extendProperties( ZApp_MiscData, props )
+
+ missing = []
+
+ class ZApp_MiscDataPropertySheetProvider( SheetProvider ):
+
+ meta_type='ZApp MiscData Property Sheet Provider'
+
+ def _PropertySheetFor(self, client, name='', xmlns=''):
+ """
+ return a propertysheet object that takes care of some set
+ of properties
+ """
+
+ propertyManager = getattr( client, 'PropSheetFor_' + name, None)
+
+ if propertyManager:
+ mdata = client.getMiscDataObj( dataType = name )
+ if not mdata:
+ mdata = client.setupMiscData( dataType = name )
+
+ return ZApp_MiscDataPropertySheet( name,
+ propertyManager,
+ ZApp_MiscDictProxy(client=mdata, defObj=propertyManager),
+ mdata)
+
+ def _PropertySheetsFor(self, client):
+ """Return a (possibly empty) list of PropertySheet objects for client"""
+ # Note: this could include duplicate sheets if persistent sheets
+ # are defined by more than one provider!
+
+ propertyManagers = client.getDataPropertyManagers()
+ result = []
+ if propertyManagers:
+ for pm in propertyManagers:
+ result.append(self._PropertySheetFor(client, pm.getId()))
+
+ return result
+
+ class ZApp_MiscDataAttributeProvider(AttributeProvider):
+
+ def namesForRegistration(self,container):
+ """
+ Return a tuple (readnames,writenames) where each is a sequence of attribute
+ names which this attribute provider supports reading and writing, respectively.
+ '*' may be included in either or both sequences, which means the provider will
+ be called if a more specific provider could not be found for a given attribute.
+ This is so that attribute providers can potentially create attributes
+ dynamically based on the requested name.
+ """
+ return {
+ 'provides':('attributes',),
+ 'setattr': self.Attributes,
+ 'getattr': self.Attributes,
+ }
+
+ def _AttributeFor(self,client,name,default=None):
+ """
+ Look for the information in the MiscData object..
+ """
+ if name not in self.Attributes:
+ return default
+
+ propSheet = getattr(client, 'PropSheetFor_' + self.propsheetname)
+ default = getattr(propSheet, name, '')
+ mdata = client.getMiscDataObj( dataType = self.propsheetname)
+
+ if not mdata:
+ return default
+ else:
+ value = mdata.getXMLAttr(name, missing)
+ if value is missing:
+ return default
+ else:
+ return value
+
+ def _SetAttributeFor(self,client,name,value):
+ """Set the attribute and return true if successful"""
+
+ propertyManager = getattr( client, 'PropSheetFor_' + self.propsheetname, None)
+
+ if propertyManager:
+ mdata = client.getMiscDataObj( dataType = name )
+ if not mdata:
+ return 0
+ else:
+ mdata.setXMLAttr(name, value)
+ return 1
+
+ # Class Metadata
+
+ meta_type='ZApp Misc Data Attribute Provider'
+
+ Attributes = ()
+ propsheetname = ''
+
+ _properties=(
+ {'id':'title', 'type': 'string', 'mode': 'w'},
+ {'id':'propsheetname', 'type': 'string', 'mode': 'w'},
+ {'id':'Attributes', 'type':'tokens', 'mode':''},
+ )
+
+ def manage_editProperties(self, REQUEST):
+ """
+ forward the method call to our superclass... but update our 'Attributes' property
+ while we're at it!
+ """
+ result = ZApp_MiscDataAttributeProvider.inheritedAttribute('manage_editProperties')(self, REQUEST)
+ myDM = self.aq_parent
+ propManAttr = 'PropSheetFor_' + self.propsheetname
+ for provider in getattr(myDM,myDM.DataPlugins.attr):
+ if provider.meta_type == 'DataSkin Class Extender':
+ propertyManager = getattr(provider, propManAttr, None)
+
+ if propertyManager:
+ pMap = propertyManager.propertyMap()
+ self.Attributes = tuple(filter(lambda x:x, map(lambda x: x.get('id',''), pMap)))
+ return result
+ else:
+ raise RuntimeError,("Can't find propertymanager named: '%s'" % propManAttr)
+
+ class ZApp_MiscDictProxy:
+
+ def __init__(self, client=None, defObj=None):
+ if client is not None:
+ self.__dict__['client'] = client
+ if defObj is not None:
+ self.__dict__['defObj'] = defObj
+
+ def getClient(self, name='client', createIfMissing=1):
+
+ client = self.__dict__.get(name,missing)
+ if client is missing:
+ client = {}
+ if createIfMissing:
+ self.__dict__[name] = client
+ return client
+
+ def __setattr__(self, attr, value):
+ self.getClient()._setXMLAttr(attr,value)
+
+ def __getattr__(self, attr, default=None):
+ ZApp_LOG("attemptng to get attribute: " + attr)
+ val = self.getClient().getXMLAttr(attr,default)
+ if val is default:
+ val = getattr(self.getClient(name='defObj'), attr, default)
+ return val
+
+ class ZApp_MiscDataPropertySheet (PropertySheets.FixedSchema):
+
+ def __init__(self, id, base, proxy, client, md=None):
+ ZApp_MiscDataPropertySheet.inheritedAttribute('__init__')(self, id, base, md)
+ self._base=base
+ self._proxy=proxy
+ self._client=client
+
+ def v_self(self):
+ return self._proxy
+
+ def manage_editProperties(self, REQUEST):
+ """Edit object properties via the web."""
+ result = ZApp_MiscDataPropertySheet.inheritedAttribute('manage_editProperties')(self, REQUEST)
+ self._client.buildXML()
+ return result
+
+ def manage_changeProperties(self, REQUEST=None, **kw):
+ """Change existing object properties by passing either a mapping
+ object of name:value pairs {'foo':6} or passing name=value
+ parameters."""
+
+ result = apply(ZApp_MiscDataPropertySheet.inheritedAttribute('manage_changeProperties'), (self, REQUEST), kw)
+ self._client.buildXML()
+ return result
+
+
+ def initialize(context):
+
+ context.registerPlugInClass(
+ ZApp_MiscDataPropertySheetProvider,
+ permission = 'Add Sheet Providers',
+ constructors = defaultConstructors(ZApp_MiscDataPropertySheetProvider,globals()),
+ icon = 'www_ui/sheetprov.gif'
+ )
+
+ context.registerPlugInClass(
+ ZApp_MiscDataAttributeProvider,
+ permission = 'Add Attribute Providers',
+ constructors = defaultConstructors(ZApp_MiscDataAttributeProvider,globals()),
+ icon = 'www_ui/attrprov.gif'
+ )
+
+
Index: __init__.py
===================================================================
RCS file: /cvsroot/zapp/ZApp/__init__.py,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** __init__.py 13 Jun 2003 13:59:53 -0000 1.12
--- __init__.py 18 Jun 2003 19:11:19 -0000 1.13
***************
*** 57,60 ****
--- 57,61 ----
ZApp_Application.initialize(context)
ZApp_LeverMethods.initialize(context)
+ ZApp_MiscData.initialize(context)
context.registerHelp()
|