[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