from functools import partial
from twisted.internet import defer
from ..error import NoRoute, RejectRecipient
from ..model.offer import getPossibleOffers
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
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(user,recipients, msg, offers, info=None):
d = defer.maybeDeferred(exJobs.create,user, recipients, msg, offers, info)
def _(job):
for r in recipients:
task = Task(r,job)
job.addTask(task)
task.start()
return job
d.addCallback(_)
return d