process.py
3.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
from services import serviceFactory
from database import DBconnection
from enums import Services, States, Datatypes, Table
import ipdb, os, json
class Process:
def __init__(self,db):
self.db = db
self.conn = DBconnection(db)
# Guarda la data
def datastore(self,id,path):
entities = {
Table.id : id,
Table.path : path,
Table.state : States.preprocess
}
return self.conn.insert("msg",entities)
# Guarda los parámetros
def paramstore(self,query):
row = self.lookup(query[Table.id])
# id no existe
if type(row) == str:
return row
# el servicio no existe
if not Services.validate(query[Table.serv]):
return "No existe el servicio '" + query[Table.serv] + "'"
types = json.loads(query[Table.type])
filelist = os.listdir(row[Table.path])
for file in types:
# el archivo no existe
if file not in filelist:
return "El archivo '" + file + "' no existe"
serv = serviceFactory(query[Table.serv])
# el tipo del mensaje no se puede enviar por el servicio
if not serv.validatetype(types[file]):
return "El servicio '" + query[Table.serv] + "' no puede enviar el tipo '" + types[file] + "' destinado al archivo '" + file + "'"
# el parametro no es valido
if not serv.validateinfo(query[Table.info]):
return "El servicio '" + query[Table.serv] + "' no cuenta con algún parámetro, sus parámetros son " + str(serv.Parameters)
entities = {
Table.dest : query[Table.dest],
Table.serv : query[Table.serv],
Table.type : query[Table.type],
Table.info : query[Table.info],
Table.state : States.queued
}
error = self.conn.update("msg",(Table.id,query[Table.id]),entities)
if error:
return error
return States.queued
# manda todos los mensajes no enviados
def send(self):
rows = self.conn.query("SELECT * FROM msg WHERE state = ?",(States.queued,))
for query in DBconnection.parseToTable(rows):
# si no existe la carpeta borrar el mensaje
if not os.path.exists(query[Table.path]):
self.conn.query("DELETE FROM msg WHERE id = ?",(query[Table.id],))
continue
serv = serviceFactory(query[Table.serv])
success = serv.send(query)
d = json.loads(query[Table.type])
partial = False
for file in success:
if success[file] == True:
# borrar archivo de 'type'
del d[file]
# y el archivo mismo
os.remove(query[Table.path] + file)
# se borró algo
partial = True
# todo enviado
if len(d) == 0:
self.conn.query("UPDATE msg SET state = ?, type = ? WHERE id = ?",(States.delivered,json.dumps(d),query[Table.id]))
# parcialmente enviado
elif partial:
self.conn.query("UPDATE msg SET state = ?, type = ? WHERE id = ?",(States.partial,json.dumps(d),query[Table.id]))
# devuelve el estado de un mensaje, lo archiva si está enviado
def lookup(self,id):
rows = self.conn.query("SELECT * FROM msg WHERE id = ?",(id,))
if rows == []:
return "El id " + str(id) + " no existe"
rows = DBconnection.parseToTable(rows)
row = rows[0]
if row[Table.state] == States.delivered:
self.conn.query("DELETE FROM msg WHERE id = ?",(id,))
entities = {
Table.path : row[Table.path],
Table.serv : row[Table.serv],
Table.dest : row[Table.dest],
Table.type : row[Table.type],
Table.state : row[Table.state],
}
self.conn.insert("history",entities)
return row
# devuelve todas las carpetas de mensajes
def paths(self):
rows = self.conn.query("SELECT path FROM msg")
paths = []
for row in rows:
paths.append(row[0])
return paths