From 3c421a0c9690b782f299946903a928632cb36f52 Mon Sep 17 00:00:00 2001 From: Tibor Frank Date: Wed, 27 Apr 2022 13:39:07 +0200 Subject: [PATCH] feat(uti): Add constant TIME_PERIOD It defines the time period from now back to the past from which data is raed to dataframes. Change-Id: Ic6feeb8e7958d69aa2e39922b48e9898e09b45dd Signed-off-by: Tibor Frank --- resources/tools/dash/app/pal/__init__.py | 21 ++++++++++++-- resources/tools/dash/app/pal/stats/layout.py | 27 +++++++++++++---- resources/tools/dash/app/pal/stats/stats.py | 5 ++-- resources/tools/dash/app/pal/trending/layout.py | 35 +++++++++++++++++------ resources/tools/dash/app/pal/trending/trending.py | 5 ++-- 5 files changed, 73 insertions(+), 20 deletions(-) diff --git a/resources/tools/dash/app/pal/__init__.py b/resources/tools/dash/app/pal/__init__.py index ba68c017a1..4e32598147 100644 --- a/resources/tools/dash/app/pal/__init__.py +++ b/resources/tools/dash/app/pal/__init__.py @@ -20,6 +20,17 @@ from flask import Flask from flask_assets import Environment +# Maximal value of TIME_PERIOD in days. +# Do not change without a good reason. +MAX_TIME_PERIOD = 180 + +# It defines the time period in days from now back to the past from which data +# is read to dataframes. +# TIME_PERIOD = None means all data (max MAX_TIME_PERIOD days) is read. +# TIME_PERIOD = MAX_TIME_PERIOD is the default value +TIME_PERIOD = MAX_TIME_PERIOD # [days] + + def init_app(): """Construct core Flask application with embedded Dash app. """ @@ -42,13 +53,19 @@ def init_app(): assets = Environment() assets.init_app(app) + if TIME_PERIOD is None or TIME_PERIOD > MAX_TIME_PERIOD: + time_period = MAX_TIME_PERIOD + else: + time_period = TIME_PERIOD + # Import Dash applications. from .stats.stats import init_stats - app = init_stats(app) + app = init_stats(app, time_period=time_period) from .trending.trending import init_trending - app = init_trending(app) + app = init_trending(app, time_period=time_period) return app + app = init_app() diff --git a/resources/tools/dash/app/pal/stats/layout.py b/resources/tools/dash/app/pal/stats/layout.py index 0ae83cf3a4..0c5c22e81b 100644 --- a/resources/tools/dash/app/pal/stats/layout.py +++ b/resources/tools/dash/app/pal/stats/layout.py @@ -17,6 +17,7 @@ import pandas as pd import dash_bootstrap_components as dbc +from flask import Flask from dash import dcc from dash import html from dash import callback_context, no_update @@ -33,8 +34,9 @@ class Layout: """ """ - def __init__(self, app, html_layout_file, spec_file, graph_layout_file, - data_spec_file): + def __init__(self, app: Flask, html_layout_file: str, spec_file: str, + graph_layout_file: str, data_spec_file: str, + time_period: int=None) -> None: """ """ @@ -44,12 +46,13 @@ class Layout: self._spec_file = spec_file self._graph_layout_file = graph_layout_file self._data_spec_file = data_spec_file + self._time_period = time_period # Read the data: data_stats, data_mrr, data_ndrpdr = Data( data_spec_file=self._data_spec_file, debug=True - ).read_stats() + ).read_stats(days=self._time_period) df_tst_info = pd.concat([data_mrr, data_ndrpdr], ignore_index=True) @@ -59,6 +62,11 @@ class Layout: data_stats = data_stats[~data_stats.job.str.contains("-iterative-")] data_stats = data_stats[["job", "build", "start_time", "duration"]] + data_time_period = \ + (datetime.utcnow() - data_stats["start_time"].min()).days + if self._time_period > data_time_period: + self._time_period = data_time_period + self._jobs = sorted(list(data_stats["job"].unique())) tst_info = { @@ -144,6 +152,10 @@ class Layout: def jobs(self) -> list: return self._jobs + @property + def time_period(self): + return self._time_period + def add_content(self): """ """ @@ -160,7 +172,7 @@ class Layout: ), dcc.Loading( dbc.Offcanvas( - class_name="w-50", + class_name="w-25", id="offcanvas-metadata", title="Detailed Information", placement="end", @@ -302,10 +314,13 @@ class Layout: id="dpr-period", className="d-flex justify-content-center", min_date_allowed=\ - datetime.utcnow()-timedelta(days=180), + datetime.utcnow() - timedelta( + days=self.time_period), max_date_allowed=datetime.utcnow(), initial_visible_month=datetime.utcnow(), - start_date=datetime.utcnow() - timedelta(days=180), + start_date=\ + datetime.utcnow() - timedelta( + days=self.time_period), end_date=datetime.utcnow(), display_format="D MMMM YY" ) diff --git a/resources/tools/dash/app/pal/stats/stats.py b/resources/tools/dash/app/pal/stats/stats.py index 78bb6e6f88..d733e0ca81 100644 --- a/resources/tools/dash/app/pal/stats/stats.py +++ b/resources/tools/dash/app/pal/stats/stats.py @@ -19,7 +19,7 @@ import dash_bootstrap_components as dbc from .layout import Layout -def init_stats(server): +def init_stats(server, time_period=None): """Create a Plotly Dash dashboard. :param server: Flask server. @@ -40,7 +40,8 @@ def init_stats(server): html_layout_file="pal/templates/stats_layout.jinja2", spec_file="pal/stats/spec_job_selection.yaml", graph_layout_file="pal/stats/layout.yaml", - data_spec_file="pal/data/data.yaml" + data_spec_file="pal/data/data.yaml", + time_period=time_period ) dash_app.index_string = layout.html_layout dash_app.layout = layout.add_content() diff --git a/resources/tools/dash/app/pal/trending/layout.py b/resources/tools/dash/app/pal/trending/layout.py index fa5f8218ad..470f72ef22 100644 --- a/resources/tools/dash/app/pal/trending/layout.py +++ b/resources/tools/dash/app/pal/trending/layout.py @@ -17,6 +17,7 @@ import pandas as pd import dash_bootstrap_components as dbc +from flask import Flask from dash import dcc from dash import html from dash import callback_context, no_update, ALL @@ -52,8 +53,9 @@ class Layout: PLACEHOLDER = html.Nobr("") - def __init__(self, app, html_layout_file, spec_file, graph_layout_file, - data_spec_file): + def __init__(self, app: Flask, html_layout_file: str, spec_file: str, + graph_layout_file: str, data_spec_file: str, + time_period: str=None) -> None: """ """ @@ -63,20 +65,26 @@ class Layout: self._spec_file = spec_file self._graph_layout_file = graph_layout_file self._data_spec_file = data_spec_file + self._time_period = time_period # Read the data: data_mrr = Data( data_spec_file=self._data_spec_file, debug=True - ).read_trending_mrr() + ).read_trending_mrr(days=self._time_period) data_ndrpdr = Data( data_spec_file=self._data_spec_file, debug=True - ).read_trending_ndrpdr() + ).read_trending_ndrpdr(days=self._time_period) self._data = pd.concat([data_mrr, data_ndrpdr], ignore_index=True) + data_time_period = \ + (datetime.utcnow() - self._data["start_time"].min()).days + if self._time_period > data_time_period: + self._time_period = data_time_period + # Read from files: self._html_layout = "" self._spec_tbs = None @@ -139,6 +147,10 @@ class Layout: def layout(self): return self._graph_layout + @property + def time_period(self): + return self._time_period + def add_content(self): """ """ @@ -273,9 +285,13 @@ class Layout: dbc.InputGroupText("Infra"), dbc.Select( id="dd-ctrl-phy", - placeholder="Select a Physical Test Bed Topology...", + placeholder=( + "Select a Physical Test Bed " + "Topology..." + ), options=[ - {"label": k, "value": k} for k in self.spec_tbs.keys() + {"label": k, "value": k} \ + for k in self.spec_tbs.keys() ], ), ], @@ -431,10 +447,13 @@ class Layout: id="dpr-period", className="d-flex justify-content-center", min_date_allowed=\ - datetime.utcnow()-timedelta(days=180), + datetime.utcnow() - timedelta( + days=self.time_period), max_date_allowed=datetime.utcnow(), initial_visible_month=datetime.utcnow(), - start_date=datetime.utcnow() - timedelta(days=180), + start_date=\ + datetime.utcnow() - timedelta( + days=self.time_period), end_date=datetime.utcnow(), display_format="D MMMM YY" ) diff --git a/resources/tools/dash/app/pal/trending/trending.py b/resources/tools/dash/app/pal/trending/trending.py index 99a571315a..8cd52b5c3f 100644 --- a/resources/tools/dash/app/pal/trending/trending.py +++ b/resources/tools/dash/app/pal/trending/trending.py @@ -19,7 +19,7 @@ import dash_bootstrap_components as dbc from .layout import Layout -def init_trending(server): +def init_trending(server, time_period=None): """Create a Plotly Dash dashboard. :param server: Flask server. @@ -40,7 +40,8 @@ def init_trending(server): html_layout_file="pal/templates/trending_layout.jinja2", spec_file="pal/trending/spec_test_selection.yaml", graph_layout_file="pal/trending/layout.yaml", - data_spec_file="pal/data/data.yaml" + data_spec_file="pal/data/data.yaml", + time_period=time_period ) dash_app.index_string = layout.html_layout dash_app.layout = layout.add_content() -- 2.16.6