make difference between NoRoute and NoRouteForTask
NoRoute - a Offer exception
NoRouteForTask - no route found to send message
from functools import partial
from twisted.internet.defer import inlineCallbacks, returnValue
from ..error import NoRouteForTask, RejectRecipient
from ..model.offer import offers
from ..model.job import exJobs
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
@inlineCallbacks
def _run(self):
for offer in self.job.offers:
try:
ret = yield offers[offer](self.recipient,self.job.message)
returnValue(ret)
except RejectRecipient:
continue
else:
raise NoRouteForTask()
@inlineCallbacks
def createJob(user,recipients, msg, offers, info=None):
job = yield exJobs.create(user, recipients, msg, offers, info)
for r in recipients:
task = Task(r,job)
job.addTask(task)
task.start()
returnValue(job)