| import streamlit as st |
| import plotly.graph_objects as go |
| import plotly.express as px |
|
|
| from PIL import Image |
| import pdfkit |
| import pandas as pd |
| import plotly.io as pio |
| import tempfile |
|
|
|
|
| def construct_plot(): |
| |
| stakeholders = st.session_state['pp_grouped'] |
|
|
| if stakeholders is None or len(stakeholders) == 0: |
| st.error("Aucune partie prenante n'a été définie") |
| return None |
| |
| fig = go.Figure() |
|
|
| |
| fig.add_shape(type="rect", x0=0, y0=50, x1=50, y1=100, fillcolor="lightblue", opacity=0.2, line_width=0) |
| fig.add_shape(type="rect", x0=50, y0=50, x1=100, y1=100, fillcolor="lightyellow", opacity=0.2, line_width=0) |
| fig.add_shape(type="rect", x0=0, y0=0, x1=50, y1=50, fillcolor="lightcoral", opacity=0.2, line_width=0) |
| fig.add_shape(type="rect", x0=50, y0=0, x1=100, y1=50, fillcolor="lightcyan", opacity=0.2, line_width=0) |
|
|
| |
| fig.add_annotation(x=10, y=90, text="Rendre satisfait", showarrow=False) |
| fig.add_annotation(x=60, y=90, text="Gérer étroitement", showarrow=False) |
| fig.add_annotation(x=10, y=40, text="Suivre de près", showarrow=False) |
| fig.add_annotation(x=60, y=40, text="Tenir informé", showarrow=False) |
|
|
| x_array = [stakeholder['x'] for stakeholder in stakeholders] |
| y_array = [stakeholder['y'] for stakeholder in stakeholders] |
| name_array = [stakeholder['name'] for stakeholder in stakeholders] |
|
|
| |
| |
| for i,stakeholder in enumerate(stakeholders): |
| fig.add_trace(go.Scatter( |
| x=[stakeholder['x']], |
| y=[stakeholder['y']], |
| mode='markers+text', |
| marker=dict(color=stakeholder['color'],size=33), |
| textposition="top center", |
| name=stakeholder['name'] |
| )) |
|
|
| |
| fig.update_layout( |
| legend=dict( orientation="h", yanchor="bottom",y=1.02,title="Parties prenantes"), |
| height=600, |
| title=dict(text="Cartographie des parties prenantes", x=0.5, y=1, xanchor="center", yanchor="top"), |
| xaxis=dict(title="Influence", range=[0, 100]), |
| yaxis=dict(title="Pouvoir", range=[0, 100]), |
| showlegend=True |
| ) |
|
|
| |
| return fig |
|
|
| def save_plot_as_pdf(fig, logo_path, title): |
| st.write("saving plot as pdf") |
|
|
| with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as tmpfile: |
| st.write("tmpfile created") |
| image_bytes = pio.to_image(fig, format='png') |
| st.write("image_bytes") |
|
|
| tmpfile.write(image_bytes) |
| tmpfile.close() |
| plot_image_path = tmpfile.name |
| |
| st.write(plot_image_path) |
|
|
| html_content = f""" |
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>{title}</title> |
| <style> |
| body {{ font-family: Arial, sans-serif; text-align: center; }} |
| .logo {{ width: 100px; margin-top: 20px; }} |
| .title {{ font-size: 24px; margin-top: 20px; }} |
| .plot-image {{ width: 80%; margin-top: 20px; }} |
| </style> |
| </head> |
| <body> |
| {"<img src='" + logo_path + "' class='logo'>" if logo_path else ""} |
| <div class="title">{title}</div> |
| <img src="{plot_image_path}" class="plot-image"> |
| </body> |
| </html> |
| """ |
| |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".html") as tmpfile: |
| tmpfile.write(html_content.encode('utf-8')) |
| tmpfile.close() |
| html_path = tmpfile.name |
| |
| pdf_path = html_path.replace('figure.html', '.pdf') |
| st.write(pdf_path) |
| pdfkit.from_file(html_path, pdf_path) |
| return pdf_path |
|
|
| def download_pdf(): |
| |
| fig = construct_plot() |
| |
| if fig is None: |
| return None |
| st.write("fig constructed") |
|
|
| logo_path = "https://static.wixstatic.com/media/d7d3da_b69e03ae99224f7d8b6e358918e60071~mv2.png/v1/crop/x_173,y_0,w_1906,h_938/fill/w_242,h_119,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/BZIIIT_LOGO-HORIZ-COULEUR.png" |
| pdf_title = "Cartographie des parties prenantes" |
| |
| pdf_path = save_plot_as_pdf(fig, logo_path, pdf_title) |
|
|
| st.write("pdf saved") |
| with open(pdf_path, "rb") as pdf_file: |
| st.download_button(label="Download PDF", data=pdf_file, file_name="stakeholder_analysis.pdf") |
|
|
|
|