def change_enzyme():
    selected_node = request.form['selected_node']
    selected_enzyme = request.form['selected_enzyme']

    task_id = request.form['task_id']
    data = json.loads(current_app.redis.get(task_id))
    graph_dict = json.loads(data['graph_dict'])
    attr_dict = json.loads(data['attr_dict'])
    target_smiles = data['target_smiles']
    network_options = json.loads(data['network_options'])

    graph = nx.from_dict_of_lists(graph_dict, create_using=nx.DiGraph)
    network = Network(graph=graph, target_smiles=target_smiles)
    network.settings = network_options
    network.add_attributes(attr_dict)

    network.calculate_scores()

    network.graph.nodes[selected_node]['attributes']['selected_enzyme'] = selected_enzyme

    data['attr_dict'] = json.dumps(network.attributes_dict())
    current_app.redis.mset({task_id: json.dumps(data)})
    time_to_expire = 15 * 60  # 15 mins * 60 seconds
    current_app.redis.expire(task_id, time_to_expire)

    successors = list(network.graph.successors(selected_node))
    predecessors = list(network.graph.predecessors(selected_node))

    subgraph = network.graph.subgraph([selected_node]+successors+predecessors)
    nodes, edges = network.get_visjs_nodes_and_edges(graph=subgraph)

    result = {'nodes': nodes,
              'edges': edges}

    return jsonify(result=result)
def node_info():
    if 'node' in request.form:
        node = str(request.form['node'])
    else:
        result = {'name': 'error',
                  'type': 'error',
                  'data': {},
                  'html': ''}
        return jsonify(result=result)

    try:
        task_id = request.form['task_id']
        data = json.loads(current_app.redis.get(task_id))
        graph_dict = json.loads(data['graph_dict'])
        attr_dict = json.loads(data['attr_dict'])
        target_smiles = data['target_smiles']
        network_options = json.loads(data['network_options'])

        graph = nx.from_dict_of_lists(graph_dict, create_using=nx.DiGraph)

        network = Network(graph=graph, target_smiles=target_smiles)
        network.settings = network_options
        network.add_attributes(attr_dict)
        network.get_node_types()

        if node in network.substrate_nodes:
            result = get_substrate_info(node)

        elif node in network.reaction_nodes:
            if 'retrorule' not in network.graph.nodes[node]['attributes']:
                result = get_reaction_info(node, network)
            else:
                result = get_retrorule_info(node, network)

        else:
            print('Error node not in substrates or reactions')
            result = {'name': 'error',
                      'type': 'error',
                      'data' : {},
                      'html' : ''}
        return jsonify(result=result)

    except:
        result = {'name': 'error',
                  'type': 'error',
                  'data': {},
                  'html': ''}
        return jsonify(result=result)