deploy.py 5.34 KB
#-*- coding: utf-8 -*-
from flask import Flask, render_template, request, url_for
from iselenium import SeleniumInterface as SI
import random

app = Flask(__name__)

data = {
	"header" : {
		"patente" : "ABC123",
		"fecha" : "15-01-2019",
		"hora" : "11:10"
	},
	"alineador" : {
		"eje_delantero" : "0.000"
	},
	"suspension" : [
		{
			"rendimiento_izquierdo" : "0.000",
			"peso_estatico" : "0.000",
			"peso_dinamico" : "0.000",
			"rendimiento_derecho" : "0.000"
		}
	],
	"frenos" : [
		{
			"fuerza_izquierda" : "0.000",
			"resistencia_izquierda" : "0.000",
			"ovalidad_izquierda" : "0.000",
			"peso_estatico" : "0.000",
			"peso_dinamico" : "0.000",
			"fuerza_derecha" : "0.000",
			"resistencia_derecha" : "0.000",
			"ovalidad_derecha" : "0.000"
		}
	],
	"trasero" : {
		"fuerza_izquierda" : "0.000",
		"fuerza_derecha" : "0.000",
		"peso_estatico" : "0.000",
		"peso_dinamico" : "0.000"
	},
	"gaseshumos" : {
		"co" : "0.000",
		"hc" : "0.000",
		"opacidad_logaritmica" : "0.000"	
	}
}

@app.route('/')
def main():
	plate = "GXN560"
	s = SI(SI.Chrome)

	form = [
		{
			"rendimiento_izquierdo" : "0",
			"rendimiento_derecho" : "0",
		},
		{
			"rendimiento_izquierdo" : "0",
			"rendimiento_derecho" : "0",
		}
	]

	answer = {
		"header" : {},
		"alineador" : {},
		"suspension" : [],
		"frenos" : [],
		"trasero" : {},
		"gaseshumos" : {},
	}

	answer['header']['patente'] = plate.upper()

	try:
		answer = login(s, answer)
	except:
		return "Error en el login."
	try:
		answer = gototec(s, answer)
	except:
		return f"Error yendo a las especificaciones técnicas del dominio '{plate}'."
	#try:
	answer = readdata(s, answer)
	#except:
	#	return f"Error leyendo datos de la patente '{plate}'."
	#try:
	answer = extradata(form, answer)
	#except:
	#	return f"Error completando datos extra de la patente '{plate}'."

	return render_template(
		"resultados.html",
		data = answer
	)

def login(s, r):
	s.get("https://rto.cent.gov.ar/rto")

	login = s.find(SI.By.NAME, "j_username")
	s.write(login, "salvatellih")

	psw = s.find(SI.By.NAME, "j_password")
	s.write(psw, "3")

	button = s.find(SI.By.ID, "submit")
	button.click()

	return r

def gototec(s, r):
	s.get("https://rto.cent.gov.ar/rto/RTO/listaDePlanillas")

	# children of parent of td with innerText = plate
	found = False
	while(found == False):
		try:
			columns = s.children(s.parent( s.find(SI.By.XPATH, f"//tr//td[text()='{r['header']['patente']}']") ))
			r['header']['fecha'], r['header']['hora'] = s.readElement(columns[4]).split(" ")
			found = True
		except:
			# next page
			s.find(SI.By.XPATH, "//a[text()='Siguiente']").click()
		

	# get all a tags and click the last one
	options = s.findFromElement(columns[-1], SI.By.TAG_NAME, "a", "1-")
	options[-1].click()

	# if last clickable is 'Datos Técnicos', click, else you are already there
	tec = s.find(SI.By.XPATH, "//a/span[@class='externo']/parent::*", "1-")[-1]

	if tec.get_attribute("innerText") == "ir a Datos Técnicos":
		tec.click()
	
	return r

def readdata(s, r):
	reach = lambda id: lambda s: s.readInput( s.find(s.By.ID, id) )

	# alineacion
	r['alineador']['eje_delantero'] = attempt_do(reach("deriva"), default = "?")(s)

	# suspension
	for i in range(2):
		sus = {}
		sus['fuerza_izquierda'] = attempt_do(reach(f"fuerzaIzq-{i}"), default = "?")(s)
		sus['fuerza_derecha'] = attempt_do(reach(f"fuerzaDer-{i}"), default = "?")(s)

		r['suspension'].append(sus)

	# frenos
	frenos = s.find(SI.By.XPATH, "//table[@class='tabla_ensayo']/tbody//tr[@class='odd' or @class='even']","1-4")
	for i in range(len(frenos)):
		fre = {}
		fre['peso_estatico'] = attempt_do(reach(f"pesoBascula-{i}"), default = "?")(s)
		fre['peso_dinamico'] = attempt_do(reach(f"pesoMaximo-{i}"), default = "?")(s)
		fre['fuerza_izquierda'] = attempt_do(reach(f"fuerzaIzq-{i}"), default = "?")(s)
		fre['fuerza_derecha'] = attempt_do(reach(f"fuerzaDer-{i}"), default = "?")(s)

		r['frenos'].append(fre)

	# freno trasero

	r['trasero']['peso_estatico'] = attempt_do(reach(f"pesoBasculaEst-0"), default = "?")(s)
	r['trasero']['peso_dinamico'] = attempt_do(reach(f"pesoMaximoEst-0"), default = "?")(s)
	r['trasero']['fuerza_izquierda'] = attempt_do(reach(f"fuerzaIzqEst-0"), default = "?")(s)
	r['trasero']['fuerza_derecha'] = attempt_do(reach(f"fuerzaDerEst-0"), default = "?")(s)

	# gases y humos

	r['gaseshumos']['opacidad_logaritmica'] = attempt_do(reach(f"opacidadLogaritmica"), default = "?")(s)
	r['gaseshumos']['co'] = attempt_do(reach(f"co"), default = "?")(s)
	r['gaseshumos']['hc'] = attempt_do(reach(f"hc"), default = "?")(s)

	return r

def extradata(form, r):

	res = lambda: round(random.random() * 0.9 + 0.05, 2)
	ov = lambda: round(random.random() * 39 + 0.5, 2)

	for i in range(len(r['suspension'])):
		r['suspension'][i]['rendimiento_izquierdo'] = form[i]['rendimiento_izquierdo']
		r['suspension'][i]['rendimiento_derecho'] = form[i]['rendimiento_derecho']

	for i in range(len(r['frenos'])):
		r['frenos'][i]['resistencia_izquierda'] = res()
		r['frenos'][i]['resistencia_derecha'] = res()
		r['frenos'][i]['ovalidad_izquierda'] = ov()
		r['frenos'][i]['ovalidad_derecha'] = ov()
	
	return r

# Executes the lambda with the arguments, with try except
def attempt_do(f, default = "", error = ""):
	def inner(*args, **kwargs):
		try:
			return f(*args, **kwargs)
		except:
			if error != "":
				raise Exception(error)
			return default
	return inner

# Inicio del servicio
if __name__ == "__main__":
        app.run("0.0.0.0")