iro/controller/task.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 02 Mar 2012 03:00:40 +0100
branchdevel
changeset 206 361378468627
parent 162 497d6b9b6914
child 217 d755b2e0cc0b
permissions -rw-r--r--
modifing validator to vRoute

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)