iro/controller/task.py
branchdevel
changeset 135 f8640c663e3e
child 140 75d0eaaa871d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/controller/task.py	Tue Feb 07 01:56:59 2012 +0100
@@ -0,0 +1,41 @@
+from functools import partial
+
+from ..error import NoRoute, RejectRecipient
+
+from ..model.offer import getPossibleOffers
+from ..model.job import jobs
+
+from .pool  import taskPool
+
+class Task:
+    '''one single part of a job.
+    a task is one message to one recipient
+    '''
+    def __init__(self, recipient, job):
+        self.recipient = recipient
+        self.job = job
+
+    def start(self):
+        self.d = taskPool.run(self._run)
+        self.d.addCallback(partial(self.job.setStatus,self))
+        self.d.addErrback(partial(self.job.setError,self))
+        return self.d
+
+    def _run(self):
+        for offer in getPossibleOffers(self.recipient,self.job.offers):
+            try:
+                return offer.send(self.recipient,self.job.message)
+            except RejectRecipient:
+                continue
+        else:
+            raise NoRoute()
+
+
+def createJob(recipients, msg, offers):
+    job = jobs.create(recipients, msg, offers)
+    for r in recipients:
+        task = Task(r,job)
+        job.addTask(task)
+        task.start()
+
+    return job