def menu_principal(): cadena = obtener_cadena_local() for bloque in cadena[1:]: if bloque['transactions']['tipo'] == 2 and bloque['transactions'][ 'usuario'] == session['usuario']: bloque_doctor = bloque hash_doctor = hashear(bloque_doctor) if request.method == 'POST': return render_template('menu_principal.html', bloque_doctor=bloque_doctor, hash_doctor=hash_doctor) elif request.method == 'GET': if session.get('usuario') is not None and session['tipo'] == 'doctor': return render_template('menu_principal.html', bloque_doctor=bloque_doctor, hash_doctor=hash_doctor) else: return redirect('iniciar_sesion.html')
def registrar_administrador(): cadena = obtener_cadena_local() if request.method == 'POST': if request.form.get('inputSuper') == 'Super administrador': tipo = 1 else: tipo = 0 nombres = request.form['inputNombres'].upper() apellidos = request.form['inputApellidos'].upper() usuario = request.form['inputUsuario'] contrasenia = hashear_contrasenia(request.form['inputContrasenia']) datos = {'tipo': 0, 'super': tipo, 'nombres': nombres, 'apellidos': apellidos, 'usuario': usuario, 'contrasenia': contrasenia} nueva_transaccion(datos) flash(MENSAJE_TRANSACCION) return redirect('administrador_principal.html') if session.get('usuario') is not None and session['tipo'] == 'admin': for bloque in cadena: if bloque['transactions']['tipo'] == 0: if bloque['transactions']['usuario'] == session['usuario']: bloque_admin = bloque return render_template('registrar_administrador.html', tipo_admin=bloque_admin['transactions']['super']) else: return redirect('administrador.html')
def generar_hashes_doctores(): cadena = obtener_cadena_local() archivo_hashes_doctores = open('datos/hashes_doctores.csv', 'w') # doctores for bloque in cadena: if bloque['transactions']['tipo'] == 2: archivo_hashes_doctores.write(hashear(bloque['transactions'])+'\n') archivo_hashes_doctores.close()
def __init__(self): self.dificultad_prueba = 3 self.ip_local = conseguir_ip_local() self.peers = self.escanear_nodos() self.transacciones = [] self.info_transacciones = [] self.chain = [] # Leer cadena local try: self.chain = obtener_cadena_local() # Si no existe cadena local except: datos = { 'tipo': 0, 'super': 1, 'nombres': 'Gary', 'apellidos': 'Candia Nina', 'usuario': 'gcandia', 'contrasenia': '7110eda4d09e062aa5e4a390b0a572ac0d2c0220' # 1234 } block = {'index': len(self.chain) + 1, 'transactions': datos, 'timestamp': str(datetime.datetime.now()), 'proof': 1, 'current_hash': self.hash(datos), 'previous_hash': 0} self.chain.append(block) finally: for ip in self.peers: if ip != self.ip_local: cadena_remota = obtener_cadena_remota(ip) if self.validar_cadena(cadena_remota): self.chain = cadena_remota self.transacciones = obtener_transacciones_remotas(ip)[ 0] self.info_transacciones = obtener_transacciones_remotas(ip)[ 1]['info_transacciones'] break with open('bdJson.json', 'w') as file: json.dump(self.chain, file, indent=2) self.repartir_nodos()
def ver_blockchain(): cadena = obtener_cadena_local() revision_cadena = buscar_bloques_corruptos(cadena) revision_cadena.insert(0, 1) cadena = cadena[::-1] revision_cadena = revision_cadena[::-1] return render_template('blockchain.html', cadena=cadena, revision_cadena=revision_cadena)
def administrador_principal(): cadena = obtener_cadena_local() if request.method == 'GET': if session.get('usuario') is not None and session['tipo'] == 'admin': for bloque in cadena: if bloque['transactions']['tipo'] == 0: if bloque['transactions']['usuario'] == session['usuario']: bloque_admin = bloque hash_admin = hashear(bloque_admin) return render_template('administrador_principal.html', bloque_admin=bloque_admin, hash_admin=hash_admin) else: return redirect('administrador.html')
def minar_bloque(self, tipo_bloque, datos): cadena_local = obtener_cadena_local() previous_block = cadena_local[-1] previous_proof = previous_block['proof'] proof = self.proof_of_work(previous_proof) previous_hash = self.hash(previous_block['transactions']) print('Minando bloque tipo ', tipo_bloque, '...') if tipo_bloque == 0: bloque = self.crear_bloque_administrador( proof, previous_hash, datos) elif tipo_bloque == 1: bloque = self.crear_bloque_paciente( proof, previous_hash, datos) elif tipo_bloque == 2: bloque = self.crear_bloque_doctor( proof, previous_hash, datos) elif tipo_bloque == 3: bloque = self.crear_bloque_registro_historia( proof, previous_hash, datos) with open('bdJson.json', 'r+') as file: bd_json = json.load(file) bd_json.append(bloque) file.seek(0) json.dump(bd_json, file, indent=2) print('Bloque minado correctamente.')
def cargar_historias(): datos_historias = pd.read_csv('datos/Historias-Data.csv') resta_dias = 600 cadena = obtener_cadena_local() for i in datos_historias.index: fila_pandas = dict(datos_historias.iloc[i]) hash_paciente = str(fila_pandas['hash_paciente']) hash_doctor = str(fila_pandas['hash_doctor']) titulo = str(fila_pandas['titulo']) descripcion = str(fila_pandas['descripcion']) lugar = str(fila_pandas['lugar']) transaction = {'tipo': 3, 'hash_paciente': hash_paciente, 'hash_doctor': hash_doctor, 'titulo': titulo, 'descripcion': descripcion, 'lugar': lugar} bloque = {'index': len(cadena) + 1, 'transactions': transaction, 'timestamp': str(datetime.datetime.now()-datetime.timedelta(days=resta_dias)+datetime.timedelta(minutes=random.randint(-180, 180))), 'proof': proof_of_work(cadena[-1]['proof']), 'current_hash': hashear(transaction), 'previous_hash': hashear(cadena[-1]['transactions']) } cadena.append(bloque) with open('bdJson.json', 'r+') as file: bd_json = json.load(file) bd_json.append(bloque) file.seek(0) json.dump(bd_json, file, indent=2) resta_dias -= 1
def iniciar_administrador(): cadena = obtener_cadena_local() if request.method == 'GET': if session.get('usuario') is not None and session['tipo'] == 'admin': return redirect('administrador_principal.html') else: return render_template('administrador.html') elif request.method == 'POST': usuario = request.form['input_usuario'] contrasenia = hashear_contrasenia(request.form['input_contrasenia']) hash = request.form['input_hash'] for bloque in cadena: if bloque['transactions']['tipo'] == 0: if usuario != "": if bloque['transactions']['usuario'] == usuario and bloque[ 'transactions']['contrasenia'] == contrasenia: session['usuario'] = usuario session['tipo'] = 'admin' return redirect('administrador_principal.html') else: if hashear(bloque) == hash: session['usuario'] = bloque['transactions']['usuario'] session['tipo'] = 'admin' return redirect('administrador_principal.html') error = 'Credenciales incorrectas' return render_template('administrador.html', error=error)
def busqueda_paciente(): cadena = obtener_cadena_local() if request.method == 'POST': nombre = request.form['inputNombre'] apellido = request.form['inputApellido'] dni = request.form['inputDni'] pacientes = list() for bloque in cadena[1:]: if bloque['transactions']['tipo'] == 1: if nombre != '' and nombre.upper() in bloque['transactions'][ 'nombres'] and bloque not in pacientes: pacientes.append(bloque) if apellido != '' and apellido.upper( ) in bloque['transactions'][ 'apellidos'] and bloque not in pacientes: pacientes.append(bloque) if bloque['transactions'][ 'dni'] == dni and bloque not in pacientes: pacientes.append(bloque) return render_template('resultado_busqueda.html', pacientes=pacientes) elif request.method == 'GET': if session.get('usuario') is not None and session['tipo'] == 'doctor': return render_template('busqueda_paciente.html') else: return redirect('iniciar_sesion.html')
def principal(): if request.method == 'GET': if session.get('usuario') is not None and session['tipo'] == 'doctor': return redirect('menu_principal.html') else: return render_template('iniciar_sesion.html') elif request.method == 'POST': usuario = request.form['input_usuario'] contrasenia = hashear_contrasenia(request.form['input_contrasenia']) hash = request.form['input_hash'] blockchain = obtener_cadena_local() for bloque in blockchain[1:]: if bloque['transactions']['tipo'] == 2: if usuario != "": if bloque['transactions']['usuario'] == usuario and bloque[ 'transactions']['contrasenia'] == contrasenia: session['usuario'] = usuario session['tipo'] = 'doctor' return redirect('menu_principal.html') else: if hashear(bloque) == hash: session['usuario'] = bloque['transactions']['usuario'] session['tipo'] = 'doctor' return redirect('menu_principal.html') error = 'Credenciales incorrectas' return render_template('iniciar_sesion.html', error=error)
def minar(): if request.method == 'POST': if 'btn_minar' in request.form: actualizado = False print('Verificando integridad de la cadena local...') flash('Verificando integridad de la cadena local...') if not blockchain.validar_cadena(obtener_cadena_local()): print( 'Integridad de la cadena no conforme, sincronizandose con la red...') flash( 'Integridad de la cadena no conforme, sincronizandose con la red...') for ip in blockchain.peers: if ip != blockchain.ip_local: try: cadena_remota = obtener_cadena_remota(ip) if blockchain.validar_cadena(cadena_remota): blockchain.chain = cadena_remota with open('bdJson.json', 'w') as file: json.dump(blockchain.chain, file, indent=2) actualizado = True break except: blockchain.peers.remove(ip) if not actualizado: print('No hay nodos válidos en la red, espere la sincronización.') flash('No hay nodos válidos en la red, espere la sincronización.') return render_template('minar.html', transacciones=blockchain.transacciones, info_transacciones=blockchain.info_transacciones, peers=blockchain.peers, estado=0) else: print('Integridad de la cadena conforme.') flash('Integridad de la cadena conforme.') tiempo_inicio = time.time() cantidad_transacciones = len(blockchain.transacciones) for transaccion in blockchain.transacciones: blockchain.minar_bloque(transaccion['tipo'], transaccion) tiempo_final = time.time() blockchain.transacciones.clear() blockchain.info_transacciones.clear() print(str(cantidad_transacciones)+' bloques minados correctamente en ' + str(round(tiempo_final-tiempo_inicio, 2)) + ' segundos.') flash(str(cantidad_transacciones)+' bloques minados correctamente en ' + str(round(tiempo_final-tiempo_inicio, 2)) + ' segundos.') for ip in blockchain.peers: if ip != blockchain.ip_local: try: requests.post(RUTA.format(ip, PUERTO_BLOCKCHAIN, '/cadena'), json=blockchain.chain) except: print('Eliminando nodo ' + ip) blockchain.peers.remove(ip) return render_template('minar.html', transacciones=blockchain.transacciones, info_transacciones=blockchain.info_transacciones, peers=blockchain.peers, estado=1) return render_template('minar.html', transacciones=blockchain.transacciones, info_transacciones=blockchain.info_transacciones, peers=blockchain.peers)
def detalle_historia(): cadena = obtener_cadena_local() for bloque in cadena[1:]: if bloque['transactions']['tipo'] == 2: if bloque['transactions']['usuario'] == session['usuario']: doctor = bloque break hash_doctor = hashear(doctor['transactions']) if request.method == 'POST': dni = request.args.get('dni') indice_filtrar = 0 if 'btn_registrar' in request.form: titulo = request.form['inputTitulo'] descripcion = request.form['inputDescripcion'] lugar = request.form['inputLugar'] estado_ticket = request.form['inputEstado'] input_indice = request.form['inputIndice'] for bloque in cadena[1:]: if bloque['transactions']['tipo'] == 1: if bloque['transactions']['dni'] == dni: paciente = bloque break hash_paciente = hashear(paciente['transactions']) if input_indice == 'Nuevo ticket': indice_historia = 1 for bloque in cadena[::-1]: if bloque['transactions']['tipo'] == 3 and bloque[ 'transactions']['hash_paciente'] == hash_paciente: indice_historia = bloque['transactions'][ 'indice_ticket'] + 1 break else: indice_historia = int(input_indice.split('-')[0]) datos = { 'tipo': 3, 'indice_ticket': indice_historia, 'estado_ticket': estado_ticket, 'hash_paciente': hash_paciente, 'hash_doctor': hash_doctor, 'titulo': titulo, 'descripcion': descripcion, 'lugar': lugar } nueva_transaccion(datos) flash(MENSAJE_TRANSACCION) elif 'btn_filtrar' in request.form: indice_filtrar = request.form['inputFiltrar'].split('-')[0] if indice_filtrar == 'Sin filtro': return redirect('detalle_historia.html?dni=' + dni + '&indice=' + str(0)) else: return redirect('detalle_historia.html?dni=' + dni + '&indice=' + str(indice_filtrar)) return redirect('detalle_historia.html?dni=' + dni + '&indice=' + str(indice_filtrar)) if session.get('usuario') is not None and session['tipo'] == 'doctor': lineasHistoria = [] dni = request.args.get('dni') indice_filtrar = int(request.args.get('indice')) for bloque in cadena[1:]: if bloque['transactions']['tipo'] == 1: if bloque['transactions']['dni'] == dni: paciente = bloque break hash_paciente = hashear(paciente['transactions']) fecha_nacimiento = paciente['transactions']['nacimiento'].split('-') edad = int( (datetime.date.today() - datetime.date(int(fecha_nacimiento[0]), int(fecha_nacimiento[1]), int(fecha_nacimiento[2]))).days / 365) lista_indices_abiertos = [] lista_indices_cerrados = [] lista_indices_totales = [] lista_casos_totales = ['Sin filtro'] lista_casos = ['Nuevo ticket'] for bloque in cadena[1:]: if indice_filtrar == 0: if bloque['transactions']['tipo'] == 3: if bloque['transactions'][ 'hash_paciente'] == hash_paciente: lineasHistoria.append(bloque) else: if bloque['transactions']['tipo'] == 3 and bloque[ 'transactions']['indice_ticket'] == indice_filtrar: if bloque['transactions'][ 'hash_paciente'] == hash_paciente: lineasHistoria.append(bloque) for bloque in cadena[::-1]: if bloque['transactions']['tipo'] == 3 and bloque['transactions'][ 'indice_ticket'] not in lista_indices_abiertos and bloque[ 'transactions'][ 'indice_ticket'] not in lista_indices_cerrados: if bloque['transactions']['estado_ticket'] == 'Abierto': lista_indices_abiertos.append( bloque['transactions']['indice_ticket']) lista_casos.append( str(bloque['transactions']['indice_ticket']) + ' - ' + bloque['transactions']['titulo'] + ' - ' + bloque['timestamp'][:16]) else: lista_indices_cerrados.append( bloque['transactions']['indice_ticket']) for bloque in cadena[1:]: if bloque['transactions']['tipo'] == 3 and bloque['transactions'][ 'indice_ticket'] not in lista_indices_totales: lista_indices_totales.append( bloque['transactions']['indice_ticket']) lista_casos_totales.append( str(bloque['transactions']['indice_ticket']) + ' - ' + bloque['transactions']['titulo'] + ' - ' + bloque['timestamp'][:16]) for linea in lineasHistoria: linea['timestamp'] = linea['timestamp'][:16] for bloque in cadena[1:]: if bloque['transactions']['tipo'] == 2: if linea['transactions']['hash_doctor'] == hashear( bloque['transactions']): linea['transactions']['nombres_apellidos_doctor'] = bloque['transactions']['nombres'] + \ ' ' + bloque['transactions']['apellidos'] linea['transactions']['especialidad_doctor'] = bloque[ 'transactions']['especialidad'] break return render_template('detalle_historia.html', lista_casos_totales=lista_casos_totales, lista_casos=lista_casos, paciente=paciente, historia=lineasHistoria, hash_paciente=hash_paciente, edad=edad) else: return redirect('iniciar_sesion.html')
def administrador_pacientesxlugar_estadisticas(): top_lugares = [] cadena = obtener_cadena_local() for bloque in cadena: conocido = False if bloque['transactions']['tipo'] == 3: for lugar in top_lugares: if(lugar['lugar'] == bloque['transactions']['lugar']): lugar['cantidad'] += 1 conocido = True if(not conocido): linea = {'lugar': bloque['transactions']['lugar'], 'cantidad': 1} top_lugares.append(linea) top_lugares = sorted( top_lugares, key=lambda i: i['cantidad'], reverse=True) if request.method == 'POST': cantidad_top = request.form['cantidad_top'] lista_lugares = [] lista_cantidades = [] for lugar in top_lugares[:int(cantidad_top)]: lista_lugares.insert(0, lugar['lugar']) lista_cantidades.insert(0, lugar['cantidad']) fig, ax = plt.subplots(figsize=(12, int(cantidad_top)*0.5)) ax.barh(lista_lugares, lista_cantidades) for i, v in enumerate(lista_cantidades): ax.text(v+0.1, i, str(v)) ax.grid(axis='x', zorder=0) ax.set_title('Top ' + cantidad_top + ' centros médicos') ax.set(xlabel='Cantidad de pacientes', ylabel='Centros médicos') plt.savefig('static/graficas/grafica_top_lugares.png', format='png', bbox_inches='tight') return render_template('administrador_estadisticas_toplugares.html', top_lugares=top_lugares[:int(cantidad_top)], ruta_imagen='../static/graficas/grafica_top_lugares.png') cantidad_top = 5 lista_lugares = [] lista_cantidades = [] for lugar in top_lugares[:cantidad_top]: lista_lugares.insert(0, lugar['lugar']) lista_cantidades.insert(0, lugar['cantidad']) fig, ax = plt.subplots(figsize=(12, int(cantidad_top)*0.5)) ax.barh(lista_lugares, lista_cantidades) for i, v in enumerate(lista_cantidades): ax.text(v+0.1, i, str(v)) ax.grid(axis='x', zorder=0) ax.set_title('Top ' + str(cantidad_top) + ' centros médicos') ax.set(xlabel='Cantidad de pacientes', ylabel='Centros médicos') plt.savefig('static/graficas/grafica_top_lugares.png', format='png', bbox_inches='tight') return render_template('administrador_estadisticas_toplugares.html', top_lugares=top_lugares[:cantidad_top], ruta_imagen='../static/graficas/grafica_top_lugares.png')
def administrador_pacientesxespecialidad_estadisticas(): top_doctores = [] cadena = obtener_cadena_local() for bloque_doctor in cadena: if bloque_doctor['transactions']['tipo'] == 2: contador = 0 hash_doctor = hashear(bloque_doctor['transactions']) nombre_completo = bloque_doctor['transactions']['nombres'] + \ ' ' + bloque_doctor['transactions']['apellidos'] especialidad_doctor = bloque_doctor['transactions']['especialidad'] for bloque_historia in cadena: if bloque_historia['transactions']['tipo'] == 3 and bloque_historia['transactions']['hash_doctor'] == hash_doctor: contador += 1 top_doctores.append( {'hash_doctor': hash_doctor, 'nombre_completo': nombre_completo, 'especialidad': especialidad_doctor, 'cantidad': contador}) top_especialidades = [] for doctor in top_doctores: conocido = False for especialidad in top_especialidades: if(especialidad['especialidad'] == doctor['especialidad']): especialidad['cantidad'] += doctor['cantidad'] conocido = True if(not conocido): linea = {'especialidad': doctor['especialidad'], 'cantidad': doctor['cantidad']} top_especialidades.append(linea) top_especialidades = sorted( top_especialidades, key=lambda i: i['cantidad'], reverse=True) if request.method == 'POST': cantidad_top = request.form['cantidad_top'] lista_especialidades = [] lista_cantidades = [] for especialidad in top_especialidades[:int(cantidad_top)]: lista_especialidades.insert(0, especialidad['especialidad']) lista_cantidades.insert(0, especialidad['cantidad']) fig, ax = plt.subplots(figsize=(12, int(cantidad_top)*0.5)) ax.barh(lista_especialidades, lista_cantidades) for doctor, v in enumerate(lista_cantidades): ax.text(v+0.1, doctor, str(v)) ax.grid(axis='x', zorder=0) ax.set_title('Top ' + cantidad_top + ' especialidades') ax.set(xlabel='Cantidad de pacientes', ylabel='Especialidades') plt.savefig('static/graficas/grafica_top_especialidades.png', format='png', bbox_inches='tight') return render_template('administrador_estadisticas_topespecialidades.html', top_especialidades=top_especialidades[:int(cantidad_top)], ruta_imagen='../static/graficas/grafica_top_especialidades.png') cantidad_top = 5 lista_especialidades = [] lista_cantidades = [] for especialidad in top_especialidades[:cantidad_top]: lista_especialidades.insert(0, especialidad['especialidad']) lista_cantidades.insert(0, especialidad['cantidad']) fig, ax = plt.subplots(figsize=(12, int(cantidad_top)*0.5)) ax.barh(lista_especialidades, lista_cantidades) for doctor, v in enumerate(lista_cantidades): ax.text(v+0.1, doctor, str(v)) ax.grid(axis='x', zorder=0) ax.set_title('Top ' + str(cantidad_top) + ' especialidades') ax.set(xlabel='Cantidad de pacientes', ylabel='Especialidades') plt.savefig('static/graficas/grafica_top_especialidades.png', format='png', bbox_inches='tight') return render_template('administrador_estadisticas_topespecialidades.html', top_especialidades=top_especialidades[:cantidad_top], ruta_imagen='../static/graficas/grafica_top_especialidades.png')