iro/model/job.py
branchdevel
changeset 140 75d0eaaa871d
parent 135 f8640c663e3e
child 142 7d0c1fa97123
equal deleted inserted replaced
139:65117fd28400 140:75d0eaaa871d
     1 import random
       
     2 from collections import MutableMapping
     1 from collections import MutableMapping
     3 
     2 
     4 from twisted.python import threadable
     3 import schema
     5 
       
     6 from .schema import Job as DBJob
       
     7 from .dbdefer import dbdefer
     4 from .dbdefer import dbdefer
     8 
       
     9 from iro.error import JobNotFound
       
    10 
     5 
    11 class Status:
     6 class Status:
    12     '''status for one recipient'''
     7     '''status for one recipient'''
    13     todo = 1
     8     todo = 1
    14     good = 2
     9     good = 2
    17         self.status = Status.todo
    12         self.status = Status.todo
    18         self.job = job
    13         self.job = job
    19         self.offer = None           #the offer over that this job was done
    14         self.offer = None           #the offer over that this job was done
    20         self.errtext = None         #the error text
    15         self.errtext = None         #the error text
    21 
    16 
    22 class Job:
    17 class ExJob:
    23     '''One Job is a class that handles one job has multiple tasks'''
    18     '''One Job is a class that handles one job has multiple tasks'''
    24     def __init__(self, user, recipients, message, offers, info=None):
    19     def __init__(self, dbjob, recipients, message, offers):
    25         self.dbjob = None       #Connection to mysql job element
    20         self.dbjob = dbjob       #Connection to mysql job element (id)
    26         self.message = message
    21         self.message = message
    27         self.recipients = recipients
    22         self.recipients = recipients
    28         self.offers = offers
    23         self.offers = offers
    29         self.info = info
       
    30         self.tasks={}
    24         self.tasks={}
    31         self.user = user
    25 
       
    26     def addTask(self,task):
       
    27         self.tasks[task.recipient] = task
    32 
    28 
    33     def setStatus(task,status):
    29     def setStatus(task,status):
    34         pass
    30         pass
    35 
    31 
    36     def setError(task,err):
    32     def setError(task,err):
    37         pass
    33         pass
    38 
    34 
       
    35 class ExJobs(dict, MutableMapping):
       
    36 
    39     @dbdefer
    37     @dbdefer
    40     def registerJob(self, session, id):
    38     def create(self, session, user, recipients, message, offers, info=None):
    41         self.id = id
    39         user = session.merge(user)
    42         u = session.merge(self.user)
    40         job = schema.Job(info=info, status="started")
    43         self.dbjob=DBJob(hash=self.id, info=self.info, status="started")
    41         user.jobs.append(job)
    44         u.jobs.append(self.dbjob)
       
    45         session.commit()
    42         session.commit()
    46 
    43 
    47     @classmethod
    44         self[job.id] = ExJob(job.id, recipients, message, offers)
    48     @dbdefer
    45         return self[job.id]
    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 
    46 
    58 
    47 exJobs = ExJobs()
    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()