iro/controller/task.py
author Sandro Knauß <knauss@netzguerilla.net>
Tue, 07 Feb 2012 01:56:59 +0100
branchdevel
changeset 135 f8640c663e3e
child 140 75d0eaaa871d
permissions -rw-r--r--
model.job created

from functools import partial

from ..error import NoRoute, RejectRecipient

from ..model.offer import getPossibleOffers
from ..model.job import jobs

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(recipients, msg, offers):
    job = jobs.create(recipients, msg, offers)
    for r in recipients:
        task = Task(r,job)
        job.addTask(task)
        task.start()

    return job