datacipen commited on
Commit
026b2ca
·
verified ·
1 Parent(s): 79be614

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +25 -118
main.py CHANGED
@@ -26,13 +26,11 @@ from langgraph.checkpoint.memory import MemorySaver
26
  from langchain_openai import ChatOpenAI
27
  from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
28
 
29
- from dash_socketio import DashSocketIO
30
  import dash
31
  from dash.dependencies import Input, Output, State
32
  from dash import Dash, html, dcc, callback, callback_context, ctx, Output, Input, dash_table, State, no_update, _dash_renderer, clientside_callback
33
  from dash import html
34
 
35
- import dash_bootstrap_components as dbc
36
  import dash_bootstrap_components as dbc
37
  from dash.exceptions import PreventUpdate
38
  import dash_mantine_components as dmc
@@ -40,7 +38,6 @@ from dash_iconify import DashIconify
40
  _dash_renderer._set_react_version("18.2.0")
41
  import flask
42
  from flask_login import LoginManager, UserMixin, login_user, current_user, login_required, logout_user
43
- from flask_socketio import SocketIO, emit
44
  from datetime import timedelta
45
 
46
  from IPython.display import display, HTML
@@ -591,7 +588,7 @@ def build_workflow(num_bcc,file,pathname) -> StateGraph:
591
 
592
  return workflow
593
 
594
- def init_agent_state(current_url, num, socket_id, pathname) -> AgentState:
595
  initial_state: AgentState = {
596
  #"files_list": csv_files[1:], # Tous les fichiers sauf le premier
597
  #"current_file": csv_files[0], # Premier fichier à traiter
@@ -625,61 +622,37 @@ def init_agent_state(current_url, num, socket_id, pathname) -> AgentState:
625
  if task == "load_and_preprocess":
626
  if key == "current_file":
627
  result += f"Traitement du fichier {taskInfo['current_file']} en cours...\n"
628
- emit("stream", f"Traitement du fichier {taskInfo['current_file']} en cours... Création des catégories d'enseignements en cours...\n", namespace="/", to=socket_id)
629
- time.sleep(0.05)
630
  if task == "classify_teachings":
631
  if key == "status":
632
  for key, value in taskInfo['classified_teachings'].items():
633
  result += f"\n\n-**Enseignement classé dans la catégorie '{key}'** : "
634
- emit("stream", f"\n\nEnseignement classé dans la catégorie '{key}' : ", namespace="/", to=socket_id)
635
- time.sleep(1.0)
636
  for enseignement in value:
637
  result += f"{enseignement}, "
638
- emit("stream", f"{enseignement}, ", namespace="/", to=socket_id)
639
- time.sleep(0.05)
640
  result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
641
- emit("stream", f"\n\nTraitement de la tâche : {taskInfo['status']}... Création des situations d'apprentissage en cours...\n", namespace="/", to=socket_id)
642
- time.sleep(0.05)
643
  if task == "create_categories":
644
  if key == "status":
645
  result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
646
- emit("stream", f"\n\nTraitement de la tâche : {taskInfo['status']}... Classification des enseignements en cours...\n", namespace="/", to=socket_id)
647
- time.sleep(0.05)
648
  if task == "create_learning_situations":
649
  if key == "status":
650
  if taskInfo['learning_situations'].items():
651
  for key, value in taskInfo['learning_situations'].items():
652
  result += f"\n\n-**Situation d'apprentissage créée pour la catégorie '{key}'** : {value}\n"
653
- emit("stream", f"\n\nSituation d'apprentissage créée pour la catégorie '{key}' : {value}\n", namespace="/", to=socket_id)
654
- time.sleep(1.0)
655
  result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
656
- emit("stream", f"\n\nTraitement de la tâche : {taskInfo['status']}... Création des BCC en cours...\n", namespace="/", to=socket_id)
657
- time.sleep(0.05)
658
  else:
659
  result += f"\n\nTraitement de la tâche : pas de situations d'apprentissage créées\n"
660
- emit("stream", f"\n\nTraitement de la tâche : pas de situations d'apprentissage créées\n", namespace="/", to=socket_id)
661
- time.sleep(0.05)
662
  if task == "create_academic_competencies":
663
  if key == "dataframe":
664
  df = taskInfo['dataframe']
665
  if key == "status":
666
  if taskInfo['academic_competencies'].items():
667
  for key, value in taskInfo['academic_competencies'].items():
668
- result += f"\n\n-**Compétence académique créée pour la catégorie '{key}'** : {value}\n"
669
- emit("stream", f"\n\nCompétence académique créée pour la catégorie '{key}' : {value}\n", namespace="/", to=socket_id)
670
- time.sleep(1.0)
671
  result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
672
- emit("stream", f"\n\nTraitement de la tâche : {taskInfo['status']}...\n", namespace="/", to=socket_id)
673
- time.sleep(0.05)
674
  else:
675
  result += f"\n\nTraitement de la tâche : pas de BCC créés\n"
676
- emit("stream", f"\n\nTraitement de la tâche : pas de BCC créés\n", namespace="/", to=socket_id)
677
- time.sleep(0.05)
678
  if task == "export_to_excel_2":
679
  if key == "status":
680
  result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
681
- emit("stream", f"\n\nTraitement de la tâche : {taskInfo['status']}...\n", namespace="/", to=socket_id)
682
- time.sleep(0.05)
683
 
684
  except Exception as e:
685
  print(f"Erreur lors de l'exécution du workflow: {e}")
@@ -801,7 +774,6 @@ app = dash.Dash(__name__, server=server, external_stylesheets=[dmc.styles.ALL, d
801
  update_title='Chargement...',
802
  suppress_callback_exceptions=True)
803
 
804
- socketio = SocketIO(app.server)
805
  # Updating the Flask Server configuration with Secret Key to encrypt the user session cookie
806
  server.config['REMEMBER_COOKIE_DURATION'] = timedelta(seconds=3600)
807
 
@@ -1134,7 +1106,7 @@ app_page = dmc.MantineProvider(
1134
  className="g-0"
1135
  ),
1136
  html.H4(id="text-enseignement-dropdown", className="mb-3 text-success", style={"font-size": "0.7rem"}),
1137
- dbc.Textarea(id="enseignement-dropdown", className="mb-3", style={"height":"200px", "max-height":"250px", "font-size": "0.75rem","color":"white","border":"border 1px solid rgb(67,167,255)!important", "background-color":"transparent"}),
1138
  ], md=6),
1139
  dbc.Col([
1140
  dbc.Row(
@@ -1148,7 +1120,7 @@ app_page = dmc.MantineProvider(
1148
  className="g-0"
1149
  ),
1150
  html.H4("Choisir d'abord une maquette de formation avec propositions BCC", className="mb-3", style={"font-size": "0.7rem"}),
1151
- dbc.Textarea(id="classification-dropdown", className="mb-3", placeholder="Choisir d'abord une maquette avec propositions BCC", style={"height":"200px", "max-height":"250px", "font-size": "0.75rem","color":"white","border":"border 1px solid rgb(67,167,255)!important", "background-color":"transparent"}),
1152
  ], md=6)
1153
  ]),
1154
  dbc.Row([
@@ -1164,7 +1136,7 @@ app_page = dmc.MantineProvider(
1164
  className="g-0"
1165
  ),
1166
  html.H4("Choisir d'abord une maquette de formation avec propositions BCC", className="mb-3", style={"font-size": "0.7rem"}),
1167
- dbc.Textarea(id="situation-dropdown", className="mb-3", placeholder="Choisir d'abord une maquette avec propositions BCC", style={"height":"200px", "max-height":"250px", "font-size": "0.75rem","color":"white","border":"border 1px solid rgb(67,167,255)!important", "background-color":"transparent"}),
1168
  ], md=6),
1169
  dbc.Col([
1170
  dbc.Row(
@@ -1292,9 +1264,8 @@ app_page = dmc.MantineProvider(
1292
  align="left",
1293
  className="g-0"
1294
  ),
1295
- html.Div(id='output-response', style={"color":"rgb(90, 242, 156)","border-radius":"3px","border":"1px solid rgb(255,255,255)!important","background-color":"rgba(90, 242, 156, 0.2)","padding":"5px"}),
1296
- html.Div(id="notification_wrapper", style={"margin-top":"1rem"}),
1297
- DashSocketIO(id='socketio', eventNames=["notification", "stream"]),
1298
  ], width=12)
1299
  ])
1300
  ], className="mt-5")],
@@ -1675,9 +1646,8 @@ app_avid_page = dmc.MantineProvider(
1675
  align="left",
1676
  className="g-0"
1677
  ),
1678
- html.Div(id='output-response-avid', style={"color":"rgb(156, 242, 242)","border-radius":"3px","border":"1px solid rgb(255,255,255)!important","background-color":"rgba(156, 242, 242, 0.2)","padding":"5px"}),
1679
- html.Div(id="notification_wrapper-avid", style={"margin-top":"1rem"}),
1680
- DashSocketIO(id='socketio-avid', eventNames=["notification", "stream"]),
1681
  ], width=12)
1682
  ])
1683
  ], className="mt-5")],
@@ -2215,129 +2185,66 @@ def display_page(pathname):
2215
  # You could also return a 404 "URL not found" page here
2216
  return view, url
2217
 
2218
- @socketio.on("connect")
2219
- def on_connect():
2220
- print("Client connected")
2221
-
2222
- @socketio.on("disconnect")
2223
- def on_disconnect():
2224
- print("Client disconnected")
2225
-
2226
-
2227
  @callback(
2228
  Output("output-response", "children"),
2229
- Output("notification_wrapper", "children", allow_duplicate=True),
2230
  Input("num-bcc", "value"),
2231
  Input("maquette-dropdown", "value"),
2232
  Input("submit-button", "n_clicks"),
2233
- State("socketio", "socketId"),
2234
  State("url", "pathname"),
2235
- running=[[Output("output-response", "children"), "", None]],
2236
  prevent_initial_call=True,
2237
  )
2238
- def display_status(num, current, n_clicks, socket_id, pathname):
2239
- if not n_clicks or not socket_id:
2240
- return no_update, []
2241
 
2242
  if not current:
2243
  print(f"Erreur: Il n'y a pas de fichier dans le répertoire.")
2244
- return no_update, []
2245
  if not num:
2246
  print(f"Erreur: Il n'y a pas de nombre de BCC à générer.")
2247
- return no_update, []
2248
 
2249
  current_url = current
2250
 
2251
  print(f"Fichier Maquette sélectionné: {current_url}")
2252
- agent = init_agent_state(current_url, num, socket_id, pathname)
2253
  try:
2254
  df = agent[0]
2255
  result = agent[1]
2256
- return html.Div(children=[dbc.Table.from_dataframe(df[["diplome", "RNCP", "Année d'étude", "Semestre", "BCC", "UE", "ECUE","exemple_situation_apprentissage"]], striped=True, bordered=True, hover=True, index=False), dcc.Markdown(f"""{result}""", style={"color":"white","font-size":"0.75rem"})]), []
2257
  except:
2258
- return html.Div(dcc.Markdown(f"""{agent}""", style={"color":"white","font-size":"0.75rem"})), []
2259
 
2260
  @callback(
2261
  Output("output-response-avid", "children"),
2262
- Output("notification_wrapper-avid", "children", allow_duplicate=True),
2263
  Input("num-bcc-avid", "value"),
2264
  Input("maquette-dropdown-avid", "value"),
2265
  Input("submit-button-avid", "n_clicks"),
2266
- State("socketio-avid", "socketId"),
2267
  State("url", "pathname"),
2268
- running=[[Output("output-response-avid", "children"), "", None]],
2269
  prevent_initial_call=True,
2270
  )
2271
- def display_status(num, current, n_clicks, socket_id, pathname):
2272
- if not n_clicks or not socket_id:
2273
- return no_update, []
2274
 
2275
  if not current:
2276
  print(f"Erreur: Il n'y a pas de fichier dans le répertoire.")
2277
- return no_update, []
2278
  if not num:
2279
  print(f"Erreur: Il n'y a pas de nombre de BCC à générer.")
2280
- return no_update, []
2281
 
2282
  current_url = current
2283
 
2284
  print(f"Fichier Maquette sélectionné: {current_url}")
2285
 
2286
- agent = init_agent_state(current_url, num, socket_id, pathname)
2287
  try:
2288
  df = agent[0]
2289
  result = agent[1]
2290
- return html.Div(children=[dbc.Table.from_dataframe(df[["diplome", "RNCP", "Année d'étude", "Semestre", "BCC", "UE", "ECUE","exemple_situation_apprentissage"]], striped=True, bordered=True, hover=True, index=False), dcc.Markdown(f"""{result}""", style={"color":"white","font-size":"0.75rem"})]), []
2291
  except:
2292
- return html.Div(dcc.Markdown(f"""{agent}""", style={"color":"white","font-size":"0.75rem"})), []
2293
-
2294
- clientside_callback(
2295
- """connected => !connected""",
2296
- Output("submit-button", "disabled"),
2297
- Input("socketio", "connected"),
2298
- )
2299
-
2300
- clientside_callback(
2301
- """(notification) => {
2302
- if (!notification) return dash_clientside.no_update
2303
- return notification
2304
- }""",
2305
- Output("notification_wrapper", "children", allow_duplicate=True),
2306
- Input("socketio", "data-notification"),
2307
- prevent_initial_call=True,
2308
- )
2309
-
2310
- clientside_callback(
2311
- """(word, text) => text + word""",
2312
- Output("output-response", "children", allow_duplicate=True),
2313
- Input("socketio", "data-stream"),
2314
- State("output-response", "children"),
2315
- prevent_initial_call=True,
2316
- )
2317
-
2318
- clientside_callback(
2319
- """connected => !connected""",
2320
- Output("submit-button-avid", "disabled"),
2321
- Input("socketio-avid", "connected"),
2322
- )
2323
-
2324
- clientside_callback(
2325
- """(notification) => {
2326
- if (!notification) return dash_clientside.no_update
2327
- return notification
2328
- }""",
2329
- Output("notification_wrapper-avid", "children", allow_duplicate=True),
2330
- Input("socketio-avid", "data-notification"),
2331
- prevent_initial_call=True,
2332
- )
2333
-
2334
- clientside_callback(
2335
- """(word, text) => text + word""",
2336
- Output("output-response-avid", "children", allow_duplicate=True),
2337
- Input("socketio-avid", "data-stream"),
2338
- State("output-response-avid", "children"),
2339
- prevent_initial_call=True,
2340
- )
2341
 
2342
  if __name__ == '__main__':
2343
  app.run_server(debug=True)
 
26
  from langchain_openai import ChatOpenAI
27
  from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
28
 
 
29
  import dash
30
  from dash.dependencies import Input, Output, State
31
  from dash import Dash, html, dcc, callback, callback_context, ctx, Output, Input, dash_table, State, no_update, _dash_renderer, clientside_callback
32
  from dash import html
33
 
 
34
  import dash_bootstrap_components as dbc
35
  from dash.exceptions import PreventUpdate
36
  import dash_mantine_components as dmc
 
38
  _dash_renderer._set_react_version("18.2.0")
39
  import flask
40
  from flask_login import LoginManager, UserMixin, login_user, current_user, login_required, logout_user
 
41
  from datetime import timedelta
42
 
43
  from IPython.display import display, HTML
 
588
 
589
  return workflow
590
 
591
+ def init_agent_state(current_url, num, pathname) -> AgentState:
592
  initial_state: AgentState = {
593
  #"files_list": csv_files[1:], # Tous les fichiers sauf le premier
594
  #"current_file": csv_files[0], # Premier fichier à traiter
 
622
  if task == "load_and_preprocess":
623
  if key == "current_file":
624
  result += f"Traitement du fichier {taskInfo['current_file']} en cours...\n"
 
 
625
  if task == "classify_teachings":
626
  if key == "status":
627
  for key, value in taskInfo['classified_teachings'].items():
628
  result += f"\n\n-**Enseignement classé dans la catégorie '{key}'** : "
 
 
629
  for enseignement in value:
630
  result += f"{enseignement}, "
 
 
631
  result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
 
 
632
  if task == "create_categories":
633
  if key == "status":
634
  result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
 
 
635
  if task == "create_learning_situations":
636
  if key == "status":
637
  if taskInfo['learning_situations'].items():
638
  for key, value in taskInfo['learning_situations'].items():
639
  result += f"\n\n-**Situation d'apprentissage créée pour la catégorie '{key}'** : {value}\n"
 
 
640
  result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
 
 
641
  else:
642
  result += f"\n\nTraitement de la tâche : pas de situations d'apprentissage créées\n"
 
 
643
  if task == "create_academic_competencies":
644
  if key == "dataframe":
645
  df = taskInfo['dataframe']
646
  if key == "status":
647
  if taskInfo['academic_competencies'].items():
648
  for key, value in taskInfo['academic_competencies'].items():
649
+ result += f"\n\n-**Compétence académique créée pour la catégorie '{key}'** : {value}\n"
 
 
650
  result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
 
 
651
  else:
652
  result += f"\n\nTraitement de la tâche : pas de BCC créés\n"
 
 
653
  if task == "export_to_excel_2":
654
  if key == "status":
655
  result += f"\n\nTraitement de la tâche : {taskInfo['status']}...\n"
 
 
656
 
657
  except Exception as e:
658
  print(f"Erreur lors de l'exécution du workflow: {e}")
 
774
  update_title='Chargement...',
775
  suppress_callback_exceptions=True)
776
 
 
777
  # Updating the Flask Server configuration with Secret Key to encrypt the user session cookie
778
  server.config['REMEMBER_COOKIE_DURATION'] = timedelta(seconds=3600)
779
 
 
1106
  className="g-0"
1107
  ),
1108
  html.H4(id="text-enseignement-dropdown", className="mb-3 text-success", style={"font-size": "0.7rem"}),
1109
+ dcc.Loading(dbc.Textarea(id="enseignement-dropdown", className="mb-3", style={"height":"200px", "max-height":"250px", "font-size": "0.75rem","color":"white","border":"border 1px solid rgb(67,167,255)!important", "background-color":"transparent"}),),
1110
  ], md=6),
1111
  dbc.Col([
1112
  dbc.Row(
 
1120
  className="g-0"
1121
  ),
1122
  html.H4("Choisir d'abord une maquette de formation avec propositions BCC", className="mb-3", style={"font-size": "0.7rem"}),
1123
+ dcc.Loading(dbc.Textarea(id="classification-dropdown", className="mb-3", placeholder="Choisir d'abord une maquette avec propositions BCC", style={"height":"200px", "max-height":"250px", "font-size": "0.75rem","color":"white","border":"border 1px solid rgb(67,167,255)!important", "background-color":"transparent"}),),
1124
  ], md=6)
1125
  ]),
1126
  dbc.Row([
 
1136
  className="g-0"
1137
  ),
1138
  html.H4("Choisir d'abord une maquette de formation avec propositions BCC", className="mb-3", style={"font-size": "0.7rem"}),
1139
+ dcc.Loading(dbc.Textarea(id="situation-dropdown", className="mb-3", placeholder="Choisir d'abord une maquette avec propositions BCC", style={"height":"200px", "max-height":"250px", "font-size": "0.75rem","color":"white","border":"border 1px solid rgb(67,167,255)!important", "background-color":"transparent"}),),
1140
  ], md=6),
1141
  dbc.Col([
1142
  dbc.Row(
 
1264
  align="left",
1265
  className="g-0"
1266
  ),
1267
+ dcc.Loading(html.Div(id='output-response', style={"color":"rgb(90, 242, 156)","border-radius":"3px","border":"1px solid rgb(255,255,255)!important","background-color":"rgba(90, 242, 156, 0.2)","padding":"5px"}),),
1268
+
 
1269
  ], width=12)
1270
  ])
1271
  ], className="mt-5")],
 
1646
  align="left",
1647
  className="g-0"
1648
  ),
1649
+ dcc.Loading(html.Div(id='output-response-avid', style={"color":"rgb(156, 242, 242)","border-radius":"3px","border":"1px solid rgb(255,255,255)!important","background-color":"rgba(156, 242, 242, 0.2)","padding":"5px"}),),
1650
+
 
1651
  ], width=12)
1652
  ])
1653
  ], className="mt-5")],
 
2185
  # You could also return a 404 "URL not found" page here
2186
  return view, url
2187
 
 
 
 
 
 
 
 
 
 
2188
  @callback(
2189
  Output("output-response", "children"),
 
2190
  Input("num-bcc", "value"),
2191
  Input("maquette-dropdown", "value"),
2192
  Input("submit-button", "n_clicks"),
 
2193
  State("url", "pathname"),
 
2194
  prevent_initial_call=True,
2195
  )
2196
+ def display_status(num, current, n_clicks, pathname):
2197
+ if not n_clicks:
2198
+ return no_update
2199
 
2200
  if not current:
2201
  print(f"Erreur: Il n'y a pas de fichier dans le répertoire.")
2202
+ return no_update
2203
  if not num:
2204
  print(f"Erreur: Il n'y a pas de nombre de BCC à générer.")
2205
+ return no_update
2206
 
2207
  current_url = current
2208
 
2209
  print(f"Fichier Maquette sélectionné: {current_url}")
2210
+ agent = init_agent_state(current_url, num, pathname)
2211
  try:
2212
  df = agent[0]
2213
  result = agent[1]
2214
+ return html.Div(children=[dbc.Table.from_dataframe(df[["diplome", "RNCP", "Année d'étude", "Semestre", "BCC", "UE", "ECUE","exemple_situation_apprentissage"]], striped=True, bordered=True, hover=True, index=False), dcc.Markdown(f"""{result}""", style={"color":"white","font-size":"0.75rem"})])
2215
  except:
2216
+ return html.Div(dcc.Markdown(f"""{agent}""", style={"color":"white","font-size":"0.75rem"}))
2217
 
2218
  @callback(
2219
  Output("output-response-avid", "children"),
 
2220
  Input("num-bcc-avid", "value"),
2221
  Input("maquette-dropdown-avid", "value"),
2222
  Input("submit-button-avid", "n_clicks"),
 
2223
  State("url", "pathname"),
 
2224
  prevent_initial_call=True,
2225
  )
2226
+ def display_status(num, current, n_clicks, pathname):
2227
+ if not n_clicks:
2228
+ return no_update
2229
 
2230
  if not current:
2231
  print(f"Erreur: Il n'y a pas de fichier dans le répertoire.")
2232
+ return no_update
2233
  if not num:
2234
  print(f"Erreur: Il n'y a pas de nombre de BCC à générer.")
2235
+ return no_update
2236
 
2237
  current_url = current
2238
 
2239
  print(f"Fichier Maquette sélectionné: {current_url}")
2240
 
2241
+ agent = init_agent_state(current_url, num, pathname)
2242
  try:
2243
  df = agent[0]
2244
  result = agent[1]
2245
+ return html.Div(children=[dbc.Table.from_dataframe(df[["diplome", "RNCP", "Année d'étude", "Semestre", "BCC", "UE", "ECUE","exemple_situation_apprentissage"]], striped=True, bordered=True, hover=True, index=False), dcc.Markdown(f"""{result}""", style={"color":"white","font-size":"0.75rem"})])
2246
  except:
2247
+ return html.Div(dcc.Markdown(f"""{agent}""", style={"color":"white","font-size":"0.75rem"}))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2248
 
2249
  if __name__ == '__main__':
2250
  app.run_server(debug=True)