[Checkins] SVN: Sandbox/gotcha/z3c.taskqueue/src/z3c/taskqueue/startup.py refactor startup code from lovely.remotetask

Godefroid Chapelle gotcha at bubblenet.be
Tue Apr 20 07:15:23 EDT 2010


Log message for revision 111168:
  refactor startup code from lovely.remotetask

Changed:
  A   Sandbox/gotcha/z3c.taskqueue/src/z3c/taskqueue/startup.py

-=-
Added: Sandbox/gotcha/z3c.taskqueue/src/z3c/taskqueue/startup.py
===================================================================
--- Sandbox/gotcha/z3c.taskqueue/src/z3c/taskqueue/startup.py	                        (rev 0)
+++ Sandbox/gotcha/z3c.taskqueue/src/z3c/taskqueue/startup.py	2010-04-20 11:15:23 UTC (rev 111168)
@@ -0,0 +1,150 @@
+##############################################################################
+#
+# Copyright (c) 2006, 2007 Lovely Systems and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Task Service Implementation
+
+"""
+__docformat__ = 'restructuredtext'
+
+from z3c.taskqueue import interfaces
+from zope import component
+from zope.app.publication.zopepublication import ZopePublication
+import logging
+import zope.interface
+import zope.location
+
+
+log = logging.getLogger('z3c.remotetask')
+
+
+def databaseOpened(event):
+    """Start the queue processing services based on the
+       settings in zope.conf"""
+    log.info('handling event IDatabaseOpenedEvent')
+
+    root_folder = getRootFolder(event)
+
+    from zope.app.appsetup.product import getProductConfiguration
+    configuration = getProductConfiguration('z3c.taskqueue')
+    startSpecifications = getStartSpecifications(configuration)
+
+    for siteName, serviceName in startSpecifications:
+        serviceCount = 0
+        sites = getSites(siteName, root_folder)
+        for site in sites:
+            if serviceName == '*':
+                services = getAllServices(site, root_folder)
+            else:
+                service = getService(site, serviceName)
+                if service == None:
+                    services = []
+                else:
+                    services = [service]
+            serviceCount += startServices(services)
+
+        if (siteName == "*" or serviceName == "*") and serviceCount == 0:
+            msg = 'no services started by directive %s@%s'
+            log.warn(msg % (siteName, serviceName))
+
+
+def getRootFolder(event):
+    db = event.database
+    connection = db.open()
+    root = connection.root()
+    root_folder = root.get(ZopePublication.root_name, None)
+    return root_folder
+
+
+def getStartSpecifications(configuration):
+    """get a list of sites/services to start"""
+
+    autostartParts = []
+    if configuration is not None:
+        autostart = configuration.get('autostart', '')
+        autostartParts = [name.strip()
+                        for name in autostart.split(',')]
+
+    result = [name.split('@') for name in autostartParts if name]
+    return result
+
+
+def getSites(siteName, root_folder):
+    # we search only for sites at the database root level
+    if siteName == '':
+        sites = [root_folder]
+    elif siteName == '*':
+        sites = getAllSites(root_folder)
+    else:
+        site = getSite(siteName, root_folder)
+        if site == None:
+            sites = []
+        else:
+            sites = [site]
+    return sites
+
+
+def getAllSites(root_folder):
+    sites = []
+    sites.append(root_folder)
+    root_values = root_folder.values()
+    for folder in root_values:
+        if zope.location.interfaces.ISite.providedBy(folder):
+            sites.append(folder)
+    return sites
+
+
+def getSite(siteName, root_folder):
+    try:
+        site = root_folder.get(siteName)
+    except KeyError:
+        log.error('site %s not found' % siteName)
+        site = None
+    return site
+
+
+def getAllServices(site, root_folder):
+    sm = site.getSiteManager()
+    services = list(
+        sm.getUtilitiesFor(interfaces.ITaskService))
+    root_sm = root_folder.getSiteManager()
+    if sm != root_sm:
+        # filter out services defined in root
+        rootServices = list(root_sm.getUtilitiesFor(
+            interfaces.ITaskService))
+        services = [s for s in services
+                       if s not in rootServices]
+    return services
+
+
+def getService(site, serviceName):
+    service = component.queryUtility(interfaces.ITaskService,
+        context=site, name=serviceName)
+    if service is not None:
+        service = (serviceName, service)
+    else:
+        csName = getattr(site, '__name__', '')
+        if csName is None:
+            csName = 'root'
+        msg = 'service %s on site %s not found'
+        log.error(msg % (serviceName, csName))
+        service = None
+    return service
+
+
+def startServices(services):
+    serviceCount = 0
+    for srvname, service in services:
+        if not service.isProcessing():
+            service.startProcessing()
+            serviceCount += 1
+    return serviceCount



More information about the checkins mailing list