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
self.status = None
self.error = False
def setStatus(self,status):
self.status = status
return status
def setError(self,error):
self.status = error
self.error = True
return error
def start(self):
self.d = taskPool.run(self._run)
self.d.addCallback(self.setStatus)
self.d.addCallback(partial(self.job.setStatus,self))
self.d.addErrback(self.setError)
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)