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.
"""
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()
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
"""
"""
- 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:
"""
"""
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)
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 = {
def jobs(self) -> list:
return self._jobs
+ @property
+ def time_period(self):
+ return self._time_period
+
def add_content(self):
"""
"""
),
dcc.Loading(
dbc.Offcanvas(
- class_name="w-50",
+ class_name="w-25",
id="offcanvas-metadata",
title="Detailed Information",
placement="end",
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"
)
from .layout import Layout
-def init_stats(server):
+def init_stats(server, time_period=None):
"""Create a Plotly Dash dashboard.
:param server: Flask 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()
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
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:
"""
"""
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
def layout(self):
return self._graph_layout
+ @property
+ def time_period(self):
+ return self._time_period
+
def add_content(self):
"""
"""
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()
],
),
],
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"
)
from .layout import Layout
-def init_trending(server):
+def init_trending(server, time_period=None):
"""Create a Plotly Dash dashboard.
:param server: Flask 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()