iro/controller/task.py
author Sandro Knauß <knauss@netzguerilla.net>
Thu, 09 Feb 2012 18:27:58 +0100
branchdevel
changeset 141 90c95fdd1e33
parent 140 75d0eaaa871d
child 142 7d0c1fa97123
permissions -rw-r--r--
first defer test in job management

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