iro/controller/task.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 10 Feb 2012 20:47:57 +0100
branchdevel
changeset 142 7d0c1fa97123
parent 141 90c95fdd1e33
child 143 0b265608b6ce
permissions -rw-r--r--
task._run umbau zu inlineCallbacks

from functools import partial
from twisted.internet import defer
from twisted.internet.defer import inlineCallbacks, returnValue 

from ..error import NoRoute, 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].send(self.recipient,self.job.message))
                returnValue(ret)
            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