import streamlit as st import json def importer_exporter_graph(G): st.markdown("## Sauvegarder ou restaurer la configuration") if st.button("Exporter configuration"): nodes = [n for n, d in G.nodes(data=True) if d.get("personnalisation") == "oui"] edges = [(u, v) for u, v in G.edges() if u in nodes] conf = {"nodes": nodes, "edges": edges} json_str = json.dumps(conf, ensure_ascii=False) st.download_button( label="Télécharger (JSON)", data=json_str, file_name="config_personnalisation.json", mime="application/json" ) uploaded = st.file_uploader("Importer une configuration JSON (max 100 Ko)", type=["json"]) if uploaded: if uploaded.size > 100 * 1024: st.error("Fichier trop volumineux (max 100 Ko).") else: try: conf = json.loads(uploaded.read().decode("utf-8")) all_nodes = conf.get("nodes", []) all_edges = conf.get("edges", []) if not all_nodes: st.warning("Aucun produit trouvé dans le fichier.") else: st.markdown("### Sélection des produits à restaurer") sel_nodes = st.multiselect( "Produits à restaurer", options=all_nodes, default=all_nodes, key="restaurer_selection" ) if st.button("Restaurer les éléments sélectionnés", type="primary"): for node in sel_nodes: if not G.has_node(node): G.add_node(node, niveau="0", personnalisation="oui", label=node) for u, v in all_edges: if u in sel_nodes and v in sel_nodes + list(G.nodes()) and not G.has_edge(u, v): G.add_edge(u, v) st.success("Configuration partielle restaurée avec succès.") except Exception as e: st.error(f"Erreur d'import : {e}") return G