[Checkins] SVN: GenericSetup/trunk/ Added support for uploading a tarball on the "Import" tab

Tres Seaver tseaver at palladion.com
Wed Sep 20 17:07:50 EDT 2006


Log message for revision 70268:
  Added support for uploading a tarball on the "Import" tab 
  
  o The tarball should be one produced on the export tab.
  

Changed:
  U   GenericSetup/trunk/CHANGES.txt
  U   GenericSetup/trunk/interfaces.py
  U   GenericSetup/trunk/tests/test_tool.py
  U   GenericSetup/trunk/tool.py
  U   GenericSetup/trunk/www/sutImportSteps.zpt

-=-
Modified: GenericSetup/trunk/CHANGES.txt
===================================================================
--- GenericSetup/trunk/CHANGES.txt	2006-09-20 20:50:45 UTC (rev 70267)
+++ GenericSetup/trunk/CHANGES.txt	2006-09-20 21:07:49 UTC (rev 70268)
@@ -2,6 +2,9 @@
 
   GenericSetup 1.2 (unreleased)
 
+    - tool:  Added support for uploading a tarball on the "Import" tab
+      (i.e., one produced on the export tab).
+
     - docs: Added SampleSite demo product.
 
     - ProfileRegistry: Added 'registerProfile' ZCML directive.

Modified: GenericSetup/trunk/interfaces.py
===================================================================
--- GenericSetup/trunk/interfaces.py	2006-09-20 20:50:45 UTC (rev 70267)
+++ GenericSetup/trunk/interfaces.py	2006-09-20 21:07:49 UTC (rev 70268)
@@ -453,6 +453,12 @@
         """ Get the ID of the active import context.
         """
 
+    def applyContext( context, encoding=None ):
+
+        """ Update the tool from the supplied context, without modifying its
+            "permanent" ID.
+        """
+
     def setImportContext( context_id ):
 
         """ Set the ID of the active import context and update the registries.

Modified: GenericSetup/trunk/tests/test_tool.py
===================================================================
--- GenericSetup/trunk/tests/test_tool.py	2006-09-20 20:50:45 UTC (rev 70267)
+++ GenericSetup/trunk/tests/test_tool.py	2006-09-20 21:07:49 UTC (rev 70268)
@@ -585,7 +585,65 @@
         self.assertEqual( info[ 'id' ], 'default' )
         self.assertEqual( info[ 'title' ], 'default' )
 
+    def test_applyContext(self):
+        from Products.GenericSetup.tool import IMPORT_STEPS_XML
+        from Products.GenericSetup.tool import EXPORT_STEPS_XML
+        from Products.GenericSetup.tool import TOOLSET_XML
+        from test_registry import _SINGLE_IMPORT_XML
+        from test_registry import _SINGLE_EXPORT_XML
+        from test_registry import _NORMAL_TOOLSET_XML
+        from test_registry import ONE_FUNC
 
+        site = self._makeSite()
+        tool = self._makeOne('setup_tool').__of__(site)
+        tool.getImportStepRegistry().clear()
+        tool.getExportStepRegistry().clear()
+        tool.getToolsetRegistry().clear()
+
+        context = DummyImportContext( site, tool=tool )
+        context._files[ IMPORT_STEPS_XML ] = _SINGLE_IMPORT_XML
+        context._files[ EXPORT_STEPS_XML ] = _SINGLE_EXPORT_XML
+        context._files[ TOOLSET_XML ] = _NORMAL_TOOLSET_XML
+
+        tool.applyContext(context)
+
+        import_registry = tool.getImportStepRegistry()
+        self.assertEqual( len( import_registry.listSteps() ), 1 )
+        self.failUnless( 'one' in import_registry.listSteps() )
+        info = import_registry.getStepMetadata( 'one' )
+        self.assertEqual( info[ 'id' ], 'one' )
+        self.assertEqual( info[ 'title' ], 'One Step' )
+        self.assertEqual( info[ 'version' ], '1' )
+        self.failUnless( 'One small step' in info[ 'description' ] )
+        self.assertEqual( info[ 'handler' ]
+                        , 'Products.GenericSetup.tests.test_registry.ONE_FUNC' )
+
+        self.assertEqual( import_registry.getStep( 'one' ), ONE_FUNC )
+
+        export_registry = tool.getExportStepRegistry()
+        self.assertEqual( len( export_registry.listSteps() ), 1 )
+        self.failUnless( 'one' in import_registry.listSteps() )
+        info = export_registry.getStepMetadata( 'one' )
+        self.assertEqual( info[ 'id' ], 'one' )
+        self.assertEqual( info[ 'title' ], 'One Step' )
+        self.failUnless( 'One small step' in info[ 'description' ] )
+        self.assertEqual( info[ 'handler' ]
+                        , 'Products.GenericSetup.tests.test_registry.ONE_FUNC' )
+
+        self.assertEqual( export_registry.getStep( 'one' ), ONE_FUNC )
+
+        toolset = tool.getToolsetRegistry()
+        self.assertEqual( len( toolset.listForbiddenTools() ), 1 )
+        self.failUnless( 'doomed' in toolset.listForbiddenTools() )
+        self.assertEqual( len( toolset.listRequiredTools() ), 2 )
+        self.failUnless( 'mandatory' in toolset.listRequiredTools() )
+        info = toolset.getRequiredToolInfo( 'mandatory' )
+        self.assertEqual( info[ 'class' ], 'path.to.one' )
+        self.failUnless( 'obligatory' in toolset.listRequiredTools() )
+        info = toolset.getRequiredToolInfo( 'obligatory' )
+        self.assertEqual( info[ 'class' ], 'path.to.another' )
+
+
 _DEFAULT_STEP_REGISTRIES_EXPORT_XML = """\
 <?xml version="1.0"?>
 <export-steps>

Modified: GenericSetup/trunk/tool.py
===================================================================
--- GenericSetup/trunk/tool.py	2006-09-20 20:50:45 UTC (rev 70267)
+++ GenericSetup/trunk/tool.py	2006-09-20 21:07:49 UTC (rev 70268)
@@ -35,6 +35,7 @@
 from context import DirectoryImportContext
 from context import SnapshotImportContext
 from context import TarballExportContext
+from context import TarballImportContext
 from context import SnapshotExportContext
 from differ import ConfigDiff
 from registry import ImportStepRegistry
@@ -177,11 +178,16 @@
         """ See ISetupTool.
         """
         self._import_context_id = context_id
+        context = self._getImportContext(context_id)
 
-        self._updateImportStepsRegistry(encoding)
-        self._updateExportStepsRegistry(encoding)
-        self._updateToolsetRegistry(encoding)
+        self.applyContext(context, encoding)
 
+    security.declareProtected(ManagePortal, 'applyContext')
+    def applyContext(self, context, encoding=None):
+        self._updateImportStepsRegistry(context, encoding)
+        self._updateExportStepsRegistry(context, encoding)
+        self._updateToolsetRegistry(context, encoding)
+
     security.declareProtected(ManagePortal, 'getImportStepRegistry')
     def getImportStepRegistry(self):
 
@@ -244,19 +250,8 @@
 
         context = self._getImportContext(self._import_context_id, purge_old)
 
-        steps = self._import_registry.sortSteps()
-        messages = {}
+        return self._runImportStepsFromContext(context, purge_old=purge_old)
 
-        for step in steps:
-            message = self._doRunImportStep(step, context)
-            message_list = filter(None, [message])
-            message_list.extend( ['%s: %s' % x[1:]
-                                  for x in context.listNotes()] )
-            messages[step] = '\n'.join(message_list)
-            context.clearNotes()
-
-        return { 'steps' : steps, 'messages' : messages }
-
     security.declareProtected(ManagePortal, 'runExportStep')
     def runExportStep(self, step_id):
 
@@ -445,6 +440,29 @@
         return self.manage_importSteps(manage_tabs_message=steps_run,
                                        messages=result['messages'])
 
+    security.declareProtected(ManagePortal, 'manage_importTarball')
+    def manage_importTarball(self, tarball, RESPONSE, create_report=True):
+        """ Import steps from the uploaded tarball.
+        """
+        if getattr(tarball, 'read', None) is not None:
+            tarball = tarball.read()
+
+        context = TarballImportContext(tool=self,
+                                       archive_bits=tarball,
+                                       encoding='UTF8',
+                                       should_purge=True,
+                                      )
+        result = self._runImportStepsFromContext(context,
+                                                 purge_old=True)
+        steps_run = 'Steps run: %s' % ', '.join(result['steps'])
+
+        if create_report:
+            name = self._mangleTimestampName('import-all', 'log')
+            self._createReport(name, result['steps'], result['messages'])
+
+        return self.manage_importSteps(manage_tabs_message=steps_run,
+                                       messages=result['messages'])
+
     security.declareProtected(ManagePortal, 'manage_exportSteps')
     manage_exportSteps = PageTemplateFile('sutExportSteps', _wwwdir)
 
@@ -643,11 +661,12 @@
         return SnapshotImportContext(self, context_id, should_purge, encoding)
 
     security.declarePrivate('_updateImportStepsRegistry')
-    def _updateImportStepsRegistry(self, encoding):
+    def _updateImportStepsRegistry(self, context, encoding):
 
         """ Update our import steps registry from our profile.
         """
-        context = self._getImportContext(self._import_context_id)
+        if context is None:
+            context = self._getImportContext(self._import_context_id)
         xml = context.readDataFile(IMPORT_STEPS_XML)
         if xml is None:
             return
@@ -673,11 +692,12 @@
                                               )
 
     security.declarePrivate('_updateExportStepsRegistry')
-    def _updateExportStepsRegistry(self, encoding):
+    def _updateExportStepsRegistry(self, context, encoding):
 
         """ Update our export steps registry from our profile.
         """
-        context = self._getImportContext(self._import_context_id)
+        if context is None:
+            context = self._getImportContext(self._import_context_id)
         xml = context.readDataFile(EXPORT_STEPS_XML)
         if xml is None:
             return
@@ -699,11 +719,12 @@
                                               )
 
     security.declarePrivate('_updateToolsetRegistry')
-    def _updateToolsetRegistry(self, encoding):
+    def _updateToolsetRegistry(self, context, encoding):
 
         """ Update our toolset registry from our profile.
         """
-        context = self._getImportContext(self._import_context_id)
+        if context is None:
+            context = self._getImportContext(self._import_context_id)
         xml = context.readDataFile(TOOLSET_XML)
         if xml is None:
             return
@@ -741,13 +762,30 @@
 
             messages[step_id] = handler(context)
 
-
         return { 'steps' : steps
                , 'messages' : messages
                , 'tarball' : context.getArchive()
                , 'filename' : context.getArchiveFilename()
                }
 
+    security.declarePrivate('_runImportStepsFromContext')
+    def _runImportStepsFromContext(self, context, steps=None, purge_old=None):
+        self.applyContext(context)
+
+        if steps is None:
+            steps = self._import_registry.sortSteps()
+        messages = {}
+
+        for step in steps:
+            message = self._doRunImportStep(step, context)
+            message_list = filter(None, [message])
+            message_list.extend( ['%s: %s' % x[1:]
+                                  for x in context.listNotes()] )
+            messages[step] = '\n'.join(message_list)
+            context.clearNotes()
+
+        return { 'steps' : steps, 'messages' : messages }
+
     security.declarePrivate('_mangleTimestampName')
     def _mangleTimestampName(self, prefix, ext=None):
 

Modified: GenericSetup/trunk/www/sutImportSteps.zpt
===================================================================
--- GenericSetup/trunk/www/sutImportSteps.zpt	2006-09-20 20:50:45 UTC (rev 70267)
+++ GenericSetup/trunk/www/sutImportSteps.zpt	2006-09-20 21:07:49 UTC (rev 70268)
@@ -11,7 +11,7 @@
 
 <h3>Available Import Steps</h3>
 
-<form action="." method="POST"
+<form action="." method="POST" enctype="multipart/form-data"
       tal:attributes="action context/absolute_url" >
 <input type="hidden" name="ids:default:tokens" value="" />
 
@@ -70,6 +70,12 @@
     <input class="form-element" type="submit"
            name="manage_importAllSteps:method"
            value=" Import all steps " />
+      
+    <input class="form-element" type="file"
+           name="tarball" />
+    <input class="form-element" type="submit"
+           name="manage_importTarball:method"
+           value=" Import uploaded tarball " />
    </td>
   </tr>
  </tbody>



More information about the Checkins mailing list