[Checkins] SVN: GenericSetup/ Merge the wichert-events branch

Wichert Akkerman wichert at wiggy.net
Sun Nov 4 11:56:40 EST 2007


Log message for revision 81476:
  Merge the wichert-events branch

Changed:
  D   GenericSetup/branches/wichert-events/
  U   GenericSetup/trunk/CHANGES.txt
  A   GenericSetup/trunk/events.py
  U   GenericSetup/trunk/interfaces.py
  U   GenericSetup/trunk/tests/test_tool.py
  U   GenericSetup/trunk/tool.py

-=-
Modified: GenericSetup/trunk/CHANGES.txt
===================================================================
--- GenericSetup/trunk/CHANGES.txt	2007-11-04 16:54:40 UTC (rev 81475)
+++ GenericSetup/trunk/CHANGES.txt	2007-11-04 16:56:40 UTC (rev 81476)
@@ -2,6 +2,8 @@
 
   GenericSetup 1.4 (unreleased)
   
+    - Fire events before and after importing.
+
     - Use zcml to register import and export steps.
 
     - tool: Fixed toolset import handler not to initialize tools again, when

Copied: GenericSetup/trunk/events.py (from rev 81475, GenericSetup/branches/wichert-events/events.py)
===================================================================
--- GenericSetup/trunk/events.py	                        (rev 0)
+++ GenericSetup/trunk/events.py	2007-11-04 16:56:40 UTC (rev 81476)
@@ -0,0 +1,17 @@
+from zope.interface import implements
+from Products.GenericSetup.interfaces import IBeforeProfileImportEvent
+from Products.GenericSetup.interfaces import IProfileImportedEvent
+
+class BaseProfileImportEvent(object):
+    def __init__(self, profile_id, steps, full_import):
+        self.profile_id=profile_id
+        self.steps=steps
+        self.full_import=full_import
+
+
+class BeforeProfileImportEvent(BaseProfileImportEvent):
+    implements(IBeforeProfileImportEvent)
+
+
+class ProfileImportedEvent(BaseProfileImportEvent):
+    implements(IProfileImportedEvent)

Modified: GenericSetup/trunk/interfaces.py
===================================================================
--- GenericSetup/trunk/interfaces.py	2007-11-04 16:54:40 UTC (rev 81475)
+++ GenericSetup/trunk/interfaces.py	2007-11-04 16:56:40 UTC (rev 81476)
@@ -15,6 +15,7 @@
 $Id$
 """
 
+from zope.interface import Attribute
 from zope.interface import Interface
 from zope.schema import Text
 from zope.schema import TextLine
@@ -811,3 +812,23 @@
           method, whose headers (e.g., "Content-Type") may affect the
           processing of the body.
         """
+
+class IBeforeProfileImportEvent(Interface):
+    """ An event which is fired before (part of) a profile is imported.
+    """
+    profile_id = Attribute("id of the profile to be imported or None for non-profile imports.")
+
+    steps = Attribute("list of steps that will be imported")
+
+    full_import = Attribute("True if all steps will be imported")
+
+
+class IProfileImportedEvent(Interface):
+    """ An event which is fired when (part of) a profile is imported.
+    """
+    profile_id = Attribute("id of the imported profile")
+
+    steps = Attribute("list of steps have been imported")
+
+    full_import = Attribute("True if all steps are imported")
+

Modified: GenericSetup/trunk/tests/test_tool.py
===================================================================
--- GenericSetup/trunk/tests/test_tool.py	2007-11-04 16:54:40 UTC (rev 81475)
+++ GenericSetup/trunk/tests/test_tool.py	2007-11-04 16:56:40 UTC (rev 81476)
@@ -21,6 +21,10 @@
 
 from StringIO import StringIO
 
+from zope.component import adapter
+from zope.component import provideHandler
+from zope.component.globalregistry import base as base_registry
+
 from Acquisition import aq_base
 from OFS.Folder import Folder
 
@@ -38,7 +42,20 @@
 from common import TarballTester
 from conformance import ConformsToISetupTool
 
+from Products.GenericSetup.interfaces import IBeforeProfileImportEvent
+from Products.GenericSetup.interfaces import IProfileImportedEvent
 
+_before_import_events = []
+ at adapter(IBeforeProfileImportEvent)
+def handleBeforeProfileImportEvent(event):
+    _before_import_events.append(event)
+
+_after_import_events = []
+ at adapter(IProfileImportedEvent)
+def handleProfileImportedEvent(event):
+    _after_import_events.append(event)
+
+
 class SetupToolTests(FilesystemTestBase, TarballTester, ConformsToISetupTool):
 
     layer = ExportImportZCMLLayer
@@ -49,10 +66,18 @@
         self._profile_registry_info = profile_registry._profile_info
         self._profile_registry_ids = profile_registry._profile_ids
         profile_registry.clear()
+        global _before_import_events
+        global _after_import_events
+        _before_import_events = []
+        provideHandler(handleBeforeProfileImportEvent)
+        _after_import_events = []
+        provideHandler(handleProfileImportedEvent)
 
     def beforeTearDown(self):
         profile_registry._profile_info = self._profile_registry_info
         profile_registry._profile_ids = self._profile_registry_ids
+        base_registry.unregisterHandler(handleBeforeProfileImportEvent)
+        base_registry.unregisterHandler(handleProfileImportedEvent)
         FilesystemTestBase.beforeTearDown(self)
 
     def _getTargetClass(self):
@@ -192,6 +217,18 @@
 
         self.assertEqual( site.title, TITLE.upper() )
 
+        global _before_import_events
+        self.assertEqual( len(_before_import_events), 1)
+        self.assertEqual(_before_import_events[0].profile_id, '')
+        self.assertEqual(_before_import_events[0].steps, ['simple'])
+        self.assertEqual(_before_import_events[0].full_import, True)
+
+        global _after_import_events
+        self.assertEqual( len(_after_import_events), 1)
+        self.assertEqual(_after_import_events[0].profile_id, '')
+        self.assertEqual(_after_import_events[0].steps, ['simple'])
+        self.assertEqual(_after_import_events[0].full_import, True)
+
     def test_runImportStep_dependencies( self ):
 
         TITLE = 'original title'
@@ -217,6 +254,19 @@
                         , 'Uppercased title' )
         self.assertEqual( site.title, TITLE.replace( ' ', '_' ).upper() )
 
+        global _before_import_events
+        self.assertEqual( len(_before_import_events), 1)
+        self.assertEqual(_before_import_events[0].profile_id, '')
+        self.assertEqual(_before_import_events[0].steps, ['dependable', 'dependent'])
+        self.assertEqual(_before_import_events[0].full_import, True)
+
+        global _after_import_events
+        self.assertEqual( len(_after_import_events), 1)
+        self.assertEqual(_after_import_events[0].profile_id, '')
+        self.assertEqual(_after_import_events[0].steps, ['dependable', 'dependent'])
+        self.assertEqual(_after_import_events[0].full_import, True)
+
+
     def test_runImportStep_skip_dependencies( self ):
 
         TITLE = 'original title'
@@ -240,6 +290,18 @@
 
         self.assertEqual( site.title, TITLE.upper() )
 
+        global _before_import_events
+        self.assertEqual( len(_before_import_events), 1)
+        self.assertEqual(_before_import_events[0].profile_id, '')
+        self.assertEqual(_before_import_events[0].steps, ['dependent'])
+        self.assertEqual(_before_import_events[0].full_import, False)
+
+        global _after_import_events
+        self.assertEqual( len(_after_import_events), 1)
+        self.assertEqual(_after_import_events[0].profile_id, '')
+        self.assertEqual(_after_import_events[0].steps, ['dependent'])
+        self.assertEqual(_after_import_events[0].full_import, False)
+
     def test_runImportStep_default_purge( self ):
 
         site = self._makeSite()

Modified: GenericSetup/trunk/tool.py
===================================================================
--- GenericSetup/trunk/tool.py	2007-11-04 16:54:40 UTC (rev 81475)
+++ GenericSetup/trunk/tool.py	2007-11-04 16:56:40 UTC (rev 81476)
@@ -30,12 +30,15 @@
 from ZODB.POSException import ConflictError
 from zope.interface import implements
 from zope.interface import implementedBy
+from zope import event 
 
 from interfaces import BASE
 from interfaces import EXTENSION
 from interfaces import ISetupTool
 from interfaces import SKIPPED_FILES
 from permissions import ManagePortal
+from events import BeforeProfileImportEvent
+from events import ProfileImportedEvent
 from context import DirectoryImportContext
 from context import SnapshotImportContext
 from context import TarballExportContext
@@ -321,22 +324,28 @@
 
         messages = {}
         steps = []
+
         if run_dependencies:
             for dependency in dependencies:
-
                 if dependency not in steps:
-                    message = self._doRunImportStep(dependency, context)
-                    messages[dependency] = message or ''
                     steps.append(dependency)
+        steps.append (step_id)
 
-        message = self._doRunImportStep(step_id, context)
+        full_import=(set(steps)==set(self.getSortedImportSteps()))
+        event.notify(BeforeProfileImportEvent(profile_id, steps, full_import))
+
+        for step in steps:
+            message = self._doRunImportStep(step, context)
+            messages[step] = message or ''
+
         message_list = filter(None, [message])
         message_list.extend( ['%s: %s' % x[1:] for x in context.listNotes()] )
         messages[step_id] = '\n'.join(message_list)
-        steps.append(step_id)
 
         self._import_context_id = old_context
 
+        event.notify(ProfileImportedEvent(profile_id, steps, full_import))
+
         return { 'steps' : steps, 'messages' : messages }
 
     security.declareProtected(ManagePortal, 'runImportStep')
@@ -363,7 +372,7 @@
         old_context = self._import_context_id
         context = self._getImportContext(profile_id, purge_old)
 
-        result = self._runImportStepsFromContext(context, purge_old=purge_old)
+        result = self._runImportStepsFromContext(context, purge_old=purge_old, profile_id=profile_id)
         prefix = 'import-all-%s' % profile_id.replace(':', '_')
         name = self._mangleTimestampName(prefix, 'log')
         self._createReport(name, result['steps'], result['messages'])
@@ -1059,13 +1068,14 @@
                }
 
     security.declarePrivate('_runImportStepsFromContext')
-    def _runImportStepsFromContext(self, context, steps=None, purge_old=None):
+    def _runImportStepsFromContext(self, context, steps=None, purge_old=None, profile_id=None):
         self.applyContext(context)
 
         if steps is None:
             steps = self.getSortedImportSteps()
         messages = {}
 
+        event.notify(BeforeProfileImportEvent(profile_id, steps, True))
         for step in steps:
             message = self._doRunImportStep(step, context)
             message_list = filter(None, [message])
@@ -1074,6 +1084,8 @@
             messages[step] = '\n'.join(message_list)
             context.clearNotes()
 
+        event.notify(ProfileImportedEvent(profile_id, steps, True))
+
         return { 'steps' : steps, 'messages' : messages }
 
     security.declarePrivate('_mangleTimestampName')



More information about the Checkins mailing list