iro/controller/task.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 23 Mar 2012 16:18:12 +0100
branchdevel
changeset 242 745d829d1e02
parent 238 c36b117f7400
child 243 b348d8f15b0a
permissions -rw-r--r--
tests for iro.install.getAllRoutes added
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     1
from functools import partial
143
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
     2
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
     3
from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred, Deferred
141
90c95fdd1e33 first defer test in job management
Sandro Knauß <knauss@netzguerilla.net>
parents: 140
diff changeset
     4
162
497d6b9b6914 make difference between NoRoute and NoRouteForTask
Sandro Knauß <knauss@netzguerilla.net>
parents: 161
diff changeset
     5
from ..error import NoRouteForTask, RejectRecipient
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     6
142
7d0c1fa97123 task._run umbau zu inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 141
diff changeset
     7
from ..model.offer import offers
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
     8
from ..model.job import exJobs
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     9
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    10
from .pool  import taskPool
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    11
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    12
class Task:
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    13
    '''one single part of a job.
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    14
    a task is one message to one recipient
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    15
    '''
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    16
    def __init__(self, recipient, job):
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    17
        self.recipient = recipient
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    18
        self.job = job
217
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    19
        self.status = None
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    20
        self.error = False
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    21
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    22
    def setStatus(self,status):
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    23
        self.status = status
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    24
        return status
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    25
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    26
    def setError(self, error):
217
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    27
        self.status = error
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    28
        self.error = True
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    29
        return error
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    30
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
    def start(self):
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    32
        self.d = Deferred()
217
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    33
        self.d.addCallback(self.setStatus)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
        self.d.addCallback(partial(self.job.setStatus,self))
217
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    35
        self.d.addErrback(self.setError)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
        self.d.addErrback(partial(self.job.setError,self))
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    37
        taskPool.run(self._run)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    38
        return self.d
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    40
    def _run(self):
238
c36b117f7400 using iter function instead of generator
Sandro Knauß <knauss@netzguerilla.net>
parents: 234
diff changeset
    41
        os= iter(self.job.offers)
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    42
        def n():
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    43
            try:
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    44
                offer = os.next()
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    45
                d = maybeDeferred(offers[offer],self.recipient,self.job.message)
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    46
                d.addCallback(self.d.callback)
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    47
                d.addErrback(addErr)
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    48
                d.addErrback(self.d.errback)
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    49
                return d
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    50
            except StopIteration:
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    51
                self.d.errback(NoRouteForTask())
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    52
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    53
        def addErr(failure):
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    54
            failure.trap(RejectRecipient)
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    55
            return n()
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    56
        
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    57
        n()
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    58
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    59
143
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
    60
@inlineCallbacks
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    61
def createJob(user,recipients, msg, offers, info=None):
143
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
    62
    job = yield exJobs.create(user, recipients, msg, offers, info)
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
    63
    for r in recipients:
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
    64
        task = Task(r,job)
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
    65
        job.addTask(task)
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
    66
        task.start()
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
    67
    returnValue(job)