Update app.py
Browse files
app.py
CHANGED
|
@@ -17,6 +17,7 @@ from datetime import datetime
|
|
| 17 |
from ratelimiter import RateLimiter
|
| 18 |
import difflib
|
| 19 |
from html import escape
|
|
|
|
| 20 |
|
| 21 |
load_dotenv()
|
| 22 |
|
|
@@ -480,15 +481,15 @@ def calcular_progresso():
|
|
| 480 |
|
| 481 |
def comparar_peticao_melhorada(caso, peticao_texto, correcao):
|
| 482 |
if not caso:
|
| 483 |
-
return "⚠️ Forneça um caso antes de comparar.", "", "", "", ""
|
| 484 |
peticao = peticao_texto if peticao_texto else (HISTORICO[-1]["peticao"] if HISTORICO else "")
|
| 485 |
if not peticao:
|
| 486 |
-
return "⚠️ Forneça uma petição para comparar ou corrija uma antes.", "", "", "", ""
|
| 487 |
if not correcao:
|
| 488 |
-
return "⚠️ Corrija a petição antes de comparar.", "", "", "", ""
|
| 489 |
ultima_correcao = HISTORICO[-1]["correcao_completa"] if HISTORICO else ""
|
| 490 |
if not ultima_correcao:
|
| 491 |
-
return "⚠️ Nenhuma correção disponível no histórico.", "", "", "", ""
|
| 492 |
peticao_corrigida = extrair_peticao_corrigida(ultima_correcao)
|
| 493 |
|
| 494 |
orig_lines = peticao.split('\n')
|
|
@@ -552,32 +553,31 @@ def comparar_peticao_melhorada(caso, peticao_texto, correcao):
|
|
| 552 |
total_removidas = len([linha for linha in resultado_diff if "linha-removida" in linha])
|
| 553 |
total_adicionadas = len([linha for linha in resultado_diff if "linha-adicionada" in linha])
|
| 554 |
|
| 555 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 556 |
for secao, alteracoes in secoes.items():
|
| 557 |
if alteracoes:
|
| 558 |
adicionadas = sum(1 for alt in alteracoes if alt.startswith("+"))
|
| 559 |
removidas = sum(1 for alt in alteracoes if alt.startswith("-"))
|
| 560 |
-
|
| 561 |
### {secao}
|
| 562 |
| Tipo | Quantidade |
|
| 563 |
|--------------|------------|
|
| 564 |
| Adicionadas | {adicionadas} |
|
| 565 |
| Removidas | {removidas} |
|
| 566 |
-
"""
|
| 567 |
for alt in alteracoes[:5]:
|
| 568 |
texto = alt[:60] + "..." if len(alt) > 60 else alt
|
| 569 |
-
|
| 570 |
if len(alteracoes) > 5:
|
| 571 |
-
|
| 572 |
|
| 573 |
-
resumo_estatistico = f"""
|
| 574 |
-
- **Linhas Removidas:** {total_removidas}
|
| 575 |
-
- **Linhas Adicionadas:** {total_adicionadas}
|
| 576 |
-
- **Diferença Líquida:** {total_adicionadas - total_removidas} linhas
|
| 577 |
-
"""
|
| 578 |
-
|
| 579 |
-
criticas_texto = "\n".join(criticas) if criticas else "Nenhuma mudança crítica detectada."
|
| 580 |
-
alteracoes_texto = "".join(resumo_alteracoes)
|
| 581 |
visualizacao_detalhada = f"""
|
| 582 |
<style>
|
| 583 |
.linha-igual {{ color: #000000; margin: 2px 0; }}
|
|
@@ -588,6 +588,32 @@ def comparar_peticao_melhorada(caso, peticao_texto, correcao):
|
|
| 588 |
"""
|
| 589 |
return peticao, peticao_corrigida, resumo_estatistico, criticas_texto, alteracoes_texto, visualizacao_detalhada
|
| 590 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 591 |
def interface_gradio():
|
| 592 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 593 |
gr.Markdown("# 📝 Corretor Avançado de Petições Iniciais (Critérios OAB)")
|
|
@@ -658,11 +684,16 @@ def interface_gradio():
|
|
| 658 |
|
| 659 |
with gr.Row():
|
| 660 |
with gr.Column(scale=1):
|
|
|
|
|
|
|
| 661 |
resumo_alteracoes_output = gr.Markdown(label="📊 Resumo das Alterações")
|
| 662 |
criticas_output = gr.Markdown(label="🚨 Mudanças Críticas")
|
| 663 |
-
with gr.Column(scale=2):
|
| 664 |
visualizacao_detalhada_output = gr.HTML(label="📝 Alterações Detalhadas")
|
| 665 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 666 |
with gr.Accordion("📜 Histórico de Correções", open=False):
|
| 667 |
historico_output = gr.Markdown()
|
| 668 |
historico_btn = gr.Button("🔄 Ver Histórico")
|
|
@@ -683,17 +714,25 @@ def interface_gradio():
|
|
| 683 |
outputs=[resultado_output]
|
| 684 |
)
|
| 685 |
clear_btn.click(
|
| 686 |
-
fn=lambda: [None, None, None, None, "", "", "", "", "", "", ""],
|
| 687 |
inputs=None,
|
| 688 |
outputs=[caso_input, peticao_texto, peticao_arquivo, arquivo_preview, resultado_output, dica_contextual,
|
| 689 |
peticao_aluno_output, peticao_corrigida_output, resumo_alteracoes_output, criticas_output,
|
| 690 |
-
visualizacao_detalhada_output]
|
| 691 |
)
|
| 692 |
comparar_btn.click(
|
| 693 |
fn=comparar_peticao_melhorada,
|
| 694 |
inputs=[caso_input, peticao_texto, resultado_output],
|
| 695 |
outputs=[peticao_aluno_output, peticao_corrigida_output, resumo_alteracoes_output, criticas_output,
|
| 696 |
-
visualizacao_detalhada_output]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 697 |
)
|
| 698 |
|
| 699 |
with gr.Accordion("📘 Critérios Detalhados", open=False):
|
|
|
|
| 17 |
from ratelimiter import RateLimiter
|
| 18 |
import difflib
|
| 19 |
from html import escape
|
| 20 |
+
from weasyprint import HTML # Para gerar PDF com cores
|
| 21 |
|
| 22 |
load_dotenv()
|
| 23 |
|
|
|
|
| 481 |
|
| 482 |
def comparar_peticao_melhorada(caso, peticao_texto, correcao):
|
| 483 |
if not caso:
|
| 484 |
+
return "⚠️ Forneça um caso antes de comparar.", "", "", "", "", ""
|
| 485 |
peticao = peticao_texto if peticao_texto else (HISTORICO[-1]["peticao"] if HISTORICO else "")
|
| 486 |
if not peticao:
|
| 487 |
+
return "⚠️ Forneça uma petição para comparar ou corrija uma antes.", "", "", "", "", ""
|
| 488 |
if not correcao:
|
| 489 |
+
return "⚠️ Corrija a petição antes de comparar.", "", "", "", "", ""
|
| 490 |
ultima_correcao = HISTORICO[-1]["correcao_completa"] if HISTORICO else ""
|
| 491 |
if not ultima_correcao:
|
| 492 |
+
return "⚠️ Nenhuma correção disponível no histórico.", "", "", "", "", ""
|
| 493 |
peticao_corrigida = extrair_peticao_corrigida(ultima_correcao)
|
| 494 |
|
| 495 |
orig_lines = peticao.split('\n')
|
|
|
|
| 553 |
total_removidas = len([linha for linha in resultado_diff if "linha-removida" in linha])
|
| 554 |
total_adicionadas = len([linha for linha in resultado_diff if "linha-adicionada" in linha])
|
| 555 |
|
| 556 |
+
resumo_estatistico = f"""
|
| 557 |
+
Linhas Removidas: {total_removidas}
|
| 558 |
+
Linhas Adicionadas: {total_adicionadas}
|
| 559 |
+
Diferença Líquida: {total_adicionadas - total_removidas} linhas
|
| 560 |
+
"""
|
| 561 |
+
|
| 562 |
+
criticas_texto = "\n".join(criticas) if criticas else "Nenhuma mudança crítica detectada."
|
| 563 |
+
alteracoes_texto = ""
|
| 564 |
for secao, alteracoes in secoes.items():
|
| 565 |
if alteracoes:
|
| 566 |
adicionadas = sum(1 for alt in alteracoes if alt.startswith("+"))
|
| 567 |
removidas = sum(1 for alt in alteracoes if alt.startswith("-"))
|
| 568 |
+
alteracoes_texto += f"""
|
| 569 |
### {secao}
|
| 570 |
| Tipo | Quantidade |
|
| 571 |
|--------------|------------|
|
| 572 |
| Adicionadas | {adicionadas} |
|
| 573 |
| Removidas | {removidas} |
|
| 574 |
+
"""
|
| 575 |
for alt in alteracoes[:5]:
|
| 576 |
texto = alt[:60] + "..." if len(alt) > 60 else alt
|
| 577 |
+
alteracoes_texto += f" {texto}\n"
|
| 578 |
if len(alteracoes) > 5:
|
| 579 |
+
alteracoes_texto += f" - ... e mais {len(alteracoes) - 5} alterações\n"
|
| 580 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 581 |
visualizacao_detalhada = f"""
|
| 582 |
<style>
|
| 583 |
.linha-igual {{ color: #000000; margin: 2px 0; }}
|
|
|
|
| 588 |
"""
|
| 589 |
return peticao, peticao_corrigida, resumo_estatistico, criticas_texto, alteracoes_texto, visualizacao_detalhada
|
| 590 |
|
| 591 |
+
def exportar_diferencas_html(caso, peticao_texto, correcao):
|
| 592 |
+
_, _, resumo_estatistico, criticas_texto, _, visualizacao_detalhada = comparar_peticao_melhorada(caso, peticao_texto, correcao)
|
| 593 |
+
html_content = f"""
|
| 594 |
+
<html>
|
| 595 |
+
<head>
|
| 596 |
+
<title>Diferenças na Petição</title>
|
| 597 |
+
<style>
|
| 598 |
+
.linha-igual {{ color: #000000; margin: 2px 0; }}
|
| 599 |
+
.linha-removida {{ color: #ffffff; background-color: #b30000; margin: 2px 0; padding: 2px; }}
|
| 600 |
+
.linha-adicionada {{ color: #ffffff; background-color: #006600; margin: 2px 0; padding: 2px; }}
|
| 601 |
+
</style>
|
| 602 |
+
</head>
|
| 603 |
+
<body>
|
| 604 |
+
<h2>Estatísticas</h2>
|
| 605 |
+
<pre>{resumo_estatistico}</pre>
|
| 606 |
+
<h2>Mudanças Críticas</h2>
|
| 607 |
+
<pre>{criticas_texto}</pre>
|
| 608 |
+
<h2>Alterações Detalhadas</h2>
|
| 609 |
+
{visualizacao_detalhada}
|
| 610 |
+
</body>
|
| 611 |
+
</html>
|
| 612 |
+
"""
|
| 613 |
+
with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp:
|
| 614 |
+
HTML(string=html_content).write_pdf(tmp.name)
|
| 615 |
+
return tmp.name
|
| 616 |
+
|
| 617 |
def interface_gradio():
|
| 618 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 619 |
gr.Markdown("# 📝 Corretor Avançado de Petições Iniciais (Critérios OAB)")
|
|
|
|
| 684 |
|
| 685 |
with gr.Row():
|
| 686 |
with gr.Column(scale=1):
|
| 687 |
+
alteracoes_texto_output = gr.Markdown(label="🔍 Alterações por Seção")
|
| 688 |
+
with gr.Column(scale=2):
|
| 689 |
resumo_alteracoes_output = gr.Markdown(label="📊 Resumo das Alterações")
|
| 690 |
criticas_output = gr.Markdown(label="🚨 Mudanças Críticas")
|
|
|
|
| 691 |
visualizacao_detalhada_output = gr.HTML(label="📝 Alterações Detalhadas")
|
| 692 |
|
| 693 |
+
with gr.Row():
|
| 694 |
+
download_btn = gr.Button("📥 Baixar Diferenças em PDF", visible=False)
|
| 695 |
+
download_file = gr.File(label="Download", visible=False)
|
| 696 |
+
|
| 697 |
with gr.Accordion("📜 Histórico de Correções", open=False):
|
| 698 |
historico_output = gr.Markdown()
|
| 699 |
historico_btn = gr.Button("🔄 Ver Histórico")
|
|
|
|
| 714 |
outputs=[resultado_output]
|
| 715 |
)
|
| 716 |
clear_btn.click(
|
| 717 |
+
fn=lambda: [None, None, None, None, "", "", "", "", "", "", "", gr.update(visible=False), gr.update(visible=False)],
|
| 718 |
inputs=None,
|
| 719 |
outputs=[caso_input, peticao_texto, peticao_arquivo, arquivo_preview, resultado_output, dica_contextual,
|
| 720 |
peticao_aluno_output, peticao_corrigida_output, resumo_alteracoes_output, criticas_output,
|
| 721 |
+
visualizacao_detalhada_output, download_btn, download_file]
|
| 722 |
)
|
| 723 |
comparar_btn.click(
|
| 724 |
fn=comparar_peticao_melhorada,
|
| 725 |
inputs=[caso_input, peticao_texto, resultado_output],
|
| 726 |
outputs=[peticao_aluno_output, peticao_corrigida_output, resumo_alteracoes_output, criticas_output,
|
| 727 |
+
alteracoes_texto_output, visualizacao_detalhada_output]
|
| 728 |
+
).then(
|
| 729 |
+
fn=lambda: gr.update(visible=True),
|
| 730 |
+
outputs=[download_btn]
|
| 731 |
+
)
|
| 732 |
+
download_btn.click(
|
| 733 |
+
fn=exportar_diferencas_html,
|
| 734 |
+
inputs=[caso_input, peticao_texto, resultado_output],
|
| 735 |
+
outputs=[download_file]
|
| 736 |
)
|
| 737 |
|
| 738 |
with gr.Accordion("📘 Critérios Detalhados", open=False):
|