[Checkins] SVN: Products.FSDump/trunk/ Egg structure.

Tres Seaver tseaver at palladion.com
Sun Feb 22 11:36:11 EST 2009


Log message for revision 97104:
  Egg structure.

Changed:
  D   Products.FSDump/trunk/Dumper.py
  A   Products.FSDump/trunk/Products/
  A   Products.FSDump/trunk/Products/FSDump/
  A   Products.FSDump/trunk/Products/FSDump/Dumper.py
  A   Products.FSDump/trunk/Products/FSDump/README.txt
  A   Products.FSDump/trunk/Products/FSDump/__init__.py
  A   Products.FSDump/trunk/Products/FSDump/help/
  A   Products.FSDump/trunk/Products/FSDump/interfaces/
  A   Products.FSDump/trunk/Products/FSDump/version.txt
  A   Products.FSDump/trunk/Products/FSDump/www/
  A   Products.FSDump/trunk/Products/__init__.py
  D   Products.FSDump/trunk/README.txt
  D   Products.FSDump/trunk/__init__.py
  D   Products.FSDump/trunk/help/
  D   Products.FSDump/trunk/interfaces/
  D   Products.FSDump/trunk/version.txt
  D   Products.FSDump/trunk/www/

-=-
Deleted: Products.FSDump/trunk/Dumper.py
===================================================================
--- Products.FSDump/trunk/Dumper.py	2009-02-22 15:55:50 UTC (rev 97103)
+++ Products.FSDump/trunk/Dumper.py	2009-02-22 16:36:11 UTC (rev 97104)
@@ -1,623 +0,0 @@
-""" Classes: Dumper
-
-$Id$
-"""
-import os
-
-from AccessControl import ClassSecurityInfo
-from Globals import DTMLFile
-from Globals import package_home
-from Globals import InitializeClass
-from OFS.SimpleItem import SimpleItem
-from Products.PageTemplates.PageTemplateFile import PageTemplateFile
-from ZODB.POSException import ConflictError
-
-_wwwdir = os.path.join( package_home( globals() ), 'www' )
-
-addDumperForm = PageTemplateFile( 'addDumper', _wwwdir )
-
-USE_DUMPER_PERMISSION = 'Use Dumper'
-
-def addDumper( self, id, fspath=None, use_metadata_file=0, REQUEST=None ):
-    """
-    """
-    dumper = Dumper()
-    dumper.id = id
-    dumper.edit( fspath, use_metadata_file )
-    self._setObject( id, dumper )
-
-    if REQUEST is not None:
-        REQUEST[ 'RESPONSE' ].redirect( 'manage_main' )
-
-class Dumper( SimpleItem ):
-    """
-    """
-    meta_type = 'Dumper'
-
-    manage_options = ( { 'label'    : 'Edit'
-                       , 'action'   : 'editForm'
-                       , 'help'     : ('FSDump' ,'Dumper_editForm.stx')
-                       }
-                     , { 'label'    : 'Security'
-                       , 'action'   : 'manage_access'
-                       , 'help'     : ('OFSP','Security_Define-Permissions.stx')
-                       }
-                     )
-
-    security = ClassSecurityInfo()
-    
-    fspath = None
-    use_metadata_file = 0
-
-    #
-    #   Management interface methods.
-    #
-    index_html = None
-
-    security.declareProtected( USE_DUMPER_PERMISSION, 'editForm' )
-    editForm = PageTemplateFile( 'editDumper', _wwwdir )
-
-    security.declareProtected( USE_DUMPER_PERMISSION, 'edit' )
-    def edit( self, fspath, use_metadata_file, REQUEST=None ):
-        """
-            Update the path to which we will dump our peers.
-        """
-        self._setFSPath( fspath )
-        self.use_metadata_file = use_metadata_file
-
-        if REQUEST is not None:
-            REQUEST['RESPONSE'].redirect( self.absolute_url()
-                                        + '/editForm'
-                                        + '?manage_tabs_message=Dumper+updated.'
-                                        )
-
-    security.declareProtected( USE_DUMPER_PERMISSION, 'dumpToFS' )
-    def dumpToFS( self, REQUEST=None ):
-        """
-            Iterate recursively over our peers, creating simulacra
-            of them on the filesystem in 'fspath'
-        """
-        if REQUEST and REQUEST.form.has_key( 'fspath' ):
-            self._setFSPath( REQUEST.form[ 'fspath' ] )
-
-        parent = self.aq_parent.aq_base
-        if getattr(parent, 'isTopLevelPrincipiaApplicationObject', 0):
-            self._dumpRoot( self.aq_parent )
-        else:
-            self._dumpFolder( self.aq_parent )
-
-        if REQUEST is not None:
-            REQUEST['RESPONSE'].redirect( self.absolute_url()
-                                        + '/editForm'
-                                        + '?manage_tabs_message=Peers+dumped.'
-                                        )
- 
-    #
-    #   Utility methods
-    #
-    security.declarePrivate( '_setFSPath' )
-    def _setFSPath( self, fspath ):
-        #   Canonicalize fspath.
-        fspath = os.path.normpath( fspath )
-        if not os.path.isabs( fspath ):
-            raise "Dumper Error", "Path must be absolute."
-        self.fspath = fspath
-
-    security.declarePrivate( '_buildPathString' )
-    def _buildPathString( self, path=None ):
-        #   Construct a path string, relative to self.fspath.
-        if self.fspath is None:
-           raise "Dumper Error", "Path not set."
-
-        if path is None:
-            path = self.fspath
-        else:
-            path = os.path.normpath( os.path.join( self.fspath, path ) )
-        
-        return path
-
-    security.declarePrivate( '_checkFSPath' )
-    def _checkFSPath( self, path=None ):
-        #   Ensure that fspath/path exists.
-        path = self._buildPathString( path )
-
-        if not os.path.exists( path ):
-            os.makedirs( path )
-        
-        return path
-
-    security.declarePrivate( '_createFile' )
-    def _createFile( self, path, filename, mode='w' ):
-        #   Create/replace file;  return the file object.
-        fullpath = "%s/%s" % ( self._checkFSPath( path ), filename )
-        return open( fullpath, mode )
-
-    security.declarePrivate( '_createMetadataFile' )
-    def _createMetadataFile( self, path, filename, mode='w' ):
-        #   Create/replace file;  return the file object.
-        extension = self.use_metadata_file and 'metadata' or 'properties'
-        fullpath = "%s/%s.%s" % ( self._checkFSPath( path )
-                                , filename, extension )
-        file = open( fullpath, mode )
-        if self.use_metadata_file:
-            print >> file, "[default]"
-        else:
-            print >> file, "[Default]"
-        return file
-    
-    security.declarePrivate( '_dumpObject' )
-    def _dumpObject( self, object, path=None ):
-        #   Dump one item, using path as prefix.
-        try:
-            handler = self._handlers.get( object.meta_type, None )
-            if handler is not None:
-                handler( self, object, path )
-                return 1
-        except ConflictError:
-            raise
-        except:
-            return -1
-        return 0
-            
-
-    security.declarePrivate( '_dumpObjects' )
-    def _dumpObjects( self, objects, path=None ):
-        #   Dump each item, using path as prefix.
-        dumped = []
-        for object in objects:
-            if self._dumpObject( object, path ) > 0:
-                id = object.id
-                if callable( id ):
-                    id = id()
-                dumped.append( ( id, object.meta_type ) )
-        return dumped
-
-
-    security.declarePrivate( '_writeProperties' )
-    def _writeProperties( self, obj, file ):
-        propIDs = obj.propertyIds()
-        propIDs.sort()  # help diff out :)
-        for propID in propIDs:
-            type = obj.getPropertyType( propID )
-            value = obj.getProperty( propID )
-            if self.use_metadata_file and type=='string':
-                file.write( '%s=%s\n' % ( propID, value ) )
-            else:
-                file.write( '%s:%s=%s\n' % ( propID, type, value ) )
-
-    #
-    #   Type-specific dumpers
-    #
-    security.declarePrivate( '_dumpRoot' )
-    def _dumpRoot( self, obj ):
-        self._dumpObjects( obj.objectValues() )
-
-    security.declarePrivate( '_dumpFolder' )
-    def _dumpFolder( self, obj, path=None ):
-        #   Recurse to dump items in a folder.
-        if path is None:
-            path = ''
-        path = os.path.join( path, obj.id )
-        file = self._createMetadataFile( path, '' )
-        self._writeProperties( obj, file )
-        dumped = self._dumpObjects( obj.objectValues(), path )
-        dumped.sort() # help diff out :)
-
-        if self.use_metadata_file:
-            print >> file, "\n[Objects]"
-        else:
-            file.close()
-            file = self._createFile( path, '.objects' )
-
-        for id, meta in dumped:
-            file.write( '%s:%s\n' % ( id, meta ) )
-        file.close()
-
-    security.declarePrivate( '_dumpDTML' )
-    def _dumpDTML( self, obj, path=None, suffix='dtml' ):
-        #   Dump obj (assumed to be a DTML Method/Document) to the
-        #   filesystem as a file, appending 'suffix' to the name.
-        peer_id = obj.id()
-        file = self._createFile( path, '%s.%s' % ( peer_id, suffix ) )
-        text = obj.raw
-        if text[-1] != '\n':
-            text = '%s\n' % text
-        file.write( text )
-        file.close()
-
-    security.declarePrivate( '_dumpSecurityInfo' )
-    def _dumpSecurityInfo(self, obj, file):
-        if getattr(obj.aq_base, '_proxy_roles', None):
-            file.write('proxy=%s\n' % ','.join(obj._proxy_roles))
-        security_header_written = 0
-        valid_roles = obj.valid_roles()
-        for perm_dict in obj.permission_settings():
-            perm_name = perm_dict['name']
-            acquire = (perm_dict['acquire'] and 1) or 0
-            roles = []
-            for role_idx in range(len(valid_roles)):
-                if perm_dict['roles'][role_idx]['checked']:
-                    roles.append(valid_roles[role_idx])
-            if roles or (acquire==0):
-                if not security_header_written:
-                    security_header_written = 1
-                    file.write('\n[security]\n')
-                file.write('%s=%d:%s\n' % (perm_name, acquire, ','.join(roles)))
-
-    security.declarePrivate( '_dumpDTMLMethod' )
-    def _dumpDTMLMethod( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a DTML Method) to the
-        #   filesystem as a file, with the accompanyting properties file.
-        self._dumpDTML( obj, path )
-        file = self._createMetadataFile( path, '%s.dtml' % obj.id() )
-        if self.use_metadata_file:
-            file.write( 'title=%s\n' % obj.title )
-            self._dumpSecurityInfo(obj, file)
-        else:
-            file.write( 'title:string=%s\n' % obj.title )
-        file.close()
-
-    security.declarePrivate( '_dumpZWikiPage' )
-    def _dumpZWikiPage( self, obj, path=None, suffix='zwiki' ):
-        peer_id = obj.id()
-        file = self._createFile( path, '%s.%s' % ( peer_id, suffix ) )
-        text = obj.text()
-        if text[-1] != '\n':
-            text = '%s\n' % text
-        file.write( text )
-        file.close()
-
-        if self.use_metadata_file:
-            file = self._createMetadataFile( path, '%s.%s' % ( peer_id,suffix))
-            self._writeProperties( obj, file )
-            self._dumpSecurityInfo(obj, file)
-            file.close()
-
-    security.declarePrivate( '_dumpDTMLDocument' )
-    def _dumpDTMLDocument( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a DTML Document) to the
-        #   filesystem as a file, with the accompanyting properties file.
-        self._dumpDTML( obj, path )
-        file = self._createMetadataFile( path, '%s.dtml' % obj.id() )
-        self._writeProperties( obj, file )
-        file.close()
-
-    security.declarePrivate( '_dumpExternalMethod' )
-    def _dumpExternalMethod( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be an Externa Method) to the
-        #   filesystem as a file.
-        file = self._createMetadataFile( path, '%s.em' % obj.id )
-        if self.use_metadata_file:
-            file.write( 'title=%s\n' % obj.title )
-            file.write( 'module=%s\n' % obj._module )
-            file.write( 'function=%s\n' % obj._function )
-            self._dumpSecurityInfo(obj, file)
-        else:
-            file.write( 'title:string=%s\n' % obj.title )
-            file.write( 'module:string=%s\n' % obj._module )
-            file.write( 'function:string=%s\n' % obj._function )
-        file.close()
-
-    security.declarePrivate( '_dumpFileOrImage' )
-    def _dumpFileOrImage( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be an Externa Method) to the
-        #   filesystem as a file, with the accompanyting properties file.
-        file = self._createMetadataFile( path, '%s' % obj.id() )
-        if self.use_metadata_file:
-            file.write( 'title=%s\n' % obj.title )
-            file.write( 'content_type=%s\n' % obj.content_type )
-            file.write( 'precondition=%s\n' % obj.precondition )
-        else:
-            file.write( 'title:string=%s\n' % obj.title )
-            file.write( 'content_type:string=%s\n' % obj.content_type )
-            file.write( 'precondition:string=%s\n' % obj.precondition )
-        file.close()
-        file = self._createFile( path, obj.id(), 'wb' )
-        data = obj.data
-        if type( data ) == type( '' ):
-            file.write( data )
-        else:
-            while data is not None:
-                file.write( data.data )
-                data = data.next
-        file.close()
-
-    security.declarePrivate( '_dumpPythonMethod' )
-    def _dumpPythonMethod( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a Python Method) to the
-        #   filesystem as a file, with the accompanyting properties file.
-        body_lines = obj._body.split( '\n' )
-        body = '\n    '.join( body_lines ) 
-        text = "def %s(%s)\n\n    %s" % ( obj.id, obj._params, body )
-        if text[-1] != '\n':
-            text = '%s\n' % text
-        file = self._createFile( path, '%s.py' % obj.id )
-        file.write( text )
-        file.close()
-        file = self._createMetadataFile( path, '%s.py' % obj.id )
-        if self.use_metadata_file:
-            file.write( 'title=%s\n' % obj.title )
-            self._dumpSecurityInfo(obj, file)
-        else:
-            file.write( 'title:string=%s\n' % obj.title )
-        file.close()
-
-    security.declarePrivate( '_dumpPythonScript' )
-    def _dumpPythonScript( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a Python Script) to the
-        #   filesystem as a file, with the accompanyting properties file.
-        file = self._createFile( path, '%s.py' % obj.id )
-        file.write( obj.read() )
-        file.close()
-        file = self._createMetadataFile( path, '%s.py' % obj.id )
-        if self.use_metadata_file:
-            file.write( 'title=%s\n' % obj.title )
-            self._dumpSecurityInfo(obj, file)
-        else:
-            file.write( 'title:string=%s\n' % obj.title )
-        file.close()
-
-    security.declarePrivate( '_dumpControllerPythonScript' )
-    def _dumpControllerPythonScript( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a Python Script) to the
-        #   filesystem as a file, with the accompanyting properties file.
-        file = self._createFile( path, '%s.cpy' % obj.id )
-        file.write( obj.read() )
-        file.close()
-        file = self._createMetadataFile( path, '%s.cpy' % obj.id )
-        file.write( 'title:string=%s\n' % obj.title )
-        file.close()
-
-    security.declarePrivate( '_dumpValidatorScript' )
-    def _dumpValidatorScript( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a Controller Validator) to the
-        #   filesystem as a file, with the accompanyting properties file.
-        file = self._createFile( path, '%s.vpy' % obj.id )
-        file.write( obj.read() )
-        file.close()
-        file = self._createMetadataFile( path, '%s.vpy' % obj.id )
-        file.write( 'title:string=%s\n' % obj.title )
-        file.close()
-
-    security.declarePrivate( '_dumpControllerPageTemplate' )
-    def _dumpControllerPageTemplate( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a ZopeControllerPageTemplate) to the
-        #   filesystem as a file, with the accompanyting properties file.
-        file = self._createFile( path, '%s.cpt' % obj.id )
-        file.write( obj.read() )
-        file.close()
-        file = self._createMetadataFile( path, '%s.cpt' % obj.id )
-        file.write( 'title:string=%s\n' % obj.title )
-        file.close()
-
-    security.declarePrivate( '_dumpPageTemplate' )
-    def _dumpPageTemplate( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a ZopePageTemplate) to the
-        #   filesystem as a file, with the accompanyting properties file.
-        file = self._createFile( path, '%s.pt' % obj.id )
-        file.write( obj.read() )
-        file.close()
-        file = self._createMetadataFile( path, '%s.pt' % obj.id )
-        if self.use_metadata_file:
-            file.write( 'title=%s\n' % obj.title )
-            self._dumpSecurityInfo(obj, file)
-        else:
-            file.write( 'title:string=%s\n' % obj.title )
-        file.close()
-
-    security.declarePrivate( '_dumpSQLMethod' )
-    def _dumpSQLMethod( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a SQL Method) to the
-        #   filesystem as a file, with the accompanyting properties file.
-        file = self._createFile( path, '%s.zsql' % obj.id )
-        text = "%s" % obj.src
-        file.write(' <dtml-comment>\n')
-        file.write( 'title:%s\n' % obj.title )
-        file.write( 'arguments: %s\n'
-                     % ' '.join(obj.arguments_src.splitlines() ) )
-        file.write( 'connection_id:%s\n' % obj.connection_id )
-        file.write( 'max_rows:%s\n' % obj.max_rows_ )
-        file.write( 'max_cache:%s\n' % obj.max_cache_ )
-        file.write( 'cache_time:%s\n' % obj.cache_time_ )
-        file.write( 'class_name:%s\n' % obj.class_name_ )
-        file.write( 'class_file:%s\n' % obj.class_file_ )
-        file.write( '</dtml-comment>\n')
-        if text[-1] != '\n':
-            text = '%s\n' % text
-        file.write( text )
-        file.close()
-
-    security.declarePrivate( '_dumpZCatalog' )
-    def _dumpZCatalog( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a ZCatalog) to the
-        #   filesystem as a file, with the accompanyting properties file.
-        file = self._createFile( path, '%s.catalog' % obj.id )
-        for brain in obj.searchResults():
-            file.write( '%s\n' % obj.getpath( brain.data_record_id_ ) )
-        file.close()
-        file = self._createMetadataFile( path, '%s' % obj.id )
-        file.write( 'title:string=%s\n' % obj.title )
-        file.write( 'vocab_id:string=%s\n' % obj.vocab_id )
-        file.write( 'threshold:int=%s\n' % obj.threshold )
-        file.close()
-        file = self._createFile( path, '%s.indexes' % obj.id )
-        for index in obj.index_objects():
-            file.write( '%s:%s\n' % ( index.id, index.meta_type ) )
-        file.close()
-        file = self._createFile( path, '%s.metadata' % obj.id )
-        for column in obj.schema():
-            file.write( '%s\n' % column )
-        file.close()
-    
-    security.declarePrivate( '_dumpZClass' )
-    def _dumpZClass( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a ZClass) to the
-        #   filesystem as a directory, including propertysheets and
-        #   methods, as well as any nested ZClasses.
-        if path is None:
-            path = ''
-        path = os.path.join( path, obj.id )
-        file = self._createMetadataFile( path, '' )
-        file.write( 'title:string=%s\n' % obj.title )
-        file.write( 'metatype:string=%s\n' % obj._zclass_.meta_type )
-        file.write( 'bases:tokens=%s\n'
-                  % ','.join( map( lambda klass: str(klass), obj._zbases ) )
-                  )
-        file.write( 'class_id:int=%s\n' % obj._zclass_.__module__ )
-        file.close()
-
-        #   Dump icon
-        file = self._createFile( path, '.icon', 'wb' )
-        img = obj._zclass_.ziconImage
-        data = img.data
-        if type( data ) == type( '' ):
-            file.write( data )
-        else:
-            while data is not None:
-                file.write( data.data )
-                data = data.next
-        file.close()
-
-        #   Dump views
-        file = self._createFile( path, '.views' )
-        for view in obj.propertysheets.views.data():
-            file.write( '%s:%s\n' % ( view[ 'label' ], view[ 'action' ] ) )
-        file.close()
-
-        #   Dump property sheets.
-        sheetpath = os.path.join( path, 'propertysheets' , 'common' )
-        sheets = self._dumpObjects( obj.propertysheets.common.objectValues()
-                                  , sheetpath )
-        sheets.sort() # help diff out :)
-        file = self._createFile( sheetpath, '.objects' )
-        for id, meta in sheets:
-            file.write( '%s:%s\n' % ( id, meta ) )
-        file.close()
-
-        #   Dump methods
-        methodpath = os.path.join( path, 'propertysheets', 'methods' )
-        methods = self._dumpObjects( obj.propertysheets.methods.objectValues()
-                                   , methodpath )
-        methods.sort() # help diff out :)
-        file = self._createFile( methodpath, '.objects' )
-        for id, meta in methods:
-            file.write( '%s:%s\n' % ( id, meta ) )
-        file.close()
-    
-    security.declarePrivate( '_dumpZClassPropertySheet' )
-    def _dumpZClassPropertySheet( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a ZClass) to the
-        #   filesystem as a directory, including propertysheets and
-        #   methods, as well as any nested ZClasses.
-        file = self._createFile( path, obj.id )
-        self._writeProperties( obj, file )
-        file.close()
-
-        file = self._createMetadataFile( path, obj.id )
-        file.write( 'title:string=%s\n' % obj.title )
-        file.close()
-    
-    security.declarePrivate( '_dumpPermission' )
-    def _dumpPermission( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a Zope Permission) to the
-        #   filesystem as a .properties file.
-        file = self._createMetadataFile( path, obj.id )
-        file.write( 'title:string=%s\n' % obj.title )
-        file.write( 'name:string=%s\n' % obj.name )
-        file.close()
-
-    security.declarePrivate( '_dumpFactory' )
-    def _dumpFactory( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a Zope Factory) to the
-        #   filesystem as a .properties file.
-        file = self._createMetadataFile( path, obj.id )
-        file.write( 'title:string=%s\n' % obj.title )
-        file.write( 'object_type:string=%s\n' % obj.object_type )
-        file.write( 'initial:string=%s\n' % obj.initial )
-        file.write( 'permission:string=%s\n' % obj.permission )
-        file.close()
-
-    security.declarePrivate( '_dumpWizard' )
-    def _dumpWizard( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a Wizard) to the
-        #   filesystem as a directory, containing a .properties file
-        #   and analogues for the pages.
-        if path is None:
-            path = ''
-        path = os.path.join( path, obj.id )
-        file = self._createMetadataFile( path, '' )
-        file.write( 'title:string=%s\n' % obj.title )
-        file.write( 'description:text=[[%s]]\n' % obj.description )
-        file.write( 'wizard_action:string=%s\n' % obj.wizard_action )
-        file.write( 'wizard_icon:string=%s\n' % obj.wizard_icon )
-        file.write( 'wizard_hide_title:int=%s\n' % obj.wizard_hide_title )
-        file.write( 'wizard_stepcount:int=%s\n' % obj.wizard_stepcount )
-        file.close()
-
-        pages = self._dumpObjects( obj.objectValues(), path )
-
-        pages.sort() # help diff out :)
-        file = self._createFile( path, '.objects' )
-        for id, meta in pages:
-            file.write( '%s:%s\n' % ( id, meta ) )
-        file.close()
-
-    security.declarePrivate( '_dumpWizardPage' )
-    def _dumpWizardPage( self, obj, path=None ):
-        #   Dump properties of obj (assumed to be a WizardPage) to the
-        #   filesystem as a file, appending ".wizardpage" to the name.
-        self._dumpDTML( obj, path, 'wizardpage' )
-        file = self._createMetadataFile( path, obj.id() )
-        self._writeProperties( obj, file )
-        file.close()
-
-    security.declarePrivate( '_dumpFormulatorForm' )
-    def _dumpFormulatorForm( self, obj, path=None ):
-        if path is None:
-            path = ''
-        file = self._createFile(path, obj.id + '.form')
-        file.write(obj.get_xml())
-        file.close()
-
-    _handlers = { 'DTML Method'     : _dumpDTMLMethod
-                , 'DTML Document'   : _dumpDTMLDocument
-                , 'Folder'          : _dumpFolder
-                , 'External Method' : _dumpExternalMethod
-                , 'File'            : _dumpFileOrImage
-                , 'Image'           : _dumpFileOrImage
-                , 'Python Method'   : _dumpPythonMethod
-                , 'Script (Python)' : _dumpPythonScript
-                , 'Controller Python Script' : _dumpControllerPythonScript
-                , 'Controller Validator' : _dumpValidatorScript
-                , 'Controller Page Template' : _dumpControllerPageTemplate
-                , 'Page Template'   : _dumpPageTemplate
-                , 'Z SQL Method'    : _dumpSQLMethod
-                , 'ZCatalog'        : _dumpZCatalog
-                , 'Z Class'         : _dumpZClass
-                , 'Common Instance Property Sheet'
-                                    : _dumpZClassPropertySheet
-                , 'Zope Permission' : _dumpPermission
-                , 'Zope Factory'    : _dumpFactory
-                , 'Wizard'          : _dumpWizard
-                , 'Wizard Page'     : _dumpWizardPage
-                , 'Formulator Form' : _dumpFormulatorForm
-               #, 'SQL DB Conn'     : _dumpDBConn
-                , 'ZWiki Page'      : _dumpZWikiPage
-                }
-
-    security.declareProtected( USE_DUMPER_PERMISSION, 'testDump' )
-    def testDump( self, peer_path, path=None, REQUEST=None ):
-        """
-            Test dumping a single item.
-        """
-        obj = self.aq_parent.restrictedTraverse( peer_path )
-        self._dumpObject( obj )
-        if REQUEST is not None:
-            REQUEST['RESPONSE'].redirect( self.absolute_url()
-                                        + '/editForm'
-                                        + '?manage_tabs_message=%s+dumped.'
-                                        % peer_path
-                                        )
-
-InitializeClass( Dumper )
-

Copied: Products.FSDump/trunk/Products/FSDump/Dumper.py (from rev 97103, Products.FSDump/trunk/Dumper.py)
===================================================================
--- Products.FSDump/trunk/Products/FSDump/Dumper.py	                        (rev 0)
+++ Products.FSDump/trunk/Products/FSDump/Dumper.py	2009-02-22 16:36:11 UTC (rev 97104)
@@ -0,0 +1,623 @@
+""" Classes: Dumper
+
+$Id$
+"""
+import os
+
+from AccessControl import ClassSecurityInfo
+from Globals import DTMLFile
+from Globals import package_home
+from Globals import InitializeClass
+from OFS.SimpleItem import SimpleItem
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from ZODB.POSException import ConflictError
+
+_wwwdir = os.path.join( package_home( globals() ), 'www' )
+
+addDumperForm = PageTemplateFile( 'addDumper', _wwwdir )
+
+USE_DUMPER_PERMISSION = 'Use Dumper'
+
+def addDumper( self, id, fspath=None, use_metadata_file=0, REQUEST=None ):
+    """
+    """
+    dumper = Dumper()
+    dumper.id = id
+    dumper.edit( fspath, use_metadata_file )
+    self._setObject( id, dumper )
+
+    if REQUEST is not None:
+        REQUEST[ 'RESPONSE' ].redirect( 'manage_main' )
+
+class Dumper( SimpleItem ):
+    """
+    """
+    meta_type = 'Dumper'
+
+    manage_options = ( { 'label'    : 'Edit'
+                       , 'action'   : 'editForm'
+                       , 'help'     : ('FSDump' ,'Dumper_editForm.stx')
+                       }
+                     , { 'label'    : 'Security'
+                       , 'action'   : 'manage_access'
+                       , 'help'     : ('OFSP','Security_Define-Permissions.stx')
+                       }
+                     )
+
+    security = ClassSecurityInfo()
+    
+    fspath = None
+    use_metadata_file = 0
+
+    #
+    #   Management interface methods.
+    #
+    index_html = None
+
+    security.declareProtected( USE_DUMPER_PERMISSION, 'editForm' )
+    editForm = PageTemplateFile( 'editDumper', _wwwdir )
+
+    security.declareProtected( USE_DUMPER_PERMISSION, 'edit' )
+    def edit( self, fspath, use_metadata_file, REQUEST=None ):
+        """
+            Update the path to which we will dump our peers.
+        """
+        self._setFSPath( fspath )
+        self.use_metadata_file = use_metadata_file
+
+        if REQUEST is not None:
+            REQUEST['RESPONSE'].redirect( self.absolute_url()
+                                        + '/editForm'
+                                        + '?manage_tabs_message=Dumper+updated.'
+                                        )
+
+    security.declareProtected( USE_DUMPER_PERMISSION, 'dumpToFS' )
+    def dumpToFS( self, REQUEST=None ):
+        """
+            Iterate recursively over our peers, creating simulacra
+            of them on the filesystem in 'fspath'
+        """
+        if REQUEST and REQUEST.form.has_key( 'fspath' ):
+            self._setFSPath( REQUEST.form[ 'fspath' ] )
+
+        parent = self.aq_parent.aq_base
+        if getattr(parent, 'isTopLevelPrincipiaApplicationObject', 0):
+            self._dumpRoot( self.aq_parent )
+        else:
+            self._dumpFolder( self.aq_parent )
+
+        if REQUEST is not None:
+            REQUEST['RESPONSE'].redirect( self.absolute_url()
+                                        + '/editForm'
+                                        + '?manage_tabs_message=Peers+dumped.'
+                                        )
+ 
+    #
+    #   Utility methods
+    #
+    security.declarePrivate( '_setFSPath' )
+    def _setFSPath( self, fspath ):
+        #   Canonicalize fspath.
+        fspath = os.path.normpath( fspath )
+        if not os.path.isabs( fspath ):
+            raise "Dumper Error", "Path must be absolute."
+        self.fspath = fspath
+
+    security.declarePrivate( '_buildPathString' )
+    def _buildPathString( self, path=None ):
+        #   Construct a path string, relative to self.fspath.
+        if self.fspath is None:
+           raise "Dumper Error", "Path not set."
+
+        if path is None:
+            path = self.fspath
+        else:
+            path = os.path.normpath( os.path.join( self.fspath, path ) )
+        
+        return path
+
+    security.declarePrivate( '_checkFSPath' )
+    def _checkFSPath( self, path=None ):
+        #   Ensure that fspath/path exists.
+        path = self._buildPathString( path )
+
+        if not os.path.exists( path ):
+            os.makedirs( path )
+        
+        return path
+
+    security.declarePrivate( '_createFile' )
+    def _createFile( self, path, filename, mode='w' ):
+        #   Create/replace file;  return the file object.
+        fullpath = "%s/%s" % ( self._checkFSPath( path ), filename )
+        return open( fullpath, mode )
+
+    security.declarePrivate( '_createMetadataFile' )
+    def _createMetadataFile( self, path, filename, mode='w' ):
+        #   Create/replace file;  return the file object.
+        extension = self.use_metadata_file and 'metadata' or 'properties'
+        fullpath = "%s/%s.%s" % ( self._checkFSPath( path )
+                                , filename, extension )
+        file = open( fullpath, mode )
+        if self.use_metadata_file:
+            print >> file, "[default]"
+        else:
+            print >> file, "[Default]"
+        return file
+    
+    security.declarePrivate( '_dumpObject' )
+    def _dumpObject( self, object, path=None ):
+        #   Dump one item, using path as prefix.
+        try:
+            handler = self._handlers.get( object.meta_type, None )
+            if handler is not None:
+                handler( self, object, path )
+                return 1
+        except ConflictError:
+            raise
+        except:
+            return -1
+        return 0
+            
+
+    security.declarePrivate( '_dumpObjects' )
+    def _dumpObjects( self, objects, path=None ):
+        #   Dump each item, using path as prefix.
+        dumped = []
+        for object in objects:
+            if self._dumpObject( object, path ) > 0:
+                id = object.id
+                if callable( id ):
+                    id = id()
+                dumped.append( ( id, object.meta_type ) )
+        return dumped
+
+
+    security.declarePrivate( '_writeProperties' )
+    def _writeProperties( self, obj, file ):
+        propIDs = obj.propertyIds()
+        propIDs.sort()  # help diff out :)
+        for propID in propIDs:
+            type = obj.getPropertyType( propID )
+            value = obj.getProperty( propID )
+            if self.use_metadata_file and type=='string':
+                file.write( '%s=%s\n' % ( propID, value ) )
+            else:
+                file.write( '%s:%s=%s\n' % ( propID, type, value ) )
+
+    #
+    #   Type-specific dumpers
+    #
+    security.declarePrivate( '_dumpRoot' )
+    def _dumpRoot( self, obj ):
+        self._dumpObjects( obj.objectValues() )
+
+    security.declarePrivate( '_dumpFolder' )
+    def _dumpFolder( self, obj, path=None ):
+        #   Recurse to dump items in a folder.
+        if path is None:
+            path = ''
+        path = os.path.join( path, obj.id )
+        file = self._createMetadataFile( path, '' )
+        self._writeProperties( obj, file )
+        dumped = self._dumpObjects( obj.objectValues(), path )
+        dumped.sort() # help diff out :)
+
+        if self.use_metadata_file:
+            print >> file, "\n[Objects]"
+        else:
+            file.close()
+            file = self._createFile( path, '.objects' )
+
+        for id, meta in dumped:
+            file.write( '%s:%s\n' % ( id, meta ) )
+        file.close()
+
+    security.declarePrivate( '_dumpDTML' )
+    def _dumpDTML( self, obj, path=None, suffix='dtml' ):
+        #   Dump obj (assumed to be a DTML Method/Document) to the
+        #   filesystem as a file, appending 'suffix' to the name.
+        peer_id = obj.id()
+        file = self._createFile( path, '%s.%s' % ( peer_id, suffix ) )
+        text = obj.raw
+        if text[-1] != '\n':
+            text = '%s\n' % text
+        file.write( text )
+        file.close()
+
+    security.declarePrivate( '_dumpSecurityInfo' )
+    def _dumpSecurityInfo(self, obj, file):
+        if getattr(obj.aq_base, '_proxy_roles', None):
+            file.write('proxy=%s\n' % ','.join(obj._proxy_roles))
+        security_header_written = 0
+        valid_roles = obj.valid_roles()
+        for perm_dict in obj.permission_settings():
+            perm_name = perm_dict['name']
+            acquire = (perm_dict['acquire'] and 1) or 0
+            roles = []
+            for role_idx in range(len(valid_roles)):
+                if perm_dict['roles'][role_idx]['checked']:
+                    roles.append(valid_roles[role_idx])
+            if roles or (acquire==0):
+                if not security_header_written:
+                    security_header_written = 1
+                    file.write('\n[security]\n')
+                file.write('%s=%d:%s\n' % (perm_name, acquire, ','.join(roles)))
+
+    security.declarePrivate( '_dumpDTMLMethod' )
+    def _dumpDTMLMethod( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a DTML Method) to the
+        #   filesystem as a file, with the accompanyting properties file.
+        self._dumpDTML( obj, path )
+        file = self._createMetadataFile( path, '%s.dtml' % obj.id() )
+        if self.use_metadata_file:
+            file.write( 'title=%s\n' % obj.title )
+            self._dumpSecurityInfo(obj, file)
+        else:
+            file.write( 'title:string=%s\n' % obj.title )
+        file.close()
+
+    security.declarePrivate( '_dumpZWikiPage' )
+    def _dumpZWikiPage( self, obj, path=None, suffix='zwiki' ):
+        peer_id = obj.id()
+        file = self._createFile( path, '%s.%s' % ( peer_id, suffix ) )
+        text = obj.text()
+        if text[-1] != '\n':
+            text = '%s\n' % text
+        file.write( text )
+        file.close()
+
+        if self.use_metadata_file:
+            file = self._createMetadataFile( path, '%s.%s' % ( peer_id,suffix))
+            self._writeProperties( obj, file )
+            self._dumpSecurityInfo(obj, file)
+            file.close()
+
+    security.declarePrivate( '_dumpDTMLDocument' )
+    def _dumpDTMLDocument( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a DTML Document) to the
+        #   filesystem as a file, with the accompanyting properties file.
+        self._dumpDTML( obj, path )
+        file = self._createMetadataFile( path, '%s.dtml' % obj.id() )
+        self._writeProperties( obj, file )
+        file.close()
+
+    security.declarePrivate( '_dumpExternalMethod' )
+    def _dumpExternalMethod( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be an Externa Method) to the
+        #   filesystem as a file.
+        file = self._createMetadataFile( path, '%s.em' % obj.id )
+        if self.use_metadata_file:
+            file.write( 'title=%s\n' % obj.title )
+            file.write( 'module=%s\n' % obj._module )
+            file.write( 'function=%s\n' % obj._function )
+            self._dumpSecurityInfo(obj, file)
+        else:
+            file.write( 'title:string=%s\n' % obj.title )
+            file.write( 'module:string=%s\n' % obj._module )
+            file.write( 'function:string=%s\n' % obj._function )
+        file.close()
+
+    security.declarePrivate( '_dumpFileOrImage' )
+    def _dumpFileOrImage( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be an Externa Method) to the
+        #   filesystem as a file, with the accompanyting properties file.
+        file = self._createMetadataFile( path, '%s' % obj.id() )
+        if self.use_metadata_file:
+            file.write( 'title=%s\n' % obj.title )
+            file.write( 'content_type=%s\n' % obj.content_type )
+            file.write( 'precondition=%s\n' % obj.precondition )
+        else:
+            file.write( 'title:string=%s\n' % obj.title )
+            file.write( 'content_type:string=%s\n' % obj.content_type )
+            file.write( 'precondition:string=%s\n' % obj.precondition )
+        file.close()
+        file = self._createFile( path, obj.id(), 'wb' )
+        data = obj.data
+        if type( data ) == type( '' ):
+            file.write( data )
+        else:
+            while data is not None:
+                file.write( data.data )
+                data = data.next
+        file.close()
+
+    security.declarePrivate( '_dumpPythonMethod' )
+    def _dumpPythonMethod( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a Python Method) to the
+        #   filesystem as a file, with the accompanyting properties file.
+        body_lines = obj._body.split( '\n' )
+        body = '\n    '.join( body_lines ) 
+        text = "def %s(%s)\n\n    %s" % ( obj.id, obj._params, body )
+        if text[-1] != '\n':
+            text = '%s\n' % text
+        file = self._createFile( path, '%s.py' % obj.id )
+        file.write( text )
+        file.close()
+        file = self._createMetadataFile( path, '%s.py' % obj.id )
+        if self.use_metadata_file:
+            file.write( 'title=%s\n' % obj.title )
+            self._dumpSecurityInfo(obj, file)
+        else:
+            file.write( 'title:string=%s\n' % obj.title )
+        file.close()
+
+    security.declarePrivate( '_dumpPythonScript' )
+    def _dumpPythonScript( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a Python Script) to the
+        #   filesystem as a file, with the accompanyting properties file.
+        file = self._createFile( path, '%s.py' % obj.id )
+        file.write( obj.read() )
+        file.close()
+        file = self._createMetadataFile( path, '%s.py' % obj.id )
+        if self.use_metadata_file:
+            file.write( 'title=%s\n' % obj.title )
+            self._dumpSecurityInfo(obj, file)
+        else:
+            file.write( 'title:string=%s\n' % obj.title )
+        file.close()
+
+    security.declarePrivate( '_dumpControllerPythonScript' )
+    def _dumpControllerPythonScript( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a Python Script) to the
+        #   filesystem as a file, with the accompanyting properties file.
+        file = self._createFile( path, '%s.cpy' % obj.id )
+        file.write( obj.read() )
+        file.close()
+        file = self._createMetadataFile( path, '%s.cpy' % obj.id )
+        file.write( 'title:string=%s\n' % obj.title )
+        file.close()
+
+    security.declarePrivate( '_dumpValidatorScript' )
+    def _dumpValidatorScript( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a Controller Validator) to the
+        #   filesystem as a file, with the accompanyting properties file.
+        file = self._createFile( path, '%s.vpy' % obj.id )
+        file.write( obj.read() )
+        file.close()
+        file = self._createMetadataFile( path, '%s.vpy' % obj.id )
+        file.write( 'title:string=%s\n' % obj.title )
+        file.close()
+
+    security.declarePrivate( '_dumpControllerPageTemplate' )
+    def _dumpControllerPageTemplate( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a ZopeControllerPageTemplate) to the
+        #   filesystem as a file, with the accompanyting properties file.
+        file = self._createFile( path, '%s.cpt' % obj.id )
+        file.write( obj.read() )
+        file.close()
+        file = self._createMetadataFile( path, '%s.cpt' % obj.id )
+        file.write( 'title:string=%s\n' % obj.title )
+        file.close()
+
+    security.declarePrivate( '_dumpPageTemplate' )
+    def _dumpPageTemplate( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a ZopePageTemplate) to the
+        #   filesystem as a file, with the accompanyting properties file.
+        file = self._createFile( path, '%s.pt' % obj.id )
+        file.write( obj.read() )
+        file.close()
+        file = self._createMetadataFile( path, '%s.pt' % obj.id )
+        if self.use_metadata_file:
+            file.write( 'title=%s\n' % obj.title )
+            self._dumpSecurityInfo(obj, file)
+        else:
+            file.write( 'title:string=%s\n' % obj.title )
+        file.close()
+
+    security.declarePrivate( '_dumpSQLMethod' )
+    def _dumpSQLMethod( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a SQL Method) to the
+        #   filesystem as a file, with the accompanyting properties file.
+        file = self._createFile( path, '%s.zsql' % obj.id )
+        text = "%s" % obj.src
+        file.write(' <dtml-comment>\n')
+        file.write( 'title:%s\n' % obj.title )
+        file.write( 'arguments: %s\n'
+                     % ' '.join(obj.arguments_src.splitlines() ) )
+        file.write( 'connection_id:%s\n' % obj.connection_id )
+        file.write( 'max_rows:%s\n' % obj.max_rows_ )
+        file.write( 'max_cache:%s\n' % obj.max_cache_ )
+        file.write( 'cache_time:%s\n' % obj.cache_time_ )
+        file.write( 'class_name:%s\n' % obj.class_name_ )
+        file.write( 'class_file:%s\n' % obj.class_file_ )
+        file.write( '</dtml-comment>\n')
+        if text[-1] != '\n':
+            text = '%s\n' % text
+        file.write( text )
+        file.close()
+
+    security.declarePrivate( '_dumpZCatalog' )
+    def _dumpZCatalog( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a ZCatalog) to the
+        #   filesystem as a file, with the accompanyting properties file.
+        file = self._createFile( path, '%s.catalog' % obj.id )
+        for brain in obj.searchResults():
+            file.write( '%s\n' % obj.getpath( brain.data_record_id_ ) )
+        file.close()
+        file = self._createMetadataFile( path, '%s' % obj.id )
+        file.write( 'title:string=%s\n' % obj.title )
+        file.write( 'vocab_id:string=%s\n' % obj.vocab_id )
+        file.write( 'threshold:int=%s\n' % obj.threshold )
+        file.close()
+        file = self._createFile( path, '%s.indexes' % obj.id )
+        for index in obj.index_objects():
+            file.write( '%s:%s\n' % ( index.id, index.meta_type ) )
+        file.close()
+        file = self._createFile( path, '%s.metadata' % obj.id )
+        for column in obj.schema():
+            file.write( '%s\n' % column )
+        file.close()
+    
+    security.declarePrivate( '_dumpZClass' )
+    def _dumpZClass( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a ZClass) to the
+        #   filesystem as a directory, including propertysheets and
+        #   methods, as well as any nested ZClasses.
+        if path is None:
+            path = ''
+        path = os.path.join( path, obj.id )
+        file = self._createMetadataFile( path, '' )
+        file.write( 'title:string=%s\n' % obj.title )
+        file.write( 'metatype:string=%s\n' % obj._zclass_.meta_type )
+        file.write( 'bases:tokens=%s\n'
+                  % ','.join( map( lambda klass: str(klass), obj._zbases ) )
+                  )
+        file.write( 'class_id:int=%s\n' % obj._zclass_.__module__ )
+        file.close()
+
+        #   Dump icon
+        file = self._createFile( path, '.icon', 'wb' )
+        img = obj._zclass_.ziconImage
+        data = img.data
+        if type( data ) == type( '' ):
+            file.write( data )
+        else:
+            while data is not None:
+                file.write( data.data )
+                data = data.next
+        file.close()
+
+        #   Dump views
+        file = self._createFile( path, '.views' )
+        for view in obj.propertysheets.views.data():
+            file.write( '%s:%s\n' % ( view[ 'label' ], view[ 'action' ] ) )
+        file.close()
+
+        #   Dump property sheets.
+        sheetpath = os.path.join( path, 'propertysheets' , 'common' )
+        sheets = self._dumpObjects( obj.propertysheets.common.objectValues()
+                                  , sheetpath )
+        sheets.sort() # help diff out :)
+        file = self._createFile( sheetpath, '.objects' )
+        for id, meta in sheets:
+            file.write( '%s:%s\n' % ( id, meta ) )
+        file.close()
+
+        #   Dump methods
+        methodpath = os.path.join( path, 'propertysheets', 'methods' )
+        methods = self._dumpObjects( obj.propertysheets.methods.objectValues()
+                                   , methodpath )
+        methods.sort() # help diff out :)
+        file = self._createFile( methodpath, '.objects' )
+        for id, meta in methods:
+            file.write( '%s:%s\n' % ( id, meta ) )
+        file.close()
+    
+    security.declarePrivate( '_dumpZClassPropertySheet' )
+    def _dumpZClassPropertySheet( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a ZClass) to the
+        #   filesystem as a directory, including propertysheets and
+        #   methods, as well as any nested ZClasses.
+        file = self._createFile( path, obj.id )
+        self._writeProperties( obj, file )
+        file.close()
+
+        file = self._createMetadataFile( path, obj.id )
+        file.write( 'title:string=%s\n' % obj.title )
+        file.close()
+    
+    security.declarePrivate( '_dumpPermission' )
+    def _dumpPermission( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a Zope Permission) to the
+        #   filesystem as a .properties file.
+        file = self._createMetadataFile( path, obj.id )
+        file.write( 'title:string=%s\n' % obj.title )
+        file.write( 'name:string=%s\n' % obj.name )
+        file.close()
+
+    security.declarePrivate( '_dumpFactory' )
+    def _dumpFactory( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a Zope Factory) to the
+        #   filesystem as a .properties file.
+        file = self._createMetadataFile( path, obj.id )
+        file.write( 'title:string=%s\n' % obj.title )
+        file.write( 'object_type:string=%s\n' % obj.object_type )
+        file.write( 'initial:string=%s\n' % obj.initial )
+        file.write( 'permission:string=%s\n' % obj.permission )
+        file.close()
+
+    security.declarePrivate( '_dumpWizard' )
+    def _dumpWizard( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a Wizard) to the
+        #   filesystem as a directory, containing a .properties file
+        #   and analogues for the pages.
+        if path is None:
+            path = ''
+        path = os.path.join( path, obj.id )
+        file = self._createMetadataFile( path, '' )
+        file.write( 'title:string=%s\n' % obj.title )
+        file.write( 'description:text=[[%s]]\n' % obj.description )
+        file.write( 'wizard_action:string=%s\n' % obj.wizard_action )
+        file.write( 'wizard_icon:string=%s\n' % obj.wizard_icon )
+        file.write( 'wizard_hide_title:int=%s\n' % obj.wizard_hide_title )
+        file.write( 'wizard_stepcount:int=%s\n' % obj.wizard_stepcount )
+        file.close()
+
+        pages = self._dumpObjects( obj.objectValues(), path )
+
+        pages.sort() # help diff out :)
+        file = self._createFile( path, '.objects' )
+        for id, meta in pages:
+            file.write( '%s:%s\n' % ( id, meta ) )
+        file.close()
+
+    security.declarePrivate( '_dumpWizardPage' )
+    def _dumpWizardPage( self, obj, path=None ):
+        #   Dump properties of obj (assumed to be a WizardPage) to the
+        #   filesystem as a file, appending ".wizardpage" to the name.
+        self._dumpDTML( obj, path, 'wizardpage' )
+        file = self._createMetadataFile( path, obj.id() )
+        self._writeProperties( obj, file )
+        file.close()
+
+    security.declarePrivate( '_dumpFormulatorForm' )
+    def _dumpFormulatorForm( self, obj, path=None ):
+        if path is None:
+            path = ''
+        file = self._createFile(path, obj.id + '.form')
+        file.write(obj.get_xml())
+        file.close()
+
+    _handlers = { 'DTML Method'     : _dumpDTMLMethod
+                , 'DTML Document'   : _dumpDTMLDocument
+                , 'Folder'          : _dumpFolder
+                , 'External Method' : _dumpExternalMethod
+                , 'File'            : _dumpFileOrImage
+                , 'Image'           : _dumpFileOrImage
+                , 'Python Method'   : _dumpPythonMethod
+                , 'Script (Python)' : _dumpPythonScript
+                , 'Controller Python Script' : _dumpControllerPythonScript
+                , 'Controller Validator' : _dumpValidatorScript
+                , 'Controller Page Template' : _dumpControllerPageTemplate
+                , 'Page Template'   : _dumpPageTemplate
+                , 'Z SQL Method'    : _dumpSQLMethod
+                , 'ZCatalog'        : _dumpZCatalog
+                , 'Z Class'         : _dumpZClass
+                , 'Common Instance Property Sheet'
+                                    : _dumpZClassPropertySheet
+                , 'Zope Permission' : _dumpPermission
+                , 'Zope Factory'    : _dumpFactory
+                , 'Wizard'          : _dumpWizard
+                , 'Wizard Page'     : _dumpWizardPage
+                , 'Formulator Form' : _dumpFormulatorForm
+               #, 'SQL DB Conn'     : _dumpDBConn
+                , 'ZWiki Page'      : _dumpZWikiPage
+                }
+
+    security.declareProtected( USE_DUMPER_PERMISSION, 'testDump' )
+    def testDump( self, peer_path, path=None, REQUEST=None ):
+        """
+            Test dumping a single item.
+        """
+        obj = self.aq_parent.restrictedTraverse( peer_path )
+        self._dumpObject( obj )
+        if REQUEST is not None:
+            REQUEST['RESPONSE'].redirect( self.absolute_url()
+                                        + '/editForm'
+                                        + '?manage_tabs_message=%s+dumped.'
+                                        % peer_path
+                                        )
+
+InitializeClass( Dumper )
+

Copied: Products.FSDump/trunk/Products/FSDump/README.txt (from rev 97103, Products.FSDump/trunk/README.txt)
===================================================================
--- Products.FSDump/trunk/Products/FSDump/README.txt	                        (rev 0)
+++ Products.FSDump/trunk/Products/FSDump/README.txt	2009-02-22 16:36:11 UTC (rev 97104)
@@ -0,0 +1,57 @@
+FSDump Product
+
+  Author
+
+    "Tres Seaver", mailto:tseaver at palladion.com, Palladion Software
+
+  Overview
+
+    FSDump grew out of an itch which many Zope developers have:
+    through-the-web development is faster and easier to do, but
+    causes significant deployment and configuration management
+    problems.  Through-the-web code cannot (easily) be checked into
+    CVS, or diffed to show changes, or grepped to find the source
+    of an error message.
+
+  Goals
+
+    * The first goal is to ease the burden of getting TTW code
+      under version control:  i.e., to make it possible to check
+      a representation of the TTW code into CVS, and then to see
+      what changes between versions.
+
+    * Keep the file-system representations of the TTW objects 
+      simple and "natural" (we are explicitly avoiding XML here).
+
+    * Future goals might include:
+
+      - Two-way migration (e.g., make changes to dumped items in
+        vim/emacs, and then import those changes back into the
+        TTW code).
+
+  Installation
+
+    See the separate "installation directions":INSTALL.txt.
+
+  Usage
+
+    * Use the "Add list" to create a "Dumper" instance in a folder
+      (or Product) which contains the TTW code to be dumped.
+
+    * Supply an absolute path to a directory on the filesystem
+      in which the dumper is to create the files (note that the
+      user as whom Zope is running needs write access to this
+      directory).
+
+    * Click the "Change and Dump" button to do the dump to the
+      indicated directory.
+
+  Mapping TTW Code to the Filesystem
+
+    See the "mappings help":Help/Mappings.stx.
+    
+  Known Issues
+
+    * Some types of metadata ('bobobase_modification_time') won't
+      be exported as a property.
+

Copied: Products.FSDump/trunk/Products/FSDump/__init__.py (from rev 97103, Products.FSDump/trunk/__init__.py)
===================================================================
--- Products.FSDump/trunk/Products/FSDump/__init__.py	                        (rev 0)
+++ Products.FSDump/trunk/Products/FSDump/__init__.py	2009-02-22 16:36:11 UTC (rev 97104)
@@ -0,0 +1,20 @@
+""" FSDump product intialization
+
+$Id$
+"""
+import Dumper
+
+def initialize( context ):
+
+    context.registerClass( Dumper.Dumper
+                         , constructors= ( ( 'addDumperForm'
+                                           , Dumper.addDumperForm
+                                           )
+                                         , Dumper.addDumper
+                                         )
+                         , permission= 'Add Dumper'
+                         , icon='www/dumper.gif'
+                         )
+
+    context.registerHelpTitle( 'FSDump Help' )
+    context.registerHelp( directory='help' )

Copied: Products.FSDump/trunk/Products/FSDump/version.txt (from rev 97103, Products.FSDump/trunk/version.txt)
===================================================================
--- Products.FSDump/trunk/Products/FSDump/version.txt	                        (rev 0)
+++ Products.FSDump/trunk/Products/FSDump/version.txt	2009-02-22 16:36:11 UTC (rev 97104)
@@ -0,0 +1 @@
+FSDump-0.9.3

Added: Products.FSDump/trunk/Products/__init__.py
===================================================================
--- Products.FSDump/trunk/Products/__init__.py	                        (rev 0)
+++ Products.FSDump/trunk/Products/__init__.py	2009-02-22 16:36:11 UTC (rev 97104)
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)

Deleted: Products.FSDump/trunk/README.txt
===================================================================
--- Products.FSDump/trunk/README.txt	2009-02-22 15:55:50 UTC (rev 97103)
+++ Products.FSDump/trunk/README.txt	2009-02-22 16:36:11 UTC (rev 97104)
@@ -1,57 +0,0 @@
-FSDump Product
-
-  Author
-
-    "Tres Seaver", mailto:tseaver at palladion.com, Palladion Software
-
-  Overview
-
-    FSDump grew out of an itch which many Zope developers have:
-    through-the-web development is faster and easier to do, but
-    causes significant deployment and configuration management
-    problems.  Through-the-web code cannot (easily) be checked into
-    CVS, or diffed to show changes, or grepped to find the source
-    of an error message.
-
-  Goals
-
-    * The first goal is to ease the burden of getting TTW code
-      under version control:  i.e., to make it possible to check
-      a representation of the TTW code into CVS, and then to see
-      what changes between versions.
-
-    * Keep the file-system representations of the TTW objects 
-      simple and "natural" (we are explicitly avoiding XML here).
-
-    * Future goals might include:
-
-      - Two-way migration (e.g., make changes to dumped items in
-        vim/emacs, and then import those changes back into the
-        TTW code).
-
-  Installation
-
-    See the separate "installation directions":INSTALL.txt.
-
-  Usage
-
-    * Use the "Add list" to create a "Dumper" instance in a folder
-      (or Product) which contains the TTW code to be dumped.
-
-    * Supply an absolute path to a directory on the filesystem
-      in which the dumper is to create the files (note that the
-      user as whom Zope is running needs write access to this
-      directory).
-
-    * Click the "Change and Dump" button to do the dump to the
-      indicated directory.
-
-  Mapping TTW Code to the Filesystem
-
-    See the "mappings help":Help/Mappings.stx.
-    
-  Known Issues
-
-    * Some types of metadata ('bobobase_modification_time') won't
-      be exported as a property.
-

Deleted: Products.FSDump/trunk/__init__.py
===================================================================
--- Products.FSDump/trunk/__init__.py	2009-02-22 15:55:50 UTC (rev 97103)
+++ Products.FSDump/trunk/__init__.py	2009-02-22 16:36:11 UTC (rev 97104)
@@ -1,20 +0,0 @@
-""" FSDump product intialization
-
-$Id$
-"""
-import Dumper
-
-def initialize( context ):
-
-    context.registerClass( Dumper.Dumper
-                         , constructors= ( ( 'addDumperForm'
-                                           , Dumper.addDumperForm
-                                           )
-                                         , Dumper.addDumper
-                                         )
-                         , permission= 'Add Dumper'
-                         , icon='www/dumper.gif'
-                         )
-
-    context.registerHelpTitle( 'FSDump Help' )
-    context.registerHelp( directory='help' )

Deleted: Products.FSDump/trunk/version.txt
===================================================================
--- Products.FSDump/trunk/version.txt	2009-02-22 15:55:50 UTC (rev 97103)
+++ Products.FSDump/trunk/version.txt	2009-02-22 16:36:11 UTC (rev 97104)
@@ -1 +0,0 @@
-FSDump-0.9.3



More information about the Checkins mailing list