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