--- a/iro/model/job.py Sun Feb 19 17:44:44 2012 +0100
+++ b/iro/model/job.py Sun Feb 19 17:47:39 2012 +0100
@@ -1,3 +1,7 @@
+from twisted.python import log
+from twisted.python import threadable
+
+from datetime import datetime
from collections import MutableMapping
import schema
@@ -5,22 +9,62 @@
from .dbdefer import dbdefer
class ExJob:
- '''One Job is a class that handles one job has multiple tasks'''
+ '''One Job is a class that handles one job. One Job has multiple tasks.'''
+
+ synchronized = ["incStatus", "_status"]
+
def __init__(self, dbjob, recipients, message, offers):
self.dbjob = dbjob #Connection to mysql job element (id)
self.message = message
self.recipients = recipients
self.offers = offers
self.tasks={}
+ self.c = 0
+ self.status = "started"
def addTask(self,task):
self.tasks[task.recipient] = task
- def setStatus(task,status):
- pass
+ def incStatus(self):
+ self.c += 1
+ return self.c
+
+ def _status(self, session, status):
+ job = schema.Job.get(session, self.dbjob)
+ if self.status == "error":
+ return
+ elif self.status == "sended" and status != "error":
+ return
+ job.status = status
+ self.status = status
+ session.commit()
- def setError(task,err):
- pass
+ @dbdefer
+ def setStatus(self, session, task, status):
+ c = self.incStatus()
+ job = schema.Job.get(session, self.dbjob)
+
+ if job.status in ["started","init"]:
+ self._status(session,"sending")
+ if c == len(self.recipients):
+ self._status(session,"sended")
+
+ if status.costs > 0:
+ o = schema.Offer.get(session, status.provider.name, status.route, self.message.typ)
+ job.messages.append(schema.Message(price=status.costs, isBilled=False, recipient=str(task.recipient), date=datetime.today(), offer=o))
+ session.commit()
+
+ log.msg("Job(%s) to '%s' ended sucecessfully via %s:%s."%(self.dbjob, task.recipient, status.provider.name,status.route))
+
+ @dbdefer
+ def setError(self, session, task, err):
+ self.incStatus()
+ if self.status != "error":
+ self._status(session,"error")
+
+ log.err(_why="Error: Job(%s) to '%s' failed."%(self.dbjob, task.recipient),_stuff=err)
+
+threadable.synchronize(ExJob)
class ExJobs(dict, MutableMapping):