iro/model/job.py
author Sandro Knauß <knauss@netzguerilla.net>
Mon, 05 Mar 2012 23:52:29 +0100
branchdevel
changeset 218 91f87ad13540
parent 215 5bacdb7e94d1
child 245 4526747a42ca
permissions -rw-r--r--
integration tests for smtp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
     1
from twisted.python import log
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
     2
from twisted.python import threadable
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
     3
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
     4
from datetime import datetime
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     5
from collections import MutableMapping
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     6
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
     7
import schema
156
a4ad521b127b moving Status to own file
Sandro Knauß <knauss@netzguerilla.net>
parents: 152
diff changeset
     8
import offer
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     9
from .dbdefer import dbdefer
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    10
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    11
class ExJob:
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    12
    '''One Job is a class that handles one job. One Job has multiple tasks.'''
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    13
    
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    14
    synchronized = ["incStatus", "_status"]
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    15
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    16
    def __init__(self, dbjob, recipients, message, offers):
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    17
        self.dbjob = dbjob       #Connection to mysql job element (id)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    18
        self.message = message
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    19
        self.recipients = recipients
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    20
        self.offers = offers
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    21
        self.tasks={}
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    22
        self.c = 0
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    23
        self.status = "started"
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    24
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    25
    def addTask(self,task):
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    26
        self.tasks[task.recipient] = task
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    27
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    28
    def incStatus(self):
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    29
        self.c += 1
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    30
        return self.c
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    31
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    32
    def _status(self, session, status):
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    33
        job = schema.Job.get(session, self.dbjob)
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    34
        if self.status == "error":
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    35
            return
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    36
        elif self.status == "sended" and status != "error":
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    37
            return
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    38
        job.status = status
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    39
        self.status = status
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    40
        session.commit()
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    41
175
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    42
    @dbdefer
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    43
    def setStatus(self, session, task, status):
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    44
        c = self.incStatus()
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    45
        job = schema.Job.get(session, self.dbjob)
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    46
        
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    47
        if job.status in ["started","init"]:
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    48
            self._status(session,"sending")
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    49
        if c == len(self.recipients):
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    50
            self._status(session,"sended") 
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    51
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    52
        if status.costs > 0:
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    53
            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
    54
            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
    55
        session.commit()
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    56
        
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    57
        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
    58
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    59
    @dbdefer
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    60
    def setError(self, session, task, err):
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    61
        self.incStatus()
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    62
        if self.status != "error":
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    63
            self._status(session,"error")
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    64
        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
    65
c29acd5fb841 splitting tests.job -> test.job, tests.tasks
Sandro Knauß <knauss@netzguerilla.net>
parents: 156
diff changeset
    66
threadable.synchronize(ExJob)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    67
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    68
class ExJobs(dict, MutableMapping):
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    69
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    70
    @dbdefer
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    71
    def create(self, session, user, recipients, message, offers, info=None):
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    72
        user = session.merge(user)
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    73
        job = schema.Job(info=info, status="started")
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    74
        user.jobs.append(job)
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    75
        session.commit()
152
14c99c89edf4 using extendProvide in Job.create
Sandro Knauß <knauss@netzguerilla.net>
parents: 142
diff changeset
    76
        
156
a4ad521b127b moving Status to own file
Sandro Knauß <knauss@netzguerilla.net>
parents: 152
diff changeset
    77
        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
    78
        self[job.id] = ExJob(job.id, recipients, message, o)
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    79
        return self[job.id]
135
f8640c663e3e model.job created
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    80
140
75d0eaaa871d start fixing job mangement
Sandro Knauß <knauss@netzguerilla.net>
parents: 135
diff changeset
    81
exJobs = ExJobs()