iro/controller/task.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 24 Aug 2012 01:05:06 +0200
branchdevel
changeset 294 0e75bd39767d
parent 264 584b9c97ecfd
permissions -rw-r--r--
adding LICENSE to all files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
294
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
     1
# Copyright (c) 2012 netzguerilla.net <iro@netzguerilla.net>
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
     2
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
     3
# This file is part of Iro.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
     4
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
     5
# Permission is hereby granted, free of charge, to any person obtaining a copy of
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
     6
# this software and associated documentation files (the "Software"), to deal in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
     7
# the Software without restriction, including without limitation the rights to use,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
     8
# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
     9
# #Software, and to permit persons to whom the Software is furnished to do so,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    10
# subject to the following conditions:
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    11
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    12
# The above copyright notice and this permission notice shall be included in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    13
# all copies or substantial portions of the Software.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    14
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    15
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    16
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    17
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    18
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    19
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    20
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 264
diff changeset
    21
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    22
from functools import partial
143
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
    23
243
b348d8f15b0a tests for OfferChaning added
Sandro Knauß <knauss@netzguerilla.net>
parents: 238
diff changeset
    24
from twisted.python import log
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    25
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
    26
162
497d6b9b6914 make difference between NoRoute and NoRouteForTask
Sandro Knauß <knauss@netzguerilla.net>
parents: 161
diff changeset
    27
from ..error import NoRouteForTask, RejectRecipient
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    28
142
7d0c1fa97123 task._run umbau zu inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 141
diff changeset
    29
from ..model.offer import offers
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    30
from ..model.job import exJobs
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    32
from .pool  import taskPool
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
class Task:
264
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    35
    '''A Task is one message to one recipient and is a part of one :class:`iro.model.job.ExJob`.
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
    '''
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    37
    def __init__(self, recipient, job):
264
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    38
        """
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    39
        :param recipient: a recipient
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    40
        :param `iro.model.job.ExJob` job: connected job
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    41
        """
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    42
        self.recipient = recipient
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    43
        self.job = job
217
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    44
        self.status = None
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    45
        self.error = False
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    46
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    47
    def setStatus(self,status):
264
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    48
        """callback, to set status of task"""
217
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    49
        self.status = status
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    50
        return status
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    51
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    52
    def setError(self, error):
264
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    53
        """errback to set error of task"""
217
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    54
        self.status = error
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    55
        self.error = True
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    56
        return error
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    57
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    58
    def start(self):
264
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    59
        """Starting to send message to recipient.
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    60
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    61
        :return: a defer, that is fired, when message is sended successfully over any offer.
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    62
        """
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    63
        self.d = Deferred()
217
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    64
        self.d.addCallback(self.setStatus)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    65
        self.d.addCallback(partial(self.job.setStatus,self))
217
d755b2e0cc0b task now saves own status
Sandro Knauß <knauss@netzguerilla.net>
parents: 162
diff changeset
    66
        self.d.addErrback(self.setError)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    67
        self.d.addErrback(partial(self.job.setError,self))
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    68
        taskPool.run(self._run)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    69
        return self.d
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    70
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    71
    def _run(self):
264
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    72
        """sends the message to recipient, tries all possible offers."""
238
c36b117f7400 using iter function instead of generator
Sandro Knauß <knauss@netzguerilla.net>
parents: 234
diff changeset
    73
        os= iter(self.job.offers)
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    74
        def n():
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    75
            try:
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    76
                offer = os.next()
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    77
                d = maybeDeferred(offers[offer],self.recipient,self.job.message)
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    78
                d.addCallback(self.d.callback)
243
b348d8f15b0a tests for OfferChaning added
Sandro Knauß <knauss@netzguerilla.net>
parents: 238
diff changeset
    79
                d.addErrback(addErr,offer)
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    80
                d.addErrback(self.d.errback)
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    81
                return d
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    82
            except StopIteration:
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    83
                self.d.errback(NoRouteForTask())
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    84
243
b348d8f15b0a tests for OfferChaning added
Sandro Knauß <knauss@netzguerilla.net>
parents: 238
diff changeset
    85
        def addErr(failure, offer):
b348d8f15b0a tests for OfferChaning added
Sandro Knauß <knauss@netzguerilla.net>
parents: 238
diff changeset
    86
            if not isinstance(failure.value, RejectRecipient):  
b348d8f15b0a tests for OfferChaning added
Sandro Knauß <knauss@netzguerilla.net>
parents: 238
diff changeset
    87
                log.err(_why="Job(%s): Send to '%s' failed via '%s'"%(self.job.dbjob, self.recipient, offer),_stuff=failure)
b348d8f15b0a tests for OfferChaning added
Sandro Knauß <knauss@netzguerilla.net>
parents: 238
diff changeset
    88
            n()
234
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    89
        
08fcc2b6df99 refactoring task._run
Sandro Knauß <knauss@netzguerilla.net>
parents: 217
diff changeset
    90
        n()
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    91
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    92
143
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
    93
@inlineCallbacks
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    94
def createJob(user,recipients, msg, offers, info=None):
264
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    95
    """Creates a :class:`iro.model.job.ExJob` and start for all recipients one task.
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    96
    
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    97
    :param `iro.model.schema.User` user: the sender 
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    98
    :param `iro.model.message.Message` msg: the message
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
    99
    :param list offers: a list of possible offer and provider names, to try to send the message over. The first entry will be tried first.
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
   100
    :param string info: a bill group name
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
   101
    :return: the new :class:`iro.model.job.ExJob` object.
584b9c97ecfd iro.controller: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 243
diff changeset
   102
    """
143
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
   103
    job = yield exJobs.create(user, recipients, msg, offers, info)
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
   104
    for r in recipients:
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
   105
        task = Task(r,job)
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
   106
        job.addTask(task)
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
   107
        task.start()
0b265608b6ce using inlineCallbacks
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
   108
    returnValue(job)