-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
214 lines (177 loc) · 7.76 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
from flask import Flask, render_template, jsonify, json, request
from flask import send_from_directory
from flask_cors import CORS
import os
app = Flask(__name__)
os.environ['FLASK_RUN_PORT'] = '8080'
app.static_folder = 'static'
CORS(app)
# Variáveis globais para a funcionalidade de revisão
valores = []
lista_saida = []
indice_atual = 0
@app.route('/revisao_lista')
def revisao_lista():
global indice_atual
return render_template('revisao_lista.html', valor=valores[indice_atual] if valores else "")
@app.route('/revisao_lista', methods=['POST'])
def processar_tecla():
global indice_atual, lista_saida
tecla_pressionada = request.json["tecla"]
if tecla_pressionada == "a":
lista_saida.append(valores[indice_atual])
indice_atual = (indice_atual + 1) % len(valores)
return jsonify({"valor": valores[indice_atual] if indice_atual < len(valores) else ""})
@app.route('/carregar_arquivo', methods=['POST'])
def carregar_arquivo():
global valores
arquivo = request.files['arquivo']
if arquivo and arquivo.filename.endswith('.txt'):
valores = arquivo.read().decode('utf-8').splitlines()
return redirect(url_for('revisao_lista')) # Redireciona para a revisão
else:
return jsonify({"success": False, "error": "Formato de arquivo inválido"})
# Funcionalidades para carregar templates
@app.route('/static/assets/images/favicon.ico')
def favicon():
return send_from_directory('static', 'favicon.ico')
@app.route('/')
def index():
# Página inicial com links para os dois templates
return render_template('index.html')
@app.route('/lib/<path:filename>')
def serve_lib(filename):
return send_from_directory('lib', filename)
# Rota para servir arquivos estáticos (HTML, CSS, JS)
@app.route('/static/<path:filename>')
def serve_static(filename):
return send_from_directory('static', filename)
# Rota para servir arquivos JSON
@app.route('/static/data/json/<path:filename>')
def serve_json(filename):
return send_from_directory('static/data/json', filename)
@app.route('/static/assets/images/<filename>')
def serve_image(filename):
return send_from_directory('static/assets/images', filename)
## Reports
@app.route('/pasteur_fr_report')
def pasteur_fr_report():
# Renderizar link para report no breadcrumb
return render_template('report_pasteur_fr.html', show_render_button=True)
@app.route('/fiocruz_ce_report')
def fiocruz_ce_report():
# Renderizar link para report no breadcrumb
return render_template('report_fiocruz_ce.html', show_render_button=True)
@app.route('/orientacoes_report')
def publicacoes_report():
# Renderizar link para report no breadcrumb
return render_template('relatorio_orientacoes.html', show_render_button=True)
@app.route('/publicacoes_report')
def orientacoes_report():
# Renderizar link para report no breadcrumb
return render_template('relatorio_publicacoes.html', show_render_button=True)
@app.route('/i9c_gp_nobc')
def i9c_gp_nobc():
# Renderizar na região dinâmica sem breadcrumb, apontando para o html em templates
return render_template('innomap_processes_no_breadcrumb.html', show_render_button=True)
@app.route('/i9c_mp_nobc')
def i9c_mp_nobc():
# Renderizar botão para abrir template na região dinâmica sem trazer o breadcrumb
return render_template('innomap_macroprocesses_no_breadcrumb.html', show_render_button=True)
@app.route('/i9c_gp01')
def i9c_gp01():
return render_template('i9c_gp01.html', show_render_button=True)
@app.route('/i9c_gp02')
def i9c_gp02():
return render_template('i9c_gp02.html', show_render_button=True)
@app.route('/i9c_gp03')
def i9c_gp03():
return render_template('i9c_gp03.html', show_render_button=True)
@app.route('/i9c_gp') # nome da rota e da função igual para simplificar
def i9c_gp():
# Verificar se a solicitação é AJAX para desabilitar breadcrumb
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
# Se for AJAX, renderiza o template sem o breadcrumb
return render_template('innomap_processes_no_breadcrumb.html', show_render_button=True)
else:
# Para solicitações normais, inclui o breadcrumb
return render_template('innomap_processes.html')
@app.route('/i9c_mp')
def i9c_mp():
# Verificar se a solicitação é AJAX para desabilitar breadcrumb
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
return render_template('innomap_macroprocesses_no_breadcrumb.html', show_render_button=True)
else:
return render_template('innomap_macroprocesses.html')
## Abrir Grafos no HTML
# Manter nome da rota e da função igual ao nome do arquivo para simplificar
# Carregar pelo link do breadcum
@app.route('/relatorio_orientacoes.html')
def relatorio_orientacoes():
# Renderizar link para report no breadcrumb
return render_template('relatorio_orientacoes.html')
@app.route('/grafo_interativo.html')
def grafo_interativo():
# Renderizar link para report no breadcrumb
return render_template('grafo_interativo.html')
@app.route('/graph_revistas_capes.html')
def graph_revistas_capes():
# Renderizar link para report no breadcrumb
return render_template('graph_revistas_capes.html', show_render_button=True)
@app.route('/relatorio_fomento')
def relatorio_fomento():
# Renderizar link para report no breadcrumb
return render_template('relatorio_fomento.html', show_render_button=True)
@app.route('/graph_hierarquico')
def graph_hierarquico():
return render_template('graph_hierarquico.html')
## Servir arquivos JSON
@app.route('/data/json/roadmap.json')
def serve_roadmap_json():
# Servir com caminho absoluto (para evitar problemas de separador de diretório)
app.logger.info('Rota /data/json/roadmap.json acessada')
json_path = os.path.join(app.root_path, 'static', 'data', 'json', 'roadmap.json')
return send_from_directory(os.path.dirname(json_path), os.path.basename(json_path))
@app.route('/api/graphdata', methods=['GET'])
def get_graph_data():
# Carregar dados do JSON e retorna como resposta da API
directory = os.path.join(app.root_path, 'static/data/json')
with open(os.path.join(directory, 'roadmap.json'), 'r') as file:
data = json.load(file)
return jsonify(data)
@app.route('/api/update-graph', methods=['POST'])
def update_graph():
try:
# Carrega o JSON existente
directory = os.path.join(app.root_path, 'static/data/json')
json_path = os.path.join(directory, 'roadmap.json')
with open(json_path, 'r+') as file:
data = json.load(file)
# Extrair dados do novo nó do corpo da solicitação
new_node = request.json
# Certificar extrair/validar campos 'size','color'
# Definir valores padrão/validar entrada
size = new_node.get('size', 10) # valor padrão
color = new_node.get('color', 'blue') # vr padrão
# Adicionar campos 'size' e 'color' ao novo nó
new_node_data = {
"id": new_node['id'],
"label": new_node['label'],
"title": new_node['title'],
"row": new_node['row'],
"size": size,
"color": color
}
# Inserir o novo nó nos dados existentes
data['nodes'].append(new_node_data)
# Voltar início do arquivo para sobrescrevê-lo
file.seek(0)
# Atualiza o arquivo JSON
json.dump(data, file, indent=4)
# Trunca o arquivo para o novo tamanho
file.truncate()
return jsonify({"success": True, "message": "Graph updated successfully."}), 200
except Exception as e:
return jsonify({"success": False, "message": str(e)}), 500
if __name__ == '__main__':
app.run(debug=True)