diff options
Diffstat (limited to 'resources/tools/dash')
-rw-r--r-- | resources/tools/dash/app/pal/data/url_processing.py | 2 | ||||
-rw-r--r-- | resources/tools/dash/app/pal/trending/layout.py | 149 |
2 files changed, 118 insertions, 33 deletions
diff --git a/resources/tools/dash/app/pal/data/url_processing.py b/resources/tools/dash/app/pal/data/url_processing.py index e74eb41689..22cd034dfd 100644 --- a/resources/tools/dash/app/pal/data/url_processing.py +++ b/resources/tools/dash/app/pal/data/url_processing.py @@ -29,7 +29,7 @@ def url_encode(params: dict) -> str: url_params = params.get("params", None) if url_params: encoded_params = urlsafe_b64encode( - compress(urlencode(url_params).encode("utf-8")) + compress(urlencode(url_params).encode("utf-8"), level=9) ).rstrip(b"=").decode("utf-8") else: encoded_params = str() diff --git a/resources/tools/dash/app/pal/trending/layout.py b/resources/tools/dash/app/pal/trending/layout.py index 43a3786008..6b68070bde 100644 --- a/resources/tools/dash/app/pal/trending/layout.py +++ b/resources/tools/dash/app/pal/trending/layout.py @@ -28,10 +28,12 @@ from yaml import load, FullLoader, YAMLError from datetime import datetime, timedelta from copy import deepcopy from json import loads, JSONDecodeError +from ast import literal_eval from ..data.data import Data from .graphs import graph_trending, graph_hdrh_latency, \ select_trending_data +from ..data.url_processing import url_decode, url_encode class Layout: @@ -284,12 +286,9 @@ class Layout: id="row-main", class_name="g-0", children=[ - dcc.Store( - id="selected-tests" - ), - dcc.Store( - id="control-panel" - ), + dcc.Store(id="selected-tests"), + dcc.Store(id="control-panel"), + dcc.Location(id="url", refresh=False), self._add_ctrl_col(), self._add_plotting_col(), ] @@ -736,13 +735,17 @@ class Layout: else: return list() + @staticmethod + def _get_date(s_date: str) -> datetime: + return datetime(int(s_date[0:4]), int(s_date[5:7]), int(s_date[8:10])) + def callbacks(self, app): - def _generate_plotting_arrea(args: tuple) -> tuple: + def _generate_plotting_area(figs: tuple, url: str) -> tuple: """ """ - (fig_tput, fig_lat) = args + (fig_tput, fig_lat) = figs row_fig_tput = self.PLACEHOLDER row_fig_lat = self.PLACEHOLDER @@ -756,16 +759,39 @@ class Layout: ) ] row_btn_dwnld = [ - dcc.Loading(children=[ - dbc.Button( - id="btn-download-data", - children=self._show_tooltip( - "help-download", "Download"), - class_name="me-1", - color="info" - ), - dcc.Download(id="download-data") - ]), + dbc.Col( # Download + width=2, + children=[ + dcc.Loading(children=[ + dbc.Button( + id="btn-download-data", + children=self._show_tooltip( + "help-download", "Download"), + class_name="me-1", + color="info" + ), + dcc.Download(id="download-data") + ]), + ] + ), + dbc.Col( # Show URL + width=10, + children=[ + dbc.Card( + id="card-url", + body=True, + class_name="gy-2 p-0", + children=[ + dcc.Clipboard( + target_id="card-url", + title="Copy URL", + style={"display": "inline-block"} + ), + url + ] + ), + ] + ) ] if fig_lat: row_fig_lat = [ @@ -827,19 +853,43 @@ class Layout: Input("dpr-period", "end_date"), Input("btn-sel-remove", "n_clicks"), Input("btn-sel-remove-all", "n_clicks"), + Input("url", "href") ) def _update_ctrl_panel(cp_data: dict, store_sel: list, list_sel: list, dd_dut: str, dd_phy: str, dd_area: str, dd_test: str, cl_core: list, cl_core_all: list, cl_framesize: list, cl_framesize_all: list, cl_testtype: list, cl_testtype_all: list, btn_add: int, d_start: str, d_end: str, btn_remove: int, - btn_remove_all: int) -> tuple: + btn_remove_all: int, href: str) -> tuple: """ """ - d_start = datetime(int(d_start[0:4]), int(d_start[5:7]), - int(d_start[8:10])) - d_end = datetime(int(d_end[0:4]), int(d_end[5:7]), int(d_end[8:10])) + def _gen_new_url(parsed_url: dict, store_sel: list, + start: datetime, end: datetime) -> str: + + if parsed_url: + new_url = url_encode({ + "scheme": parsed_url["scheme"], + "netloc": parsed_url["netloc"], + "path": parsed_url["path"], + "params": { + "store_sel": store_sel, + "start": start, + "end": end + } + }) + else: + new_url = str() + return new_url + + + ctrl_panel = self.ControlPanel(cp_data) + + d_start = self._get_date(d_start) + d_end = self._get_date(d_end) + + # Parse the url: + parsed_url = url_decode(href) row_fig_tput = no_update row_fig_lat = no_update @@ -847,8 +897,6 @@ class Layout: row_card_sel_tests = no_update row_btns_sel_tests = no_update - ctrl_panel = self.ControlPanel(cp_data) - trigger_id = callback_context.triggered[0]["prop_id"].split(".")[0] if trigger_id == "dd-ctrl-dut": @@ -887,7 +935,7 @@ class Layout: "cl-ctrl-testtype-all-value": list(), "cl-ctrl-testtype-all-options": self.CL_ALL_DISABLED, }) - if trigger_id == "dd-ctrl-phy": + elif trigger_id == "dd-ctrl-phy": try: dut = ctrl_panel.get("dd-ctrl-dut-value") options = sorted( @@ -1097,18 +1145,20 @@ class Layout: "cl-selected-options": self._list_tests(store_sel) }) row_fig_tput, row_fig_lat, row_btn_dwnld = \ - _generate_plotting_arrea( + _generate_plotting_area( graph_trending( self.data, store_sel, self.layout, d_start, d_end - ) + ), + _gen_new_url(parsed_url, store_sel, d_start, d_end) ) elif trigger_id == "dpr-period": row_fig_tput, row_fig_lat, row_btn_dwnld = \ - _generate_plotting_arrea( + _generate_plotting_area( graph_trending( self.data, store_sel, self.layout, d_start, d_end - ) + ), + _gen_new_url(parsed_url, store_sel, d_start, d_end) ) elif trigger_id == "btn-sel-remove-all": _ = btn_remove_all @@ -1131,11 +1181,12 @@ class Layout: store_sel = new_store_sel if store_sel: row_fig_tput, row_fig_lat, row_btn_dwnld = \ - _generate_plotting_arrea( + _generate_plotting_area( graph_trending( self.data, store_sel, self.layout, d_start, d_end - ) + ), + _gen_new_url(parsed_url, store_sel, d_start, d_end) ) ctrl_panel.set({ "cl-selected-options": self._list_tests(store_sel) @@ -1148,8 +1199,42 @@ class Layout: row_btns_sel_tests = self.STYLE_DISABLED store_sel = list() ctrl_panel.set({ - "cl-selected-options": list() + "cl-selected-options": list() }) + elif trigger_id == "url": + # TODO: Add verification + url_params = parsed_url["params"] + if url_params: + store_sel = literal_eval( + url_params.get("store_sel", list())[0]) + d_start = self._get_date(url_params.get("start", list())[0]) + d_end = self._get_date(url_params.get("end", list())[0]) + if store_sel: + row_fig_tput, row_fig_lat, row_btn_dwnld = \ + _generate_plotting_area( + graph_trending( + self.data, store_sel, self.layout, d_start, + d_end + ), + _gen_new_url( + parsed_url, store_sel, d_start, d_end + ) + ) + row_card_sel_tests = self.STYLE_ENABLED + row_btns_sel_tests = self.STYLE_ENABLED + ctrl_panel.set({ + "cl-selected-options": self._list_tests(store_sel) + }) + else: + row_fig_tput = self.PLACEHOLDER + row_fig_lat = self.PLACEHOLDER + row_btn_dwnld = self.PLACEHOLDER + row_card_sel_tests = self.STYLE_DISABLED + row_btns_sel_tests = self.STYLE_DISABLED + store_sel = list() + ctrl_panel.set({ + "cl-selected-options": list() + }) if ctrl_panel.get("cl-ctrl-core-value") and \ ctrl_panel.get("cl-ctrl-framesize-value") and \ |