iro/controller/task.py
branchdevel
changeset 135 f8640c663e3e
child 140 75d0eaaa871d
equal deleted inserted replaced
134:fae3fdfece65 135:f8640c663e3e
       
     1 from functools import partial
       
     2 
       
     3 from ..error import NoRoute, RejectRecipient
       
     4 
       
     5 from ..model.offer import getPossibleOffers
       
     6 from ..model.job import jobs
       
     7 
       
     8 from .pool  import taskPool
       
     9 
       
    10 class Task:
       
    11     '''one single part of a job.
       
    12     a task is one message to one recipient
       
    13     '''
       
    14     def __init__(self, recipient, job):
       
    15         self.recipient = recipient
       
    16         self.job = job
       
    17 
       
    18     def start(self):
       
    19         self.d = taskPool.run(self._run)
       
    20         self.d.addCallback(partial(self.job.setStatus,self))
       
    21         self.d.addErrback(partial(self.job.setError,self))
       
    22         return self.d
       
    23 
       
    24     def _run(self):
       
    25         for offer in getPossibleOffers(self.recipient,self.job.offers):
       
    26             try:
       
    27                 return offer.send(self.recipient,self.job.message)
       
    28             except RejectRecipient:
       
    29                 continue
       
    30         else:
       
    31             raise NoRoute()
       
    32 
       
    33 
       
    34 def createJob(recipients, msg, offers):
       
    35     job = jobs.create(recipients, msg, offers)
       
    36     for r in recipients:
       
    37         task = Task(r,job)
       
    38         job.addTask(task)
       
    39         task.start()
       
    40 
       
    41     return job