iro/model/job.py
author Sandro Knauß <knauss@netzguerilla.net>
Thu, 29 Mar 2012 18:27:15 +0200
branchdevel
changeset 263 52284710c0b4
parent 258 0a5eb5aac0be
child 294 0e75bd39767d
permissions -rw-r--r--
iro.model: adding docstrings
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
245
4526747a42ca some more messages about job status
Sandro Knauß <knauss@netzguerilla.net>
parents: 218
diff changeset
     1
from twisted.python import log, threadable
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
     2
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
     3
from datetime import datetime
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     4
from collections import MutableMapping
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     5
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
     6
import schema
156
a4ad521b127b moving Status to own file
Sandro Knauß <knauss@netzguerilla.net>
parents: 152
diff changeset
     7
import offer
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     8
from .dbdefer import dbdefer
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     9
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    10
class ExJob:
258
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    11
    ''' A ExJob object represents a message to multiple recipients over multiple offers to send.  
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    12
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    13
    One single message to one recipient is handeld in :class:`iro.controller.task.Task`.
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    14
    This class holds connections to all tasks.
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    15
    This class is responsiple to update the status in database of one job and updating the bill.
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    16
    '''
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    17
    
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    18
    synchronized = ["incStatus", "_status"]
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    19
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    20
    def __init__(self, dbjob, recipients, message, offers):
258
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    21
        """Constructor of ExJob.
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    22
        
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    23
        :param dbjob: primary key of the job element in database
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    24
        :param list recipients: list of all recipients
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    25
        :param `iro.model.message.Message` message: message to send
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    26
        :param list offers: list of all possible offers to send message over
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    27
        """
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    28
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    29
        self.dbjob = dbjob       #Connection to database job element (id)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    30
        self.message = message
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
        self.recipients = recipients
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    32
        self.offers = offers
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
        self.tasks={}
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    34
        self.c = 0
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    35
        self.status = "started"
245
4526747a42ca some more messages about job status
Sandro Knauß <knauss@netzguerilla.net>
parents: 218
diff changeset
    36
        log.msg("Job(%s) created."%(self.dbjob))
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    37
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    38
    def addTask(self,task):
258
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    39
        """adding a task to tasks dict - key is the recipient.
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    40
        
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    41
        :param `iro.controller.task.Task` task: a task
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    42
        """
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    43
        self.tasks[task.recipient] = task
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    44
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    45
    def incStatus(self):
258
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    46
        """increments the processed messages (function is threadsafe)."""
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    47
        self.c += 1
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    48
        return self.c
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    49
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    50
    def _status(self, session, status):
258
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    51
        """updates the status of the database object (function is threadsafe).
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    52
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    53
        :param session: a valid database session
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    54
        :param string status: new status
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    55
        """
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    56
        job = schema.Job.get(session, self.dbjob)
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    57
        if self.status == "error":
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    58
            return
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    59
        elif self.status == "sended" and status != "error":
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    60
            return
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    61
        job.status = status
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    62
        self.status = status
245
4526747a42ca some more messages about job status
Sandro Knauß <knauss@netzguerilla.net>
parents: 218
diff changeset
    63
        log.msg("Job(%s) status changed to: %s."%(self.dbjob, status))
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    64
        session.commit()
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    65
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    66
    @dbdefer
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    67
    def setStatus(self, session, task, status):
258
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    68
        """callback of one task.
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    69
        
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    70
        This function  updates the database object and the bill.
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    71
        """
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    72
        c = self.incStatus()
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    73
        job = schema.Job.get(session, self.dbjob)
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    74
        
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    75
        if c == len(self.recipients):
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    76
            self._status(session,"sended") 
245
4526747a42ca some more messages about job status
Sandro Knauß <knauss@netzguerilla.net>
parents: 218
diff changeset
    77
        elif job.status in ["started","init"]:
4526747a42ca some more messages about job status
Sandro Knauß <knauss@netzguerilla.net>
parents: 218
diff changeset
    78
            self._status(session,"sending")
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    79
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    80
        if status.costs > 0:
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    81
            o = schema.Offer.get(session, status.provider.name, status.route, self.message.typ)
215
5bacdb7e94d1 smstrade.StatusCode update
Sandro Knauß <knauss@netzguerilla.net>
parents: 175
diff changeset
    82
            job.messages.append(schema.Message(price=status.costs, isBilled=False, recipient=str(task.recipient), count=status.count, exID=status.exID, date=datetime.today(), offer=o))
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    83
        session.commit()
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    84
        
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    85
        log.msg("Job(%s) to '%s' ended sucecessfully via %s:%s."%(self.dbjob, task.recipient, status.provider.name,status.route))
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    86
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    87
    @dbdefer
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    88
    def setError(self, session, task, err):
258
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    89
        """errback for one task.
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    90
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    91
        This function updates the database object.
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
    92
        """
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    93
        self.incStatus()
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    94
        if self.status != "error":
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    95
            self._status(session,"error")
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    96
        log.err(_why="Error: Job(%s) to '%s' failed."%(self.dbjob, task.recipient),_stuff=err)
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    97
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    98
threadable.synchronize(ExJob)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    99
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
   100
class ExJobs(dict, MutableMapping):
258
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   101
    """ a dict to handle all jobs.
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   102
    """
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   103
    @dbdefer
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
   104
    def create(self, session, user, recipients, message, offers, info=None):
258
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   105
        """creates on new Job.
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   106
        
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   107
        :param session: a valid session ( created by decorator :func:`iro.model.dbdefer.dbdefer`)
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   108
        :param `iro.model.schema.User` user: a user object
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   109
        :param list recipients: list of all recipients
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   110
        :param `iro.model.message.Message` message: message to send
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   111
        :param list offers: a list of offers ( list will be reduced to the allowed offers for the **user** -- using :func:`iro.model.offer.extendProvider`)
263
52284710c0b4 iro.model: adding docstrings
Sandro Knauß <knauss@netzguerilla.net>
parents: 258
diff changeset
   112
        :param string info: a bill group name
258
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   113
        :returns: the new job
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   114
        """
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
   115
        user = session.merge(user)
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
   116
        job = schema.Job(info=info, status="started")
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
   117
        user.jobs.append(job)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   118
        session.commit()
152
14c99c89edf4 using extendProvide in Job.create
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
   119
        
156
a4ad521b127b moving Status to own file
Sandro Knauß <knauss@netzguerilla.net>
parents: 152
diff changeset
   120
        o = offer.extendProvider(user, message.typ, offers, session=session)
152
14c99c89edf4 using extendProvide in Job.create
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
   121
        self[job.id] = ExJob(job.id, recipients, message, o)
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
   122
        return self[job.id]
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   123
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
   124
exJobs = ExJobs()
258
0a5eb5aac0be iro.model: adding docstring
Sandro Knauß <knauss@netzguerilla.net>
parents: 245
diff changeset
   125
"""the dict of all available jobs."""