예제 #1
0
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')
예제 #2
0
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')
예제 #3
0
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)
예제 #6
0
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.')
예제 #8
0
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
예제 #9
0
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)
예제 #10
0
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')
예제 #11
0
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)
예제 #13
0
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')
예제 #14
0
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')
예제 #15
0
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')