Update interface_wizard.py
Browse files- interface_wizard.py +27 -41
interface_wizard.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
"""
|
| 2 |
Module définissant l'interface utilisateur Gradio sous forme d'assistant progressif (wizard).
|
| 3 |
-
|
| 4 |
"""
|
| 5 |
import gradio as gr
|
| 6 |
from utils import collect_author_info, ensure_default_supports
|
|
@@ -24,7 +24,7 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 24 |
# Définir le nombre total d'étapes
|
| 25 |
TOTAL_STEPS = 6
|
| 26 |
|
| 27 |
-
with gr.Blocks(title="Assistant de Contrats de Cession", css="
|
| 28 |
# Variables d'état pour stocker les données entre les étapes
|
| 29 |
current_step = gr.State(value=1)
|
| 30 |
contract_data = gr.State(value={
|
|
@@ -278,26 +278,30 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 278 |
value=""
|
| 279 |
)
|
| 280 |
|
|
|
|
|
|
|
| 281 |
# Indicateur de génération
|
| 282 |
-
with gr.Group(
|
| 283 |
-
generation_status = gr.Markdown("
|
| 284 |
generation_progress = gr.Slider(
|
| 285 |
minimum=0,
|
| 286 |
maximum=100,
|
| 287 |
value=0,
|
| 288 |
step=1,
|
| 289 |
interactive=False,
|
| 290 |
-
label="Progression"
|
|
|
|
| 291 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 292 |
|
| 293 |
# Boutons de navigation entre les étapes
|
| 294 |
with gr.Row():
|
| 295 |
back_button = gr.Button("Précédent", variant="secondary")
|
| 296 |
next_button = gr.Button("Suivant", variant="primary")
|
| 297 |
-
|
| 298 |
-
# Bouton de génération (visible uniquement à la dernière étape)
|
| 299 |
-
with gr.Row(visible=False) as generate_button_row:
|
| 300 |
-
generate_button = gr.Button("Générer le PDF", variant="primary", elem_id="generate-btn")
|
| 301 |
|
| 302 |
# COLONNE DROITE - PRÉVISUALISATION EN TEMPS RÉEL
|
| 303 |
with gr.Column(scale=2):
|
|
@@ -307,16 +311,11 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 307 |
"Au fur et à mesure que vous remplissez le formulaire, votre contrat se construit ici."
|
| 308 |
)
|
| 309 |
|
| 310 |
-
# Prévisualisation du contrat
|
| 311 |
-
contract_preview = gr.
|
| 312 |
-
value="
|
| 313 |
elem_id="contract-preview"
|
| 314 |
)
|
| 315 |
-
|
| 316 |
-
# Zone de téléchargement (visible uniquement après génération)
|
| 317 |
-
with gr.Group(visible=False) as download_group:
|
| 318 |
-
gr.Markdown("### Téléchargement")
|
| 319 |
-
pdf_output = gr.File(label="Votre contrat est prêt!")
|
| 320 |
|
| 321 |
# ===== FONCTIONS DE NAVIGATION ET MISE À JOUR =====
|
| 322 |
|
|
@@ -442,9 +441,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 442 |
show_physical_person = (current == 3 and author_type_val == "Personne physique")
|
| 443 |
show_legal_entity = (current == 3 and author_type_val == "Personne morale")
|
| 444 |
|
| 445 |
-
# Visibilité du bouton de génération (uniquement à la dernière étape)
|
| 446 |
-
show_generate_button = (current == TOTAL_STEPS)
|
| 447 |
-
|
| 448 |
# Mettre à jour l'aperçu du contrat
|
| 449 |
preview = preview_contract(data)
|
| 450 |
|
|
@@ -464,7 +460,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 464 |
gr.update(visible=rights_visibility), gr.update(visible=remuneration_visibility),
|
| 465 |
gr.update(visible=show_work_desc), gr.update(visible=show_image_desc),
|
| 466 |
gr.update(visible=show_physical_person), gr.update(visible=show_legal_entity),
|
| 467 |
-
gr.update(visible=show_generate_button),
|
| 468 |
# Aperçu du contrat
|
| 469 |
preview
|
| 470 |
)
|
|
@@ -502,9 +497,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 502 |
show_physical_person = (current == 3 and data["auteur_type"] == "Personne physique")
|
| 503 |
show_legal_entity = (current == 3 and data["auteur_type"] == "Personne morale")
|
| 504 |
|
| 505 |
-
# Visibilité du bouton de génération (uniquement à la dernière étape)
|
| 506 |
-
show_generate_button = (current == TOTAL_STEPS)
|
| 507 |
-
|
| 508 |
# Mettre à jour l'aperçu du contrat
|
| 509 |
preview = preview_contract(data)
|
| 510 |
|
|
@@ -524,7 +516,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 524 |
gr.update(visible=rights_visibility), gr.update(visible=remuneration_visibility),
|
| 525 |
gr.update(visible=show_work_desc), gr.update(visible=show_image_desc),
|
| 526 |
gr.update(visible=show_physical_person), gr.update(visible=show_legal_entity),
|
| 527 |
-
gr.update(visible=show_generate_button),
|
| 528 |
# Aperçu du contrat
|
| 529 |
preview
|
| 530 |
)
|
|
@@ -545,20 +536,16 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 545 |
def generate_pdf(contract_data, filename):
|
| 546 |
"""Génère le PDF du contrat avec indication de progression."""
|
| 547 |
|
| 548 |
-
# Mise à jour de l'interface pour indiquer le début de la génération
|
| 549 |
-
yield gr.update(visible=True), gr.update(value="Préparation des données..."), 0, gr.update(visible=False), None
|
| 550 |
-
time.sleep(0.5)
|
| 551 |
-
|
| 552 |
# Étape 1: Préparation du contrat (25%)
|
| 553 |
-
yield gr.update(
|
| 554 |
time.sleep(0.5)
|
| 555 |
|
| 556 |
# Étape 2: Mise en forme (50%)
|
| 557 |
-
yield gr.update(
|
| 558 |
time.sleep(0.5)
|
| 559 |
|
| 560 |
# Étape 3: Génération du PDF (75%)
|
| 561 |
-
yield gr.update(
|
| 562 |
|
| 563 |
# Appel à la fonction de génération réelle
|
| 564 |
pdf_path = generate_pdf_fn(
|
|
@@ -575,7 +562,7 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 575 |
)
|
| 576 |
|
| 577 |
# Finalisation (100%)
|
| 578 |
-
yield gr.update(
|
| 579 |
|
| 580 |
# Fonction simplifiée pour prévisualiser le contrat
|
| 581 |
def preview_contract(data):
|
|
@@ -583,7 +570,7 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 583 |
|
| 584 |
# Vérifier qu'il y a suffisamment de données pour prévisualiser
|
| 585 |
if not data.get("type_contrat"):
|
| 586 |
-
return "
|
| 587 |
|
| 588 |
# Appeler la fonction de prévisualisation
|
| 589 |
try:
|
|
@@ -608,9 +595,10 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 608 |
if ligne.strip().startswith("ARTICLE") or ligne.strip().isupper():
|
| 609 |
preview_html = preview_html.replace(ligne, f"<h3>{ligne}</h3>")
|
| 610 |
|
| 611 |
-
|
|
|
|
| 612 |
except Exception as e:
|
| 613 |
-
return f"
|
| 614 |
|
| 615 |
# ===== ÉVÉNEMENTS =====
|
| 616 |
|
|
@@ -642,7 +630,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 642 |
group_rights, group_remuneration,
|
| 643 |
group_work_description, group_image_description,
|
| 644 |
group_physical_person, group_legal_entity,
|
| 645 |
-
generate_button_row,
|
| 646 |
# Aperçu du contrat
|
| 647 |
contract_preview
|
| 648 |
]
|
|
@@ -661,7 +648,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 661 |
group_rights, group_remuneration,
|
| 662 |
group_work_description, group_image_description,
|
| 663 |
group_physical_person, group_legal_entity,
|
| 664 |
-
generate_button_row,
|
| 665 |
# Aperçu du contrat
|
| 666 |
contract_preview
|
| 667 |
]
|
|
@@ -685,9 +671,9 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
| 685 |
fn=generate_pdf,
|
| 686 |
inputs=[contract_data, contract_name],
|
| 687 |
outputs=[
|
| 688 |
-
|
| 689 |
-
|
| 690 |
]
|
| 691 |
)
|
| 692 |
|
| 693 |
-
return demo
|
|
|
|
| 1 |
"""
|
| 2 |
Module définissant l'interface utilisateur Gradio sous forme d'assistant progressif (wizard).
|
| 3 |
+
Version améliorée avec zone de prévisualisation fixe et meilleur placement des éléments.
|
| 4 |
"""
|
| 5 |
import gradio as gr
|
| 6 |
from utils import collect_author_info, ensure_default_supports
|
|
|
|
| 24 |
# Définir le nombre total d'étapes
|
| 25 |
TOTAL_STEPS = 6
|
| 26 |
|
| 27 |
+
with gr.Blocks(title="Assistant de Contrats de Cession", css="wizard_style.css") as demo:
|
| 28 |
# Variables d'état pour stocker les données entre les étapes
|
| 29 |
current_step = gr.State(value=1)
|
| 30 |
contract_data = gr.State(value={
|
|
|
|
| 278 |
value=""
|
| 279 |
)
|
| 280 |
|
| 281 |
+
generate_button = gr.Button("Générer le PDF", variant="primary", elem_id="generate-btn")
|
| 282 |
+
|
| 283 |
# Indicateur de génération
|
| 284 |
+
with gr.Group() as generation_status_group:
|
| 285 |
+
generation_status = gr.Markdown("", elem_id="generation-status")
|
| 286 |
generation_progress = gr.Slider(
|
| 287 |
minimum=0,
|
| 288 |
maximum=100,
|
| 289 |
value=0,
|
| 290 |
step=1,
|
| 291 |
interactive=False,
|
| 292 |
+
label="Progression",
|
| 293 |
+
visible=False
|
| 294 |
)
|
| 295 |
+
|
| 296 |
+
# Zone de téléchargement (maintenant placée sous le bouton)
|
| 297 |
+
with gr.Group(visible=False) as download_group:
|
| 298 |
+
gr.Markdown("### Téléchargement")
|
| 299 |
+
pdf_output = gr.File(label="Votre contrat est prêt!")
|
| 300 |
|
| 301 |
# Boutons de navigation entre les étapes
|
| 302 |
with gr.Row():
|
| 303 |
back_button = gr.Button("Précédent", variant="secondary")
|
| 304 |
next_button = gr.Button("Suivant", variant="primary")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 305 |
|
| 306 |
# COLONNE DROITE - PRÉVISUALISATION EN TEMPS RÉEL
|
| 307 |
with gr.Column(scale=2):
|
|
|
|
| 311 |
"Au fur et à mesure que vous remplissez le formulaire, votre contrat se construit ici."
|
| 312 |
)
|
| 313 |
|
| 314 |
+
# Prévisualisation du contrat - avec classe spéciale pour avoir une hauteur fixe
|
| 315 |
+
contract_preview = gr.HTML(
|
| 316 |
+
value="<div class='fixed-preview'>*Commencez à remplir le formulaire pour voir l'aperçu du contrat*</div>",
|
| 317 |
elem_id="contract-preview"
|
| 318 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 319 |
|
| 320 |
# ===== FONCTIONS DE NAVIGATION ET MISE À JOUR =====
|
| 321 |
|
|
|
|
| 441 |
show_physical_person = (current == 3 and author_type_val == "Personne physique")
|
| 442 |
show_legal_entity = (current == 3 and author_type_val == "Personne morale")
|
| 443 |
|
|
|
|
|
|
|
|
|
|
| 444 |
# Mettre à jour l'aperçu du contrat
|
| 445 |
preview = preview_contract(data)
|
| 446 |
|
|
|
|
| 460 |
gr.update(visible=rights_visibility), gr.update(visible=remuneration_visibility),
|
| 461 |
gr.update(visible=show_work_desc), gr.update(visible=show_image_desc),
|
| 462 |
gr.update(visible=show_physical_person), gr.update(visible=show_legal_entity),
|
|
|
|
| 463 |
# Aperçu du contrat
|
| 464 |
preview
|
| 465 |
)
|
|
|
|
| 497 |
show_physical_person = (current == 3 and data["auteur_type"] == "Personne physique")
|
| 498 |
show_legal_entity = (current == 3 and data["auteur_type"] == "Personne morale")
|
| 499 |
|
|
|
|
|
|
|
|
|
|
| 500 |
# Mettre à jour l'aperçu du contrat
|
| 501 |
preview = preview_contract(data)
|
| 502 |
|
|
|
|
| 516 |
gr.update(visible=rights_visibility), gr.update(visible=remuneration_visibility),
|
| 517 |
gr.update(visible=show_work_desc), gr.update(visible=show_image_desc),
|
| 518 |
gr.update(visible=show_physical_person), gr.update(visible=show_legal_entity),
|
|
|
|
| 519 |
# Aperçu du contrat
|
| 520 |
preview
|
| 521 |
)
|
|
|
|
| 536 |
def generate_pdf(contract_data, filename):
|
| 537 |
"""Génère le PDF du contrat avec indication de progression."""
|
| 538 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 539 |
# Étape 1: Préparation du contrat (25%)
|
| 540 |
+
yield gr.update(value="Préparation des données..."), gr.update(visible=True, value=25), gr.update(visible=False), None
|
| 541 |
time.sleep(0.5)
|
| 542 |
|
| 543 |
# Étape 2: Mise en forme (50%)
|
| 544 |
+
yield gr.update(value="Construction du contrat..."), gr.update(visible=True, value=50), gr.update(visible=False), None
|
| 545 |
time.sleep(0.5)
|
| 546 |
|
| 547 |
# Étape 3: Génération du PDF (75%)
|
| 548 |
+
yield gr.update(value="Génération du PDF..."), gr.update(visible=True, value=75), gr.update(visible=False), None
|
| 549 |
|
| 550 |
# Appel à la fonction de génération réelle
|
| 551 |
pdf_path = generate_pdf_fn(
|
|
|
|
| 562 |
)
|
| 563 |
|
| 564 |
# Finalisation (100%)
|
| 565 |
+
yield gr.update(value="Contrat PDF généré avec succès!"), gr.update(visible=True, value=100), gr.update(visible=True), pdf_path
|
| 566 |
|
| 567 |
# Fonction simplifiée pour prévisualiser le contrat
|
| 568 |
def preview_contract(data):
|
|
|
|
| 570 |
|
| 571 |
# Vérifier qu'il y a suffisamment de données pour prévisualiser
|
| 572 |
if not data.get("type_contrat"):
|
| 573 |
+
return "<div class='fixed-preview'>*Complétez au moins le type de contrat pour voir l'aperçu*</div>"
|
| 574 |
|
| 575 |
# Appeler la fonction de prévisualisation
|
| 576 |
try:
|
|
|
|
| 595 |
if ligne.strip().startswith("ARTICLE") or ligne.strip().isupper():
|
| 596 |
preview_html = preview_html.replace(ligne, f"<h3>{ligne}</h3>")
|
| 597 |
|
| 598 |
+
# Encapsuler le contenu dans une div avec la classe spéciale
|
| 599 |
+
return f"<div class='fixed-preview'>{preview_html}</div>"
|
| 600 |
except Exception as e:
|
| 601 |
+
return f"<div class='fixed-preview'>*Erreur de prévisualisation: {str(e)}*</div>"
|
| 602 |
|
| 603 |
# ===== ÉVÉNEMENTS =====
|
| 604 |
|
|
|
|
| 630 |
group_rights, group_remuneration,
|
| 631 |
group_work_description, group_image_description,
|
| 632 |
group_physical_person, group_legal_entity,
|
|
|
|
| 633 |
# Aperçu du contrat
|
| 634 |
contract_preview
|
| 635 |
]
|
|
|
|
| 648 |
group_rights, group_remuneration,
|
| 649 |
group_work_description, group_image_description,
|
| 650 |
group_physical_person, group_legal_entity,
|
|
|
|
| 651 |
# Aperçu du contrat
|
| 652 |
contract_preview
|
| 653 |
]
|
|
|
|
| 671 |
fn=generate_pdf,
|
| 672 |
inputs=[contract_data, contract_name],
|
| 673 |
outputs=[
|
| 674 |
+
generation_status, generation_progress,
|
| 675 |
+
download_group, pdf_output
|
| 676 |
]
|
| 677 |
)
|
| 678 |
|
| 679 |
+
return demo
|