iro/model/job.py
branchdevel
changeset 135 f8640c663e3e
child 140 75d0eaaa871d
equal deleted inserted replaced
134:fae3fdfece65 135:f8640c663e3e
       
     1 import random
       
     2 from collections import MutableMapping
       
     3 
       
     4 from twisted.python import threadable
       
     5 
       
     6 from .schema import Job as DBJob
       
     7 from .dbdefer import dbdefer
       
     8 
       
     9 from iro.error import JobNotFound
       
    10 
       
    11 class Status:
       
    12     '''status for one recipient'''
       
    13     todo = 1
       
    14     good = 2
       
    15     error = 3
       
    16     def __init__(self, job):
       
    17         self.status = Status.todo
       
    18         self.job = job
       
    19         self.offer = None           #the offer over that this job was done
       
    20         self.errtext = None         #the error text
       
    21 
       
    22 class Job:
       
    23     '''One Job is a class that handles one job has multiple tasks'''
       
    24     def __init__(self, user, recipients, message, offers, info=None):
       
    25         self.dbjob = None       #Connection to mysql job element
       
    26         self.message = message
       
    27         self.recipients = recipients
       
    28         self.offers = offers
       
    29         self.info = info
       
    30         self.tasks={}
       
    31         self.user = user
       
    32 
       
    33     def setStatus(task,status):
       
    34         pass
       
    35 
       
    36     def setError(task,err):
       
    37         pass
       
    38 
       
    39     @dbdefer
       
    40     def registerJob(self, session, id):
       
    41         self.id = id
       
    42         u = session.merge(self.user)
       
    43         self.dbjob=DBJob(hash=self.id, info=self.info, status="started")
       
    44         u.jobs.append(self.dbjob)
       
    45         session.commit()
       
    46 
       
    47     @classmethod
       
    48     @dbdefer
       
    49     def fromDB(cls, session, id):
       
    50         j = session.query(DBJob).filter_by(hash=id).first()
       
    51         if not j:
       
    52             raise JobNotFound
       
    53         job = cls(j.user, [], None, None, j.info)
       
    54         job.dbjob = j
       
    55         job.id = j.hash
       
    56         return job
       
    57 
       
    58 
       
    59 class Jobs(dict, MutableMapping):
       
    60 
       
    61     synchronized = ['getNewId']
       
    62 
       
    63     def create(self, user, recipients, message, offers, info=None):
       
    64         job = Job(user, recipients, message, offers, info)
       
    65         job.registerJob(id = self.getNewId())
       
    66         self[job.id] = job
       
    67         return job
       
    68 
       
    69     @dbdefer
       
    70     def getNewId(self, session):
       
    71         while True:
       
    72             id = ''.join([random.choice('0123456789abcdef') for i in range(40)])
       
    73             if id not in self.keys():
       
    74                 self[id]=None
       
    75                 if not session.query(DBJob.hash).filter_by(hash=id).first():
       
    76                     return id
       
    77 
       
    78     def __getitem__(self, key):
       
    79         try:
       
    80             return dict.__getitem__(self, key)
       
    81         except KeyError as e:
       
    82             pass
       
    83        
       
    84         try:
       
    85             self[key]=Job.fromDB(key)
       
    86             return self[key]
       
    87         except JobNotFound:
       
    88             raise e
       
    89 
       
    90 threadable.synchronize(Jobs)
       
    91 
       
    92 jobs = Jobs()