[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