|
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() |