import streamlit as st import re from folium import Map, Marker, Icon, Popup from streamlit_folium import folium_static from data_manager import get_data from data_manager_bziiit import * from ISO26000 import classify_actions_rse_ISO26000 from bs4 import BeautifulSoup from urllib.parse import urlparse ############################################################################################### # PARTIE 0 : Récupération des données API bziiit et Bordeaux Métropole ############################################################################################### def fetch_data(): data, _ = get_data() # Récupération des données de Bordeaux Métropole bziiit_data = get_bziiit_data() # Récupération des données de Bziiit return data, bziiit_data ############################################################################################### # PARTIE 1 : Le sélecteur d'entreprise ############################################################################################### def display_company_selection(data): # Get a list of all company names companies = sorted(list(set(record['nom_courant_denomination'] for record in data)), key=str.lower) selected_company = st.selectbox('Sélectionnez une entreprise', companies) return selected_company # Return the selected company name # Uniformiser les noms de champs def normalize_company_name(record): # Gère les différences de noms de champs entre les APIs if 'nom_courant_denomination' in record: return record['nom_courant_denomination'].strip().lower() elif 'name' in record: return record['name'].strip().lower() return 'Unknown' ############################################################################################### # PARTIE 2 : AFFICHAGE OPEN DATA BORDEAUX METROPOLE ############################################################################################### def display_company_info(data, bziiit_data, selected_company): normalized_selected = normalize_company_name({'name': selected_company}) # Assurez-vous que cette fonction normalise correctement comme expliqué dans l'étape 1. company_data = next((record for record in data if normalize_company_name(record) == normalized_selected), None) bziiit_company_data = next((record for record in bziiit_data if normalize_company_name(record) == normalized_selected), None) classified_data = classify_actions_rse_ISO26000(data) # Normalize the company name for comparison normalized_selected = normalize_company_name({'name': selected_company}) # Find the company in the classified data company_category = None for category, companies in classified_data.items(): if any(normalize_company_name(company) == normalized_selected for company in companies): company_category = category break if bziiit_company_data is None: bziiit_company_data = {} st.markdown("""
""", unsafe_allow_html=True) if company_data: st.markdown("### Source OPEN DATA Bordeaux Métropole") st.write(f"**Nom de l'entreprise:** {company_data.get('nom_courant_denomination', 'Non disponible')}") col10, col20 = st.columns(2) with col10: if 'point_geo' in company_data and len(company_data['point_geo']) == 2: lat, lon = company_data['point_geo'] m = Map(location=[lat, lon], zoom_start=10) popup_html = f"""
{company_data.get('nom_courant_denomination', 'Sans nom')}

Action RSE:
{company_data.get('action_rse', 'Non spécifiée')}


Secteur d'activité: {company_data.get('libelle_section_naf', 'Non spécifié')}
""" icon = Icon(icon="leaf", prefix='fa', color='green') Marker([lat, lon], icon=icon, popup=Popup(popup_html, max_width=500)).add_to(m) folium_static(m, width=330, height=500) else: st.write("**Position GPS non disponible pour cette entreprise.**") with col20: st.write(f"**Nom de l'entreprise :** {company_data.get('nom_courant_denomination', 'Non disponible')}") st.write(f"**Commune :** {company_data.get('commune', 'Non disponible')}") st.write(f"**Section NAF :** {company_data.get('libelle_section_naf', 'Non disponible')}") st.write(f"**Effectif :** {company_data.get('tranche_effectif_entreprise', 'Non spécifié')}") action_rse = company_data.get('action_rse', 'Non spécifié') st.write(f"**Action RSE :** {action_rse}") if action_rse != 'Non spécifié': if company_category: st.write(f"**Classification ISO 26000 (via IA) :** {company_category}") else: st.write("**Classification ISO 26000:** Catégorie non déterminée") else: st.error("Aucune donnée disponible pour cette entreprise depuis l'API Bordeaux Métropole.") ############################################################################################### # PARTIE 3 : AFFICHAGE OPEN DATA bziiit ############################################################################################### def get_labels(): url = f"{BASE_URL}/opendata/labels" response = requests.get(url) if response.status_code == 200: return response.json()["response"] else: st.error(f"Échec de récupération des labels: {response.text}") return [] st.markdown("""
""", unsafe_allow_html=True) if bziiit_company_data: st.markdown("### Source OPEN DATA bziiit") # Assurez-vous d'avoir les informations nécessaires logo_url = bziiit_company_data.get('logo_url', '') website_url = bziiit_company_data.get('website_url', '') # Affichez le logo if logo_url: st.markdown(f'
', unsafe_allow_html=True) else: st.markdown('
Logo non disponible
', unsafe_allow_html=True) # Récupérez la description description = bziiit_company_data.get('description', '') # Utilisez une regex pour trouver les URL dans la description website_url = re.findall(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', description) # Vérifiez si une URL a été trouvée if website_url: # Prenez la première URL trouvée website_url = website_url[0] st.markdown(f'
[Site web de l\'entreprise]({website_url})
', unsafe_allow_html=True) else: st.markdown('
URL du site web non disponible
', unsafe_allow_html=True) description_html = bziiit_company_data.get('description', 'Description non disponible') description_text = BeautifulSoup(description_html, "html.parser").get_text() st.write("📝 **Description de l'entreprise:**") st.write(description_text) st.markdown("🏷️ **Labels / Certifications RSE - Qualité :**") labels = get_labels() # Get the labels using the get_labels function label_data = bziiit_company_data.get('labels', []) if not label_data: st.write("Pas de Labels / Certifications RSE - Qualité actuellement.") else: # ... for i in range(0, len(label_data), 2): # Loop through labels two at a time cols = st.columns(2) # Create two columns for j in range(2): # Loop through the two labels if i + j < len(label_data): # Check if there is a label to process label = label_data[i + j] label_name = label.get("name", "Label non spécifié") # Find the corresponding label in the labels data label_info = next((l for l in labels if l.get("name") == label_name), None) if label_info: # Only process labels with info label_description = label_info.get("description", "Description non disponible") # Get the label description from the label info logo_url = label_info.get("logo_url") # Get the logo URL from the label info try: # Display the image in the corresponding column with a tooltip cols[j].markdown(f'
{label_name}

{label_name}

', unsafe_allow_html=True) except Exception as e: st.error(f"Erreur lors de l'affichage de l'image : {e}") # ... if st.button('Ici pour visualiser le mail à envoyer pour référencer un nouveau label / certification RSE - Qualité'): st.markdown(""" **Objet email :** Demande de référencement Certification / Label RSE - Qualité **Corps email :** Bonjour, Ci-dessous le lien publique vers la certification / label RSE - Qualité de notre entreprise pour référencement dans votre plateforme OPEN DATA IA RSE Bordeaux Métropole URL à renseigner - 01 : URL à renseigner - 02 : URL à renseigner - 03 : ... Nom du demandeur : Qualité ou statut : Destinataire : info@bziiit.com Merci par avance de votre aide pour développer la visibilité de vos Labels / Certifications L'équipe OPEN DATA IA RSE Bordeaux Métropole """, unsafe_allow_html=True) else: st.write("**Aucune donnée bziiit disponible pour cette entreprise.**") def is_valid_url(url): try: response = requests.head(url) return response.status_code == 200 except requests.RequestException: return False """ ############################################################################################### # PARTIE 5 : AFFICHAGE INSPIREZ VOUS ############################################################################################### def display_similar_companies(data, selected_company): classified_data = classify_actions_rse_ISO26000(data) company_data = next((record for record in data if record['nom_courant_denomination'] == selected_company), None) if company_data: action_rse = company_data.get('action_rse', 'Unknown').lower() for category, companies in classified_data.items(): if any(company.get('action_rse', 'Unknown').lower() == action_rse for company in companies): """ # st.markdown("""
""", unsafe_allow_html=True) """ st.write("Ces organisations pourraient également vous inspirer") max_pages = (len(companies) - 1) // 5 + 1 cols = st.columns([1,1,1,1,1]) if cols[1].button('Précédent'): page = max(page - 1, 1) page = cols[2].number_input('Page', min_value=1, max_value=max_pages, value=1, step=1) if cols[3].button('Suivant'): page = min(page + 1, max_pages) companies_to_display = companies[(page - 1) * 5:page * 5] st.write(f"Page: {page}") # Debugging line st.write(f"Companies to display: {companies_to_display}") # Debugging line for i, company in enumerate(companies_to_display): st.write(f"Company: {company}") # Debugging line logo_url = company.get('logo', 'https://opendata.bordeaux-metropole.fr/assets/theme_image/Open%20data%20-%20Pictos%2050px%20x%2050px-03.jpg') if is_valid_url(logo_url): cols[i].image(logo_url, width=50) else: cols[i].image('https://opendata.bordeaux-metropole.fr/assets/theme_image/Open%20data%20-%20Pictos%2050px%20x%2050px-03.jpg', width=50) cols[i].write(f"**{company.get('name', 'Unknown')}**") cols[i].write(f"{company.get('action_rse', 'Unknown')[:30]}") """