[CMF-checkins] CVS: Products/CMFCore - FSPropertiesObject.py:1.21
Jens Vagelpohl
jens at dataflake.org
Wed Mar 23 13:37:12 EST 2005
Update of /cvs-repository/Products/CMFCore
In directory cvs.zope.org:/tmp/cvs-serv24695
Added Files:
FSPropertiesObject.py
Log Message:
- re-adding
=== Products/CMFCore/FSPropertiesObject.py 1.20 => 1.21 ===
--- /dev/null Wed Mar 23 13:37:12 2005
+++ Products/CMFCore/FSPropertiesObject.py Wed Mar 23 13:37:12 2005
@@ -0,0 +1,145 @@
+##############################################################################
+#
+# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" Customizable properties that come from the filesystem.
+
+$Id$
+"""
+
+import Globals
+from AccessControl import ClassSecurityInfo
+from Acquisition import ImplicitAcquisitionWrapper
+from OFS.Folder import Folder
+from OFS.PropertyManager import PropertyManager
+from ZPublisher.Converters import get_converter
+
+from DirectoryView import registerFileExtension
+from DirectoryView import registerMetaType
+from FSObject import FSObject
+from permissions import ViewManagementScreens
+from utils import _dtmldir
+from utils import expandpath
+
+
+class FSPropertiesObject (FSObject, PropertyManager):
+ """FSPropertiesObjects simply hold properties."""
+
+ meta_type = 'Filesystem Properties Object'
+
+ manage_options = ({'label':'Customize', 'action':'manage_main'},)
+
+ security = ClassSecurityInfo()
+
+ security.declareProtected(ViewManagementScreens, 'manage_main')
+ manage_main = Globals.DTMLFile('custprops', _dtmldir)
+
+ # Declare all (inherited) mutating methods private.
+ security.declarePrivate('manage_addProperty')
+ security.declarePrivate('manage_editProperties')
+ security.declarePrivate('manage_delProperties')
+ security.declarePrivate('manage_changeProperties')
+ security.declarePrivate('manage_propertiesForm')
+ security.declarePrivate('manage_propertyTypeForm')
+ security.declarePrivate('manage_changePropertyTypes')
+
+ security.declareProtected(ViewManagementScreens, 'manage_doCustomize')
+ def manage_doCustomize(self, folder_path, RESPONSE=None):
+ """Makes a ZODB Based clone with the same data.
+
+ Calls _createZODBClone for the actual work.
+ """
+ # Overridden here to provide a different redirect target.
+
+ FSObject.manage_doCustomize(self, folder_path, RESPONSE)
+
+ if RESPONSE is not None:
+ fpath = tuple(folder_path.split('/'))
+ folder = self.restrictedTraverse(fpath)
+ RESPONSE.redirect('%s/%s/manage_propertiesForm' % (
+ folder.absolute_url(), self.getId()))
+
+ def _createZODBClone(self):
+ """Create a ZODB (editable) equivalent of this object."""
+ # Create a Folder to hold the properties.
+ obj = Folder()
+ obj.id = self.getId()
+ map = []
+ for p in self._properties:
+ # This should be secure since the properties come
+ # from the filesystem.
+ setattr(obj, p['id'], getattr(self, p['id']))
+ map.append({'id': p['id'],
+ 'type': p['type'],
+ 'mode': 'wd',})
+ obj._properties = tuple(map)
+
+ return obj
+
+ def _readFile(self, reparse):
+ """Read the data from the filesystem.
+
+ Read the file (indicated by exandpath(self._filepath), and parse the
+ data if necessary.
+ """
+
+ fp = expandpath(self._filepath)
+
+ file = open(fp, 'r') # not 'rb', as this is a text file!
+ try:
+ lines = file.readlines()
+ finally:
+ file.close()
+
+ map = []
+ lino=0
+
+ for line in lines:
+
+ lino = lino + 1
+ line = line.strip()
+
+ if not line or line[0] == '#':
+ continue
+
+ try:
+ propname, proptv = line.split(':',1)
+ #XXX multi-line properties?
+ proptype, propvstr = proptv.split( '=', 1 )
+ propname = propname.strip()
+ proptype = proptype.strip()
+ propvstr = propvstr.strip()
+ converter = get_converter( proptype, lambda x: x )
+ propvalue = converter( propvstr )
+ # Should be safe since we're loading from
+ # the filesystem.
+ setattr(self, propname, propvalue)
+ map.append({'id':propname,
+ 'type':proptype,
+ 'mode':'',
+ 'default_value':propvalue,
+ })
+ except:
+ raise ValueError, ( 'Error processing line %s of %s:\n%s'
+ % (lino,fp,line) )
+ self._properties = tuple(map)
+
+ if Globals.DevelopmentMode:
+ # Provide an opportunity to update the properties.
+ def __of__(self, parent):
+ self = ImplicitAcquisitionWrapper(self, parent)
+ self._updateFromFS()
+ return self
+
+Globals.InitializeClass(FSPropertiesObject)
+
+registerFileExtension('props', FSPropertiesObject)
+registerMetaType('Properties Object', FSPropertiesObject)
More information about the CMF-checkins
mailing list