Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -25,7 +25,7 @@ def format_timedelta(td):
|
|
| 25 |
def normalize_html_to_csv(input_html_path, output_csv_path):
|
| 26 |
html_data = pd.read_html(input_html_path)
|
| 27 |
data = html_data[0]
|
| 28 |
-
data.to_csv(output_csv_path, index=False, encoding='utf-8')
|
| 29 |
|
| 30 |
def normalize_multiple_excel_to_csv(input_directory, output_directory):
|
| 31 |
input_excel_paths = [os.path.join(input_directory, f) for f in os.listdir(input_directory) if f.endswith('.xlsx')]
|
|
@@ -35,7 +35,7 @@ def normalize_multiple_excel_to_csv(input_directory, output_directory):
|
|
| 35 |
unnecessary_columns = [col for col in excel_data.columns if 'Unnamed' in col]
|
| 36 |
if unnecessary_columns:
|
| 37 |
excel_data = excel_data.drop(columns=unnecessary_columns)
|
| 38 |
-
excel_data.to_csv(output_csv_path, index=False, encoding='utf-8')
|
| 39 |
|
| 40 |
def extract_aluno_pattern(nome):
|
| 41 |
if isinstance(nome, str):
|
|
@@ -45,8 +45,8 @@ def extract_aluno_pattern(nome):
|
|
| 45 |
|
| 46 |
def match_alunos(tarefas_csv_path, alunos_csv_path, contador_csv_path):
|
| 47 |
try:
|
| 48 |
-
tarefas_df = pd.read_csv(tarefas_csv_path, encoding='utf-8')
|
| 49 |
-
alunos_df = pd.read_csv(alunos_csv_path, encoding='utf-8')
|
| 50 |
except pd.errors.EmptyDataError:
|
| 51 |
print(f"Arquivo {tarefas_csv_path} ou {alunos_csv_path} está vazio. Pulando...")
|
| 52 |
return
|
|
@@ -59,7 +59,7 @@ def match_alunos(tarefas_csv_path, alunos_csv_path, contador_csv_path):
|
|
| 59 |
return
|
| 60 |
|
| 61 |
try:
|
| 62 |
-
contador_df = pd.read_csv(contador_csv_path, encoding='utf-8')
|
| 63 |
except FileNotFoundError:
|
| 64 |
contador_df = pd.DataFrame(columns=['Nome do Aluno', 'Tarefas Completadas', 'Acertos Absolutos', 'Total Tempo'])
|
| 65 |
|
|
@@ -104,7 +104,7 @@ def match_alunos(tarefas_csv_path, alunos_csv_path, contador_csv_path):
|
|
| 104 |
else:
|
| 105 |
contador_df = pd.concat([contador_df, pd.DataFrame({'Nome do Aluno': [aluno], 'Tarefas Completadas': [1], 'Acertos Absolutos': [nota_total], 'Total Tempo': [str(tempo_total)]})], ignore_index=True)
|
| 106 |
|
| 107 |
-
contador_df.to_csv(contador_csv_path, index=False, encoding='utf-8')
|
| 108 |
|
| 109 |
return result_df
|
| 110 |
|
|
@@ -122,7 +122,7 @@ def process_all_tarefas_in_directory(directory, alunos_csv_path, contador_csv_pa
|
|
| 122 |
process_relatorios(contador_csv_path, relatorio_csv_path)
|
| 123 |
|
| 124 |
def process_relatorios(contador_csv_path, relatorio_csv_path):
|
| 125 |
-
contador_df = pd.read_csv(contador_csv_path, encoding='utf-8')
|
| 126 |
contador_df['Média de Acertos'] = ((contador_df['Acertos Absolutos'] / (contador_df['Tarefas Completadas'] * 2)) * 100).round(2).astype(str) + '%'
|
| 127 |
contador_df['Total Tempo'] = pd.to_timedelta(contador_df['Total Tempo'])
|
| 128 |
contador_df['Tempo Médio por Tarefa'] = contador_df['Total Tempo'] / contador_df['Tarefas Completadas']
|
|
@@ -136,7 +136,7 @@ def process_relatorios(contador_csv_path, relatorio_csv_path):
|
|
| 136 |
media_tempo_medio_turma = tempo_medio_por_tarefa['Tempo Médio por Tarefa'].mean()
|
| 137 |
media_tempo_medio_turma = format_timedelta(media_tempo_medio_turma)
|
| 138 |
|
| 139 |
-
contador_df.to_csv(relatorio_csv_path, index=False, encoding='utf-8')
|
| 140 |
return contador_df, media_tempo_medio_turma
|
| 141 |
|
| 142 |
def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pdf_path):
|
|
@@ -223,11 +223,29 @@ def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pd
|
|
| 223 |
temp_graphics_pdf = 'temp_graphics.pdf'
|
| 224 |
pdf.output(temp_graphics_pdf)
|
| 225 |
|
| 226 |
-
#
|
| 227 |
-
|
| 228 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 229 |
temp_html_path = 'temp_html_with_borders.html'
|
| 230 |
-
with open(temp_html_path, 'w', encoding='utf-8') as f:
|
| 231 |
f.write(html_content)
|
| 232 |
|
| 233 |
temp_html_pdf = 'temp_html.pdf'
|
|
@@ -281,7 +299,7 @@ def processar_relatorio(html_file, tarefa_files):
|
|
| 281 |
|
| 282 |
# Salva o relatório em HTML e PDF
|
| 283 |
html_output_path = os.path.join(output_directory, "relatorio_final.html")
|
| 284 |
-
df.to_html(html_output_path, index=False, encoding='utf-8')
|
| 285 |
|
| 286 |
pdf_output_path = os.path.join(output_directory, "relatorio_final.pdf")
|
| 287 |
generate_pdf_report(df, media_tempo_medio_turma, html_output_path, pdf_output_path)
|
|
|
|
| 25 |
def normalize_html_to_csv(input_html_path, output_csv_path):
|
| 26 |
html_data = pd.read_html(input_html_path)
|
| 27 |
data = html_data[0]
|
| 28 |
+
data.to_csv(output_csv_path, index=False, encoding='utf-8-sig')
|
| 29 |
|
| 30 |
def normalize_multiple_excel_to_csv(input_directory, output_directory):
|
| 31 |
input_excel_paths = [os.path.join(input_directory, f) for f in os.listdir(input_directory) if f.endswith('.xlsx')]
|
|
|
|
| 35 |
unnecessary_columns = [col for col in excel_data.columns if 'Unnamed' in col]
|
| 36 |
if unnecessary_columns:
|
| 37 |
excel_data = excel_data.drop(columns=unnecessary_columns)
|
| 38 |
+
excel_data.to_csv(output_csv_path, index=False, encoding='utf-8-sig')
|
| 39 |
|
| 40 |
def extract_aluno_pattern(nome):
|
| 41 |
if isinstance(nome, str):
|
|
|
|
| 45 |
|
| 46 |
def match_alunos(tarefas_csv_path, alunos_csv_path, contador_csv_path):
|
| 47 |
try:
|
| 48 |
+
tarefas_df = pd.read_csv(tarefas_csv_path, encoding='utf-8-sig')
|
| 49 |
+
alunos_df = pd.read_csv(alunos_csv_path, encoding='utf-8-sig')
|
| 50 |
except pd.errors.EmptyDataError:
|
| 51 |
print(f"Arquivo {tarefas_csv_path} ou {alunos_csv_path} está vazio. Pulando...")
|
| 52 |
return
|
|
|
|
| 59 |
return
|
| 60 |
|
| 61 |
try:
|
| 62 |
+
contador_df = pd.read_csv(contador_csv_path, encoding='utf-8-sig')
|
| 63 |
except FileNotFoundError:
|
| 64 |
contador_df = pd.DataFrame(columns=['Nome do Aluno', 'Tarefas Completadas', 'Acertos Absolutos', 'Total Tempo'])
|
| 65 |
|
|
|
|
| 104 |
else:
|
| 105 |
contador_df = pd.concat([contador_df, pd.DataFrame({'Nome do Aluno': [aluno], 'Tarefas Completadas': [1], 'Acertos Absolutos': [nota_total], 'Total Tempo': [str(tempo_total)]})], ignore_index=True)
|
| 106 |
|
| 107 |
+
contador_df.to_csv(contador_csv_path, index=False, encoding='utf-8-sig')
|
| 108 |
|
| 109 |
return result_df
|
| 110 |
|
|
|
|
| 122 |
process_relatorios(contador_csv_path, relatorio_csv_path)
|
| 123 |
|
| 124 |
def process_relatorios(contador_csv_path, relatorio_csv_path):
|
| 125 |
+
contador_df = pd.read_csv(contador_csv_path, encoding='utf-8-sig')
|
| 126 |
contador_df['Média de Acertos'] = ((contador_df['Acertos Absolutos'] / (contador_df['Tarefas Completadas'] * 2)) * 100).round(2).astype(str) + '%'
|
| 127 |
contador_df['Total Tempo'] = pd.to_timedelta(contador_df['Total Tempo'])
|
| 128 |
contador_df['Tempo Médio por Tarefa'] = contador_df['Total Tempo'] / contador_df['Tarefas Completadas']
|
|
|
|
| 136 |
media_tempo_medio_turma = tempo_medio_por_tarefa['Tempo Médio por Tarefa'].mean()
|
| 137 |
media_tempo_medio_turma = format_timedelta(media_tempo_medio_turma)
|
| 138 |
|
| 139 |
+
contador_df.to_csv(relatorio_csv_path, index=False, encoding='utf-8-sig')
|
| 140 |
return contador_df, media_tempo_medio_turma
|
| 141 |
|
| 142 |
def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pdf_path):
|
|
|
|
| 223 |
temp_graphics_pdf = 'temp_graphics.pdf'
|
| 224 |
pdf.output(temp_graphics_pdf)
|
| 225 |
|
| 226 |
+
# Estilo personalizado para bordas da tabela
|
| 227 |
+
html_style = """
|
| 228 |
+
<style>
|
| 229 |
+
.dataframe {
|
| 230 |
+
border-collapse: collapse;
|
| 231 |
+
width: 100%;
|
| 232 |
+
}
|
| 233 |
+
.dataframe th, .dataframe td {
|
| 234 |
+
border: 1px solid black;
|
| 235 |
+
padding: 8px;
|
| 236 |
+
text-align: left;
|
| 237 |
+
}
|
| 238 |
+
</style>
|
| 239 |
+
"""
|
| 240 |
+
|
| 241 |
+
# Ler o conteúdo HTML e adicionar o estilo personalizado
|
| 242 |
+
with open(html_path, 'r', encoding='utf-8-sig') as f:
|
| 243 |
+
html_content = f.read()
|
| 244 |
+
|
| 245 |
+
html_content = html_style + html_content
|
| 246 |
+
|
| 247 |
temp_html_path = 'temp_html_with_borders.html'
|
| 248 |
+
with open(temp_html_path, 'w', encoding='utf-8-sig') as f:
|
| 249 |
f.write(html_content)
|
| 250 |
|
| 251 |
temp_html_pdf = 'temp_html.pdf'
|
|
|
|
| 299 |
|
| 300 |
# Salva o relatório em HTML e PDF
|
| 301 |
html_output_path = os.path.join(output_directory, "relatorio_final.html")
|
| 302 |
+
df.to_html(html_output_path, index=False, encoding='utf-8-sig')
|
| 303 |
|
| 304 |
pdf_output_path = os.path.join(output_directory, "relatorio_final.pdf")
|
| 305 |
generate_pdf_report(df, media_tempo_medio_turma, html_output_path, pdf_output_path)
|