[Checkins] SVN: lovely.remotetask/branches/port-for-zope29/ An initial port of lovely.remotetask for zope 2.9. It works, but there could perhaps be more tests. An example is added that shows the simplest way to use this package.

Tim Terlegård tim.terlegard at lovelysystems.com
Fri Sep 21 08:16:39 EDT 2007


Log message for revision 79792:
  An initial port of lovely.remotetask for zope 2.9. It works, but there could perhaps be more tests. An example is added that shows the simplest way to use this package.
  

Changed:
  A   lovely.remotetask/branches/port-for-zope29/dependencies.txt
  A   lovely.remotetask/branches/port-for-zope29/remotetaskexample/
  A   lovely.remotetask/branches/port-for-zope29/remotetaskexample/__init__.py
  A   lovely.remotetask/branches/port-for-zope29/remotetaskexample/browser.py
  A   lovely.remotetask/branches/port-for-zope29/remotetaskexample/configure.zcml
  A   lovely.remotetask/branches/port-for-zope29/remotetaskexample/interfaces.py
  A   lovely.remotetask/branches/port-for-zope29/remotetaskexample/service.py
  A   lovely.remotetask/branches/port-for-zope29/remotetaskexample/task.py
  U   lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/README.txt
  U   lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/TESTING.txt
  U   lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/__init__.py
  U   lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/configure.zcml
  U   lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/job.py
  U   lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/service.py
  A   lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/services.py
  U   lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/configure.zcml
  U   lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/job.py
  U   lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/service.py

-=-
Added: lovely.remotetask/branches/port-for-zope29/dependencies.txt
===================================================================
--- lovely.remotetask/branches/port-for-zope29/dependencies.txt	                        (rev 0)
+++ lovely.remotetask/branches/port-for-zope29/dependencies.txt	2007-09-21 12:16:39 UTC (rev 79792)
@@ -0,0 +1,29 @@
+This zope 2.9 branch of lovely.remotetask needs Five to run.
+Tested with Five 1.4.2.
+
+This has to be applied to the site:
+
+    from zope.app.component.hooks import setSite
+    from Products.Five.site.localsite import enableLocalSiteHook
+    enableLocalSiteHook(portal)
+    setSite(portal)
+
+and a plone site would need some zcml:
+
+    <configure
+        xmlns="http://namespaces.zope.org/zope"
+        xmlns:five="http://namespaces.zope.org/five">
+
+      <configure package="Products.CMFPlone">
+        <class
+            class=".Portal.PloneSite">
+          <implements interface="zope.app.component.interfaces.IPossibleSite" />
+        </class>
+    
+        <five:localsite class=".Portal.PloneSite" />
+      </configure>
+
+    </configure>
+
+The above is not a part of lovely.remotetask as this is possible
+provided by some other product.


Property changes on: lovely.remotetask/branches/port-for-zope29/dependencies.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: lovely.remotetask/branches/port-for-zope29/remotetaskexample/__init__.py
===================================================================


Property changes on: lovely.remotetask/branches/port-for-zope29/remotetaskexample/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: lovely.remotetask/branches/port-for-zope29/remotetaskexample/browser.py
===================================================================
--- lovely.remotetask/branches/port-for-zope29/remotetaskexample/browser.py	                        (rev 0)
+++ lovely.remotetask/branches/port-for-zope29/remotetaskexample/browser.py	2007-09-21 12:16:39 UTC (rev 79792)
@@ -0,0 +1,60 @@
+from Products.CMFCore.utils import getToolByName
+from zope.component import getUtility, getUtilitiesFor
+from lovely.remotetask.interfaces import ITaskService
+from remotetaskexample.service import ExampleService
+import transaction
+
+class Example(object):
+    """ Some docis """
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def __call__(self):
+        portal_url = getToolByName(self.context, 'portal_url')
+        site = portal_url.getPortalObject()
+
+        service = getUtility(ITaskService, name='ExampleService',
+                             context=site)
+        service.startProcessing()
+        return "successfully started service"
+
+class RunTask(object):
+    """ Some docis """
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def __call__(self):
+        service = getUtility(ITaskService, name='ExampleService')
+        service.add(u'exampletask', 'china')
+        return "exampletask added"
+
+class AddExampleService(object):
+    """ Adds a service to the site. """
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def __call__(self):
+        portal_url = getToolByName(self.context, 'portal_url')
+        site = portal_url.getPortalObject()
+
+        service = ExampleService()
+
+        sm = site.getSiteManager()
+        sm.registerUtility(ITaskService, service, 'ExampleService')
+        service = sm.queryUtility(ITaskService, 'ExampleService')
+        service.__parent__ = sm
+        service.id = 'ITaskService-ExampleService'
+        service.__name__ = service.getId()
+
+        # startProcessing needs the utility to have a _p_jar so we need
+        # to use a savepoint here
+        transaction.savepoint()
+        service.startProcessing()
+
+        return "service successfully added and started"


Property changes on: lovely.remotetask/branches/port-for-zope29/remotetaskexample/browser.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: lovely.remotetask/branches/port-for-zope29/remotetaskexample/configure.zcml
===================================================================
--- lovely.remotetask/branches/port-for-zope29/remotetaskexample/configure.zcml	                        (rev 0)
+++ lovely.remotetask/branches/port-for-zope29/remotetaskexample/configure.zcml	2007-09-21 12:16:39 UTC (rev 79792)
@@ -0,0 +1,39 @@
+<configure
+    xmlns:browser="http://namespaces.zope.org/browser"
+    xmlns:five="http://namespaces.zope.org/five"
+    xmlns="http://namespaces.zope.org/zope">
+
+  <class class=".service.ExampleService">
+    <implements
+        interface="zope.app.annotation.interfaces.IAttributeAnnotatable" />
+    <require
+        permission="zope.Public"
+        interface="lovely.remotetask.interfaces.ITaskService" />
+  </class>
+
+  <utility
+      factory=".task.ExampleTask"
+      name="exampletask" />
+
+  <browser:page
+      for="*"
+      name="examplebrowser"
+      class=".browser.Example"
+      permission="zope.Public"
+      />
+
+  <browser:page
+      for="*"
+      name="examplejob"
+      class=".browser.RunTask"
+      permission="zope.Public"
+      />
+
+  <browser:page
+      for="*"
+      name="addservice"
+      class=".browser.AddExampleService"
+      permission="cmf.ManagePortal"
+      />
+
+</configure>


Property changes on: lovely.remotetask/branches/port-for-zope29/remotetaskexample/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: lovely.remotetask/branches/port-for-zope29/remotetaskexample/interfaces.py
===================================================================
--- lovely.remotetask/branches/port-for-zope29/remotetaskexample/interfaces.py	                        (rev 0)
+++ lovely.remotetask/branches/port-for-zope29/remotetaskexample/interfaces.py	2007-09-21 12:16:39 UTC (rev 79792)
@@ -0,0 +1,4 @@
+from lovely.remotetask.interfaces import ITask
+
+class IExampleTask(ITask):
+    """ Identifying this task as a task for the ExampleTask service. """


Property changes on: lovely.remotetask/branches/port-for-zope29/remotetaskexample/interfaces.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: lovely.remotetask/branches/port-for-zope29/remotetaskexample/service.py
===================================================================
--- lovely.remotetask/branches/port-for-zope29/remotetaskexample/service.py	                        (rev 0)
+++ lovely.remotetask/branches/port-for-zope29/remotetaskexample/service.py	2007-09-21 12:16:39 UTC (rev 79792)
@@ -0,0 +1,12 @@
+from remotetaskexample.interfaces import IExampleTask
+from lovely.remotetask.service import TaskService
+from OFS.SimpleItem import SimpleItem
+
+class ExampleService(TaskService, SimpleItem):
+    taskInterface = IExampleTask
+
+    def __init__(self):
+        super(ExampleService, self).__init__()
+        parent = getattr(self, '__parent__', None)
+        if parent:
+            self.startProcessing()


Property changes on: lovely.remotetask/branches/port-for-zope29/remotetaskexample/service.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: lovely.remotetask/branches/port-for-zope29/remotetaskexample/task.py
===================================================================
--- lovely.remotetask/branches/port-for-zope29/remotetaskexample/task.py	                        (rev 0)
+++ lovely.remotetask/branches/port-for-zope29/remotetaskexample/task.py	2007-09-21 12:16:39 UTC (rev 79792)
@@ -0,0 +1,8 @@
+from remotetaskexample.interfaces import IExampleTask
+from zope.interface import implements
+
+class ExampleTask(object):
+    implements(IExampleTask)
+
+    def __call__(self, service, jobid, input):
+        print "Running", input


Property changes on: lovely.remotetask/branches/port-for-zope29/remotetaskexample/task.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/README.txt
===================================================================
--- lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/README.txt	2007-09-21 11:55:37 UTC (rev 79791)
+++ lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/README.txt	2007-09-21 12:16:39 UTC (rev 79792)
@@ -120,16 +120,12 @@
 as soon as the `IDatabaseOpenedEvent` is fired. Let's emulate the zope.conf
 settings:
 
-  >>> class Config(object):
-  ...     mapping = {}
-  ...     def getSectionName(self):
-  ...         return 'lovely.remotetask'
-  >>> config = Config()
   >>> servicenames = ('site1 at TestTaskService1, site2 at TestTaskService2'
   ...     ', at RootTaskService')
-  >>> config.mapping['autostart'] = servicenames
-  >>> from zope.app.appsetup.product import setProductConfigurations
-  >>> setProductConfigurations([config])
+  >>> from App.config import getConfiguration
+  >>> conf = getConfiguration()
+  >>> task_conf = conf.product_config['lovely.remotetask'] = {}
+  >>> task_conf['autostart'] = servicenames
   >>> from lovely.remotetask.service import getAutostartServiceNames
   >>> getAutostartServiceNames()
   ['site1 at TestTaskService1', 'site2 at TestTaskService2', '@RootTaskService']
@@ -138,41 +134,6 @@
 registered at the root. We test this use-case in a separate footnote so that
 the flow of this document is not broken. [#1]_
 
-On Zope startup the IDatabaseOpenedEvent is being fired, and will call
-the bootStrap method:
-
-  >>> from ZODB.tests import util
-  >>> import transaction
-  >>> db = util.DB()
-  >>> from zope.app.publication.zopepublication import ZopePublication
-  >>> conn = db.open()
-  >>> conn.root()[ZopePublication.root_name] = root
-  >>> from zope.app.folder import Folder
-  >>> root['site1'] = Folder()
-  >>> transaction.commit()
-
-Fire the event::
-
-  >>> from zope.app.appsetup.interfaces import DatabaseOpenedWithRoot
-  >>> from lovely.remotetask.service import bootStrapSubscriber
-  >>> event = DatabaseOpenedWithRoot(db)
-  >>> bootStrapSubscriber(event)
-
-and voila - the service is processing:
-
-  >>> service.isProcessing()
-  True
-
-The verification for the jobs in the root-level service is done in another
-footnote [#2]_
-
-Finally stop processing and kill the thread. We'll call service.process()
-manually as we don't have the right environment in the tests.
-
-  >>> service.stopProcessing()
-  >>> service.isProcessing()
-  False
-
 Let's now read a job:
 
   >>> jobid = service.add(u'echo', {'foo': 'bar'})
@@ -429,11 +390,6 @@
      1
 
 
-.. [#2] We verify the root_service does get processed:
-
-     >>> root_service.isProcessing()
-     True
-
    Cleaning up root-level service:
 
      >>> print root_service.getStatus(r_jobid)

Modified: lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/TESTING.txt
===================================================================
--- lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/TESTING.txt	2007-09-21 11:55:37 UTC (rev 79791)
+++ lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/TESTING.txt	2007-09-21 12:16:39 UTC (rev 79792)
@@ -30,6 +30,8 @@
 
   >>> import lovely.remotetask.task
   >>> echoTask = remotetask.task.SimpleTask(echo)
+  >>> from zope.interface import alsoProvides
+  >>> alsoProvides(echoTask, testing.ITaskStub)
 
 The only API requirement on the converter is to be callable. Now we make sure
 that the task works:
@@ -109,9 +111,10 @@
   >>> def error(input):
   ...     raise remotetask.task.TaskError('An error occurred.')
 
+  >>> errorTask = remotetask.task.SimpleTask(error)
+  >>> alsoProvides(errorTask, testing.ITaskStub)
   >>> zope.component.provideUtility(
-  ...     remotetask.task.SimpleTask(error), provides=testing.ITaskStub, 
-  ...     name='error')
+  ...     errorTask, provides=testing.ITaskStub, name='error')
 
 Now add and execute it:
 

Modified: lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/__init__.py
===================================================================
--- lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/__init__.py	2007-09-21 11:55:37 UTC (rev 79791)
+++ lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/__init__.py	2007-09-21 12:16:39 UTC (rev 79792)
@@ -1,2 +1,21 @@
 # Make a package.
-from lovely.remotetask.service import TaskService
+from lovely.remotetask.service import TaskService, getAutostartServiceNames
+from lovely.remotetask.interfaces import ITaskService
+from zope.component import getUtilitiesFor
+from zope.app.component.hooks import getSite
+from Products.Five.site.interfaces import IFiveUtilityRegistry
+from Products.CMFCore.interfaces._content import ISiteRoot
+
+def initialize(context):
+    # dirty trick, but it works
+    app = context._ProductContext__app
+    services = getAutostartServiceNames()
+
+    for service in services:
+        site_name, service_name = service.split('@')
+        if site_name:
+            site = getattr(app, site_name, None)
+            if site:
+                registry = IFiveUtilityRegistry(site)
+                utility = registry.getUtility(ITaskService, name=service_name)
+                utility.startProcessing()

Modified: lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/configure.zcml
===================================================================
--- lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/configure.zcml	2007-09-21 11:55:37 UTC (rev 79791)
+++ lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/configure.zcml	2007-09-21 12:16:39 UTC (rev 79792)
@@ -11,21 +11,20 @@
       class="..service.TaskService"
       title="Remote Task Service"
       description="A Remote Task Service"
-      permission="zope.ManageContent"
+      permission="cmf.ManagePortal"
       />
 
   <page
       name="jobs.html"
       for="..interfaces.ITaskService"
       class=".service.JobsOverview"
-      permission="zope.ManageContent"
-      menu="zmi_views" title="Jobs"
+      permission="cmf.ManagePortal"
       />
 
   <page
       name="detail"
       for="..interfaces.IJob"
-      permission="zope.ManageContent"
+      permission="cmf.ManagePortal"
       class=".job.JobDetail"
       />
 
@@ -39,17 +38,15 @@
   <page
       name="editjob"
       for="..interfaces.ICronJob"
-      permission="zope.ManageContent"
+      permission="cmf.ManagePortal"
       class=".job.CronJobEdit"
-      menu="zmi_views" title="edit"
       />
 
   <page
       name="addcronjob.html"
       for="..interfaces.ITaskService"
       class=".job.AddCronJob"
-      permission="zope.ManageContent"
-      menu="zmi_views" title="add cron"
+      permission="cmf.ManagePortal"
       />
 
   <!-- traverser for the site -->

Modified: lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/job.py
===================================================================
--- lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/job.py	2007-09-21 11:55:37 UTC (rev 79791)
+++ lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/job.py	2007-09-21 12:16:39 UTC (rev 79792)
@@ -25,8 +25,8 @@
 
 from zope import formlib
 
-from zope.traversing.browser.absoluteurl import absoluteURL
-from zope.publisher.browser import BrowserPage
+from zope.app.traversing.browser.absoluteurl import absoluteURL
+from zope.app.publisher.browser import BrowserView
 
 from zope.app.pagetemplate import ViewPageTemplateFile
 from zope.app.form.browser.textwidgets import TextWidget
@@ -38,14 +38,14 @@
     return ()
 
 
-class JobDetail(BrowserPage):
+class JobDetail(BrowserView):
     """A simple task input detail view."""
 
     def __call__(self):
         return u'No input detail available'
 
 
-class CronJobDetail(BrowserPage):
+class CronJobDetail(BrowserView):
     """A simple task input detail view."""
 
     def __call__(self):

Modified: lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/service.py
===================================================================
--- lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/service.py	2007-09-21 11:55:37 UTC (rev 79791)
+++ lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/service.py	2007-09-21 12:16:39 UTC (rev 79792)
@@ -21,10 +21,10 @@
 
 import zope.interface
 import zope.component
-from zope.publisher.browser import BrowserPage
+from zope.app.publisher.browser import BrowserView
 from zope.publisher.interfaces import NotFound
 from zope.security.proxy import removeSecurityProxy
-from zope.traversing.browser.absoluteurl import absoluteURL
+from zope.app.traversing.browser.absoluteurl import absoluteURL
 
 from zope.app.pagetemplate import ViewPageTemplateFile
 from zope.app.session.interfaces import ISession
@@ -286,7 +286,7 @@
         return ''
 
 
-class JobsOverview(BrowserPage):
+class JobsOverview(BrowserView):
 
     template = ViewPageTemplateFile('jobs.pt')
     status = None

Added: lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/services.py
===================================================================
--- lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/services.py	                        (rev 0)
+++ lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/services.py	2007-09-21 12:16:39 UTC (rev 79792)
@@ -0,0 +1,9 @@
+class Add(object):
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def __call__(self):
+        name = self.request.get('name')
+        if not name:
+            return "name wasn't supplied"


Property changes on: lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/browser/services.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/configure.zcml
===================================================================
--- lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/configure.zcml	2007-09-21 11:55:37 UTC (rev 79791)
+++ lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/configure.zcml	2007-09-21 12:16:39 UTC (rev 79792)
@@ -1,10 +1,11 @@
 <configure
     xmlns="http://namespaces.zope.org/zope"
+    xmlns:five="http://namespaces.zope.org/five"
     i18n_domain="lovely.remotetask">
 
   <class class=".service.TaskService">
     <implements
-        interface="zope.annotation.interfaces.IAttributeAnnotatable" />
+        interface="zope.app.annotation.interfaces.IAttributeAnnotatable" />
     <require
         permission="zope.Public"
         interface=".interfaces.ITaskService" />
@@ -12,7 +13,7 @@
 
   <class class=".job.Job">
     <implements
-        interface="zope.annotation.interfaces.IAttributeAnnotatable" />
+        interface="zope.app.annotation.interfaces.IAttributeAnnotatable" />
     <require
         permission="zope.Public"
         interface=".interfaces.IJob"
@@ -21,7 +22,7 @@
 
   <class class=".job.CronJob">
     <implements
-        interface="zope.annotation.interfaces.IAttributeAnnotatable" />
+        interface="zope.app.annotation.interfaces.IAttributeAnnotatable" />
     <require
         permission="zope.Public"
         interface=".interfaces.ICronJob"
@@ -38,9 +39,9 @@
       factory=".task.EchoTask"
       name="echo" />
 
-  <include file="xmlrpc.zcml" />
-
   <include package=".browser" />
   <include package=".generations" />
 
+  <five:registerPackage package="." initialize=".initialize" />
+
 </configure>

Modified: lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/job.py
===================================================================
--- lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/job.py	2007-09-21 11:55:37 UTC (rev 79791)
+++ lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/job.py	2007-09-21 12:16:39 UTC (rev 79792)
@@ -35,8 +35,6 @@
     id = FieldProperty(interfaces.IJob['id'])
     task = FieldProperty(interfaces.IJob['task'])
     status = FieldProperty(interfaces.IJob['status'])
-    input = FieldProperty(interfaces.IJob['input'])
-    output = FieldProperty(interfaces.IJob['output'])
     error = FieldProperty(interfaces.IJob['error'])
     created = FieldProperty(interfaces.IJob['created'])
     started = FieldProperty(interfaces.IJob['started'])
@@ -46,6 +44,7 @@
         self.id = id
         self.task = task
         self.input = input
+        self.output = None
         self.created = datetime.datetime.now()
 
     def __repr__(self):

Modified: lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/service.py
===================================================================
--- lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/service.py	2007-09-21 11:55:37 UTC (rev 79791)
+++ lovely.remotetask/branches/port-for-zope29/src/lovely/remotetask/service.py	2007-09-21 12:16:39 UTC (rev 79792)
@@ -24,16 +24,19 @@
 import time
 import zc.queue
 import zope.interface
+from ZPublisher.HTTPRequest import HTTPRequest
+from ZPublisher.HTTPResponse import HTTPResponse
+import ZPublisher
 import zope.publisher.base
 import zope.publisher.publish
 from BTrees.IOBTree import IOBTree
 from zope import component
 from zope.app import zapi
-from zope.app.appsetup.product import getProductConfiguration
+from App.config import getConfiguration
 from zope.app.container import contained
 from zope.app.publication.zopepublication import ZopePublication
 from zope.security.proxy import removeSecurityProxy
-from zope.traversing.api import traverse
+from zope.app.traversing.api import traverse
 from zope.component.interfaces import ComponentLookupError
 from lovely.remotetask import interfaces, job, task
 
@@ -144,14 +147,17 @@
             self._scheduledJobs = IOBTree()
         if self._scheduledQueue == None:
             self._scheduledQueue = zc.queue.PersistentQueue()
-        path = [parent.__name__ for parent in zapi.getParents(self)
-                 if parent.__name__]
+        path = [path for path in self.getPhysicalPath() if path]
+        path.append('processNext')
         path.reverse()
-        path.append(self.__name__)
-        path.append('processNext')
 
+        db = self._p_jar.db()
+        connection = db.open()
+        root = connection.root()
+        root_folder = root['Application']
+
         thread = threading.Thread(
-            target=processor, args=(self._p_jar.db(), path),
+            target=processor, args=(root_folder, path),
             name='remotetasks.'+self.__name__)
         thread.setDaemon(True)
         thread.running = True
@@ -175,6 +181,7 @@
         return False
 
     def processNext(self, now=None):
+        """See interfaces.ITaskService"""
         job = self._pullJob(now)
         if job is None:
             return False
@@ -276,7 +283,7 @@
         return traverse(removeSecurityProxy(ob), name, None)
 
 
-def processor(db, path):
+def processor(root, path):
     """Job Processor
 
     Process the jobs that are waiting in the queue. This processor is meant to
@@ -285,12 +292,18 @@
     """
     path.reverse()
     while threading.currentThread().running:
-        request = zope.publisher.base.BaseRequest(None, {})
-        request.setPublication(ProcessorPublication(db))
-        request.setTraversalStack(path)
+        response = HTTPResponse()
+        env = { 'SERVER_NAME': 'dummy',
+                'SERVER_PORT': '8080',
+                'PATH_INFO': '/' + '/'.join(path) }
+        request = HTTPRequest(None, env, response)
+        request['PARENTS'] = [root]
+
         try:
-            zope.publisher.publish.publish(request, False)
-            if not request.response._result:
+            ZPublisher.Publish.publish(request,'Zope2', [None])
+            # close the database connection
+            request.close()
+            if not request.response.body:
                 time.sleep(1)
         except:
             # This thread should never crash, thus a blank except
@@ -300,10 +313,14 @@
     """get a list of services to start"""
 
     serviceNames = []
-    config = getProductConfiguration('lovely.remotetask')
+    config = getConfiguration().product_config
     if config is not None:
-        serviceNames = [name.strip()
-                        for name in config.get('autostart', '').split(',')]
+        task_config = config.get('lovely.remotetask', None)
+        if task_config:
+            autostart = task_config.get('autostart', '')
+            serviceNames = [name.strip()
+                            for name in autostart.split(',')]
+
     return serviceNames
 
 



More information about the Checkins mailing list