Commit 04bac838 by Luciano Barletta

added no confirmation option

1 parent 35581615
...@@ -50,6 +50,7 @@ Llamando a este link se envían los parámetros de envío del mensaje pasado en ...@@ -50,6 +50,7 @@ Llamando a este link se envían los parámetros de envío del mensaje pasado en
- Bajo 'dest' se envía la dirección de destino, el formato puede variar dependiendo del servicio y dicho formato será documentado - Bajo 'dest' se envía la dirección de destino, el formato puede variar dependiendo del servicio y dicho formato será documentado
- Bajo 'type' se envía un json { archivo : tipo }, donde a cada archivo (a través del nombre del paso anterior) se le asigna un tipo válido para el servicio - Bajo 'type' se envía un json { archivo : tipo }, donde a cada archivo (a través del nombre del paso anterior) se le asigna un tipo válido para el servicio
- Bajo 'info' se envía un json { parámetro : valor }, donde se asignan parámetros específicos del servicio - Bajo 'info' se envía un json { parámetro : valor }, donde se asignan parámetros específicos del servicio
- Bajo 'conf' se envía true o false, dependiendo si se requiere confirmación del mensaje o no. El no envío del parámetro es sinónimo de false. Aunque no se cuente con confirmación, se puede consultar, el único estado no chequeable es 'delivered'
En caso de que no exista el servicio o este no admita el tipo, o que el id no exista, se devolverá un mensaje de error con esa información. Caso contrario, se devolverá el string 'queued' desmotrando que todo salió bien y que el mensaje está en cola. En caso de que no exista el servicio o este no admita el tipo, o que el id no exista, se devolverá un mensaje de error con esa información. Caso contrario, se devolverá el string 'queued' desmotrando que todo salió bien y que el mensaje está en cola.
...@@ -92,6 +93,7 @@ data es un dictionario que contiene los datos del pedido guardados en la base de ...@@ -92,6 +93,7 @@ data es un dictionario que contiene los datos del pedido guardados en la base de
- En 'dest' se encuentra el destinatario - En 'dest' se encuentra el destinatario
- En 'type' se encuentra el formato de lo que queremos mandar - En 'type' se encuentra el formato de lo que queremos mandar
- En 'info' se encuentran los parámetros específicos del servicio, su obligatoriedad depende del servicio - En 'info' se encuentran los parámetros específicos del servicio, su obligatoriedad depende del servicio
- En 'conf' se especifica si se requiere confimación, no es relevante para la operación
- En 'state' se encuentra el estado del mensaje, que siempre será 'queued' y es completamente irrelevante a la operación - En 'state' se encuentra el estado del mensaje, que siempre será 'queued' y es completamente irrelevante a la operación
La función retorna un booleano del resultado. La función retorna un booleano del resultado.
......
from enums import Table, States, Services, Datatypes from enums import Table, States, Services, Datatypes
from services import serviceFactory from services import serviceFactory
import sqlite3, ipdb, json import sqlite3, json
class DBconnection: class DBconnection:
...@@ -14,6 +14,7 @@ class DBconnection: ...@@ -14,6 +14,7 @@ class DBconnection:
Table.dest : "TEXT", Table.dest : "TEXT",
Table.type : "TEXT", Table.type : "TEXT",
Table.info : "TEXT", Table.info : "TEXT",
Table.conf : "TEXT",
Table.state : "TEXT" Table.state : "TEXT"
} }
...@@ -105,6 +106,8 @@ class DBconnection: ...@@ -105,6 +106,8 @@ class DBconnection:
return serviceFactory(information[Table.serv]).validateinfo(information[column]) return serviceFactory(information[Table.serv]).validateinfo(information[column])
elif column == Table.state: elif column == Table.state:
valid = States.validate(information[column]) valid = States.validate(information[column])
elif column == Table.conf:
valid = information[column] == None or information[column] == 'None' or information[column].lower() == "true" or information[column].lower() == "false"
if not valid: if not valid:
return "El dato '" + str(information[column]) + "' no es valido" return "El dato '" + str(information[column]) + "' no es valido"
......
...@@ -4,7 +4,7 @@ from werkzeug.datastructures import FileStorage ...@@ -4,7 +4,7 @@ from werkzeug.datastructures import FileStorage
from process import Process from process import Process
from python_arptable import get_arp_table from python_arptable import get_arp_table
from enums import States, Table from enums import States, Table
import os, ipdb, time, threading, random, datetime import os, time, threading, random, datetime
app = Flask(__name__) app = Flask(__name__)
...@@ -94,7 +94,8 @@ def msg(): ...@@ -94,7 +94,8 @@ def msg():
Table.serv : request.values['serv'], Table.serv : request.values['serv'],
Table.dest : request.values['dest'], Table.dest : request.values['dest'],
Table.type : request.values['type'], Table.type : request.values['type'],
Table.info : request.values.get('info') Table.info : request.values.get('info'),
Table.conf : request.values.get('conf')
} }
state = process.paramstore(query) state = process.paramstore(query)
return state return state
......
...@@ -5,6 +5,7 @@ class Table: ...@@ -5,6 +5,7 @@ class Table:
dest = "dest" dest = "dest"
type = "type" type = "type"
info = "info" info = "info"
conf = "conf"
state = "state" state = "state"
@staticmethod @staticmethod
......
from services import serviceFactory from services import serviceFactory
from database import DBconnection from database import DBconnection
from enums import Services, States, Datatypes, Table from enums import Services, States, Datatypes, Table
import ipdb, os, json import os, json
class Process: class Process:
...@@ -39,13 +39,14 @@ class Process: ...@@ -39,13 +39,14 @@ class Process:
return "El servicio '" + query[Table.serv] + "' no puede enviar el tipo '" + types[file] + "' destinado al archivo '" + file + "'" return "El servicio '" + query[Table.serv] + "' no puede enviar el tipo '" + types[file] + "' destinado al archivo '" + file + "'"
# el parametro no es valido # el parametro no es valido
if not serv.validateinfo(query[Table.info]): 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) return "El servicio '" + query[Table.serv] + "' no cuenta con algún parámetro enviado"
entities = { entities = {
Table.dest : query[Table.dest], Table.dest : query[Table.dest],
Table.serv : query[Table.serv], Table.serv : query[Table.serv],
Table.type : query[Table.type], Table.type : query[Table.type],
Table.info : query[Table.info], Table.info : query[Table.info],
Table.conf : query[Table.conf],
Table.state : States.queued Table.state : States.queued
} }
error = self.conn.update("msg",(Table.id,query[Table.id]),entities) error = self.conn.update("msg",(Table.id,query[Table.id]),entities)
...@@ -78,7 +79,14 @@ class Process: ...@@ -78,7 +79,14 @@ class Process:
# todo enviado # todo enviado
if len(d) == 0: if len(d) == 0:
self.conn.query("UPDATE msg SET state = ?, type = ? WHERE id = ?",(States.delivered,json.dumps(d),query[Table.id])) # no se espera confirmacion
if query[Table.conf] == 'None' or query[Table.conf] == 'None':
self.conn.query("DELETE FROM msg WHERE id = ?",(query[Table.id],))
del query[Table.id]
self.conn.insert("history",query)
# se espera confirmacion
elif query[Table.conf] == "true":
self.conn.query("UPDATE msg SET state = ?, type = ? WHERE id = ?",(States.delivered,json.dumps(d),query[Table.id]))
# parcialmente enviado # parcialmente enviado
elif partial: elif partial:
self.conn.query("UPDATE msg SET state = ?, type = ? WHERE id = ?",(States.partial,json.dumps(d),query[Table.id])) self.conn.query("UPDATE msg SET state = ?, type = ? WHERE id = ?",(States.partial,json.dumps(d),query[Table.id]))
......
...@@ -63,6 +63,7 @@ class Wpp1(ServiceBase): ...@@ -63,6 +63,7 @@ class Wpp1(ServiceBase):
return type in Wpp1.Allowed return type in Wpp1.Allowed
def validateinfo(self,info): def validateinfo(self,info):
info = None if info == 'None' else info
if info == None: if info == None:
return True return True
i = json.loads(info) i = json.loads(info)
...@@ -133,6 +134,7 @@ class Mail(ServiceBase): ...@@ -133,6 +134,7 @@ class Mail(ServiceBase):
return type in Mail.Allowed return type in Mail.Allowed
def validateinfo(self,info): def validateinfo(self,info):
info = None if info == 'None' else info
if info == None: if info == None:
return False return False
i = json.loads(info) i = json.loads(info)
......
import os, time, requests, ipdb, json, threading import os, time, requests, json, threading
from database import DBconnection from database import DBconnection
URL = "http://192.168.15.75:5000/" URL = "http://192.168.15.21:5000/"
TESTPHONE = "5493415959169" TESTPHONE = "5493415959169"
TESTMAIL = "sujetodeprueba0110@gmail.com" TESTMAIL = "sujetodeprueba0110@gmail.com"
FOLDER = "testfolder/" FOLDER = "testfolder/"
SENDING_TIME = 60 # aumentar a medida que se vuelva necesario SENDING_TIME = 60 # aumentar a medida que se vuelva necesario
START_TIME = 10 # cambiar dependiendo de la velocidad de la máquina
def wpp1(phone): def wpp1(phone):
id = requests.post(url = URL + "data", files = { id = requests.post(url = URL + "data", files = {
...@@ -24,7 +25,8 @@ def wpp1(phone): ...@@ -24,7 +25,8 @@ def wpp1(phone):
'wpimage' : 'image', 'wpimage' : 'image',
'wpmedia' : 'document', 'wpmedia' : 'document',
'wplink' : 'link' 'wplink' : 'link'
}) }),
'conf' : 'true'
}) })
assert state.text == "queued" , "'" + state.text + "' no es igual a 'queued'" assert state.text == "queued" , "'" + state.text + "' no es igual a 'queued'"
time.sleep(SENDING_TIME) time.sleep(SENDING_TIME)
...@@ -51,7 +53,8 @@ def mail(mail): ...@@ -51,7 +53,8 @@ def mail(mail):
}), }),
'info' : json.dumps({ 'info' : json.dumps({
'subject' : 'Some Subject' 'subject' : 'Some Subject'
}) }),
'conf' : 'true'
}) })
assert state.text == "queued" , "'" + state.text + "' no es igual a 'queued'" assert state.text == "queued" , "'" + state.text + "' no es igual a 'queued'"
time.sleep(SENDING_TIME) time.sleep(SENDING_TIME)
...@@ -83,7 +86,8 @@ def encryption(phone): ...@@ -83,7 +86,8 @@ def encryption(phone):
'type' : json.dumps({ 'type' : json.dumps({
'plaintext' : 'text', 'plaintext' : 'text',
'plainimage' : 'image' 'plainimage' : 'image'
}) }),
'conf' : 'true'
}) })
assert state.text == "queued" , "'" + state.text + "' no es igual a 'queued'" assert state.text == "queued" , "'" + state.text + "' no es igual a 'queued'"
time.sleep(SENDING_TIME) time.sleep(SENDING_TIME)
...@@ -132,20 +136,52 @@ def errors(phone): ...@@ -132,20 +136,52 @@ def errors(phone):
}) })
}) })
assert error.text == "El servicio 'wpp1' no puede enviar el tipo '-' destinado al archivo 'errortext'" assert error.text == "El servicio 'wpp1' no puede enviar el tipo '-' destinado al archivo 'errortext'"
# parámetro incorrecto
error = requests.post(url = URL + "msg", params = {
'id' : id.text,
'serv' : "wpp1",
'dest' : phone,
'type' : json.dumps({
"errortext" : "text"
}),
'info' : json.dumps({
"-" : "-"
})
})
assert error.text == "El servicio 'wpp1' no cuenta con algún parámetro enviado"
def noconf(phone):
id = requests.post(url = URL + "data", files = {
'wpmsg' : open(FOLDER + "wptext","rb")
})
assert int(id.text) > 0 , id.text + "no es mayor a 0"
state = requests.post(url = URL + "msg", params = {
'id' : id.text,
'serv' : "wpp1",
'dest' : phone,
'type' : json.dumps({
'wpmsg' : 'text'
})
})
assert state.text == "queued" , "'" + state.text + "' no es igual a 'queued'"
time.sleep(SENDING_TIME)
error = requests.post(url = URL + "cons", params = {
'id' : id.text
})
assert (error.text == "El id " + id.text + " no existe") , "'" + error.text + "' no es igual a 'El id " + id.text + " no existe'"
def main(): def main():
if os.path.exists("messages.db"):
os.remove("messages.db")
try: try:
os.system("python3 deploy.py &") os.system("python3 deploy.py &")
time.sleep(3) time.sleep(START_TIME)
threads = [] threads = []
threads.append(threading.Thread(target = wpp1, args = (TESTPHONE,))) threads.append(threading.Thread(target = wpp1, args = (TESTPHONE,)))
threads.append(threading.Thread(target = encryption, args = (TESTPHONE,))) threads.append(threading.Thread(target = encryption, args = (TESTPHONE,)))
threads.append(threading.Thread(target = mail, args = (TESTMAIL,))) threads.append(threading.Thread(target = mail, args = (TESTMAIL,)))
threads.append(threading.Thread(target = errors, args = (TESTPHONE,))) threads.append(threading.Thread(target = errors, args = (TESTPHONE,)))
threads.append(threading.Thread(target = noconf, args = (TESTPHONE,)))
for thread in threads: for thread in threads:
thread.start() thread.start()
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!