-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDashboard.py
More file actions
206 lines (181 loc) · 7.56 KB
/
Dashboard.py
File metadata and controls
206 lines (181 loc) · 7.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
import streamlit as st
import requests # Import the requests library
import os # To potentially get API base URL from environment
# --- Page Configuration (MUST BE THE FIRST STREAMLIT COMMAND) ---
st.set_page_config(
page_title="Projet BI & LLM - Accueil",
page_icon="🏠",
layout="wide"
)
# --- Custom CSS for essential styling ---
st.markdown("""
<style>
/* Main header styling */
.main-header {
background-color: #f1f5f9;
padding: 1.5rem;
border-radius: 10px;
margin-bottom: 1.5rem;
border-left: 4px solid #3b82f6;
}
/* Feature card styling */
.feature-card {
background-color: white;
border-radius: 10px;
padding: 1.5rem;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
margin-bottom: 1rem;
border-top: 3px solid #3b82f6;
}
/* Info box styling */
.info-box {
background-color: #e3f2fd;
border-left: 4px solid #2196f3;
padding: 1rem;
border-radius: 0 5px 5px 0;
margin: 1rem 0;
}
/* Warning box for API config */
.warning-box {
background-color: #fff8e1;
border-left: 4px solid #ffc107;
padding: 1rem;
border-radius: 0 5px 5px 0;
margin: 1rem 0;
}
/* Added styling for the new action buttons section */
.action-buttons-container {
background-color: #e9d5ff; /* A light purple, adjust as needed */
border-left: 4px solid #8b5cf6; /* A purple accent */
padding: 1.5rem;
border-radius: 10px;
margin: 2rem 0;
}
.action-buttons-container h4 {
color: #5b21b6; /* Darker purple for header */
margin-top: 0;
margin-bottom: 1rem;
}
/* Footer styling */
.footer {
margin-top: 2rem;
padding-top: 1rem;
border-top: 1px solid #e5e7eb;
color: #6B7280;
font-size: 0.875rem;
text-align: center;
}
</style>
""", unsafe_allow_html=True)
# --- Sidebar Navigation ---
st.sidebar.success("Sélectionnez une section ci-dessus.")
# --- Main Content ---
# Header Section
st.markdown("""
<div class="main-header">
<h1>Tableau de Bord Business Intelligence & LLM</h1>
<p>Plateforme intégrée pour l'analyse de données produits et l'enrichissement via LLM</p>
</div>
""", unsafe_allow_html=True)
# Main features section
st.markdown("## Fonctionnalités principales")
col1, col2 = st.columns(2)
with col1:
st.markdown("""
<div class="feature-card">
<h3>📊 Analyse Business Intelligence</h3>
<p>Visualisez et analysez vos données produits avec des tableaux de bord interactifs, des KPIs et des graphiques.</p>
<ul>
<li>Visualisation des données</li>
<li>Analyse des KPIs</li>
<li>Filtrage des résultats</li>
</ul>
</div>
""", unsafe_allow_html=True)
with col2:
st.markdown("""
<div class="feature-card">
<h3>🤖 Enrichissement LLM</h3>
<p>Utilisez des modèles de langage avancés pour générer des insights, des synthèses et des recommandations.</p>
<ul>
<li>Génération de recommandations</li>
<li>Analyse de sentiments</li>
<li>Synthèse de données</li>
</ul>
</div>
""", unsafe_allow_html=True)
# API Configuration Warning
st.markdown("""
<div class="warning-box">
<h4>⚠️ Configuration requise</h4>
<p>Assurez-vous d'avoir configuré votre clé API dans <code>.streamlit/secrets.toml</code> pour utiliser la section LLM et que les services backend sont accessibles.</p>
</div>
""", unsafe_allow_html=True) # Added backend services note
# Getting Started Guide
st.markdown("""
<div class="info-box">
<h4>🚀 Pour commencer</h4>
<p>Utilisez la navigation dans la barre latérale pour explorer les différentes sections du tableau de bord.</p>
<ul>
<li><strong>Analyse BI :</strong> Visualisation des KPIs et des données produits</li>
<li><strong>Enrichissement LLM :</strong> Génération de synthèses et recommandations via IA</li>
</ul>
</div>
""", unsafe_allow_html=True)
# --- NEW SECTION: Action Buttons ---
st.markdown("---") # Add a horizontal rule for separation
# Define the base URL for API calls.
# This should ideally come from an environment variable if it can change.
# For K8s Ingress setup, this will be your external domain.
API_BASE_URL = os.getenv("API_BASE_URL", "http://dashboard2025.com")
st.markdown("<div class='action-buttons-container'>", unsafe_allow_html=True)
st.markdown("<h4>⚙️ Actions de Données</h4>", unsafe_allow_html=True)
st.markdown("<p>Déclenchez les processus de collecte de données et d'analyse. Ces opérations peuvent prendre du temps.</p>", unsafe_allow_html=True)
action_col1, action_col2, action_col3 = st.columns(3)
with action_col1:
if st.button("🛍️ Lancer Scrapping Shopify", key="run_shopify_scrape_button"):
endpoint = "/run_shopify_scrape"
url = f"{API_BASE_URL}{endpoint}"
try:
st.info(f"Envoi de la requête POST à {url}...")
response = requests.post(url, timeout=10) # Added timeout
if 200 <= response.status_code < 300:
st.success(f"Requête Shopify Scrape envoyée avec succès! Status: {response.status_code}. Réponse: {response.json().get('message', 'Pas de message')}")
else:
st.error(f"Erreur Shopify Scrape: {response.status_code} - {response.text}")
except requests.exceptions.RequestException as e:
st.error(f"Erreur de connexion lors de la requête Shopify Scrape: {e}")
with action_col2:
if st.button("🛒 Lancer Scrapping WooCommerce", key="run_woo_scrape_button"):
endpoint = "/run_woo_scrape"
url = f"{API_BASE_URL}{endpoint}"
try:
st.info(f"Envoi de la requête POST à {url}...")
response = requests.post(url, timeout=10) # Added timeout
if 200 <= response.status_code < 300:
st.success(f"Requête WooCommerce Scrape envoyée avec succès! Status: {response.status_code}. Réponse: {response.json().get('message', 'Pas de message')}")
else:
st.error(f"Erreur WooCommerce Scrape: {response.status_code} - {response.text}")
except requests.exceptions.RequestException as e:
st.error(f"Erreur de connexion lors de la requête WooCommerce Scrape: {e}")
with action_col3:
if st.button("🔬 Lancer Analyse Produits", key="run_analysis_button"):
endpoint = "/run_analysis"
url = f"{API_BASE_URL}{endpoint}"
try:
st.info(f"Envoi de la requête POST à {url}...")
response = requests.post(url, timeout=10) # Added timeout
if 200 <= response.status_code < 300:
st.success(f"Requête Analyse Produits envoyée avec succès! Status: {response.status_code}. Réponse: {response.json().get('message', 'Pas de message')}")
else:
st.error(f"Erreur Analyse Produits: {response.status_code} - {response.text}")
except requests.exceptions.RequestException as e:
st.error(f"Erreur de connexion lors de la requête Analyse Produits: {e}")
st.markdown("</div>", unsafe_allow_html=True)
# --- End of NEW SECTION ---
# Footer
st.markdown("""
<div class="footer">
<p>Tableau de Bord BI & LLM | Développé avec Streamlit</p>
</div>
""", unsafe_allow_html=True)