diff --git a/stand/tblctrl.py b/stand/tblctrl.py index 5c956f8..0bc8166 100644 --- a/stand/tblctrl.py +++ b/stand/tblctrl.py @@ -1,7 +1,7 @@ import cherrypy as cp from utils.dfh import DateFrameHolder -from utils.st_utils import rerun +from utils.st_utils import rerunall, get_session_ids @cp.expose @@ -9,22 +9,33 @@ class TableController: def __init__(self): self.dfh = DateFrameHolder("output.h5") - self.sid = None - self.changed = True +# self.changed = True + self.sids = get_session_ids() - @property - def data(self): - self.changed = False + def get(self, sid): + changed = self.get_changed(sid) + data = self.get_data(sid) + return changed, data + + def get_changed(self, sid): + return (sid in self.sids) + + def get_data(self, sid): +# self.changed = False + try: + self.sids.remove(sid) + except KeyError as e: + if self.sids: + raise RuntimeError(f"{self.sids} is not empty") from e return self.dfh.df - @data.setter - def data(self, df): + def set_data(self, df): if self.dfh.df.equals(df): print("<<< skipping dump because dataframe did not change") return self.dfh.df = df self.dfh.dump() - + self._trigger_changed() def GET(self): return str(self.dfh.df) @@ -44,8 +55,9 @@ class TableController: def _trigger_changed(self): - self.changed = True - rerun(self.sid) +# self.changed = True + self.sids = get_session_ids() + rerunall() diff --git a/stand/webapp.py b/stand/webapp.py index 53d3f0b..1482240 100644 --- a/stand/webapp.py +++ b/stand/webapp.py @@ -24,10 +24,8 @@ st.set_page_config( hide_UI_elements() -restapi.sid = get_session_id() # rest api needs current session ID to trigger the next rerun - -changed = restapi.changed -df = restapi.data +sid = get_session_id() # rest api needs current session IDs to trigger reruns +changed, df = restapi.get(sid) download(df) @@ -77,7 +75,7 @@ response = aggrid( new_df = response["data"] if not new_df.equals(df) and not changed: - restapi.data = new_df + restapi.set_data(new_df) print(">>> end of streamlit run")