From 3a460d76e0d7ee866e28d94026be004ca0c248d0 Mon Sep 17 00:00:00 2001 From: "F.N. Claessen" Date: Thu, 21 Jul 2022 19:39:58 +0200 Subject: [PATCH 1/5] Remember selected time range in session for the sensor page Signed-off-by: F.N. Claessen --- flexmeasures/api/dev/sensors.py | 2 ++ flexmeasures/ui/templates/views/sensors.html | 27 +++++++++++++++----- flexmeasures/ui/utils/view_utils.py | 2 ++ flexmeasures/ui/views/sensors.py | 4 ++- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/flexmeasures/api/dev/sensors.py b/flexmeasures/api/dev/sensors.py index 0a48c20ef..bbedcb0c9 100644 --- a/flexmeasures/api/dev/sensors.py +++ b/flexmeasures/api/dev/sensors.py @@ -18,6 +18,7 @@ from flexmeasures.data.models.generic_assets import GenericAsset from flexmeasures.data.models.time_series import Sensor from flexmeasures.data.services.annotations import prepare_annotations_for_chart +from flexmeasures.ui.utils.view_utils import set_time_range_for_session class SensorAPI(FlaskView): @@ -55,6 +56,7 @@ def get_chart(self, id: int, sensor: Sensor, **kwargs): .. :quickref: Chart; Download a chart with time series """ + set_time_range_for_session() return json.dumps(sensor.chart(**kwargs)) @route("//chart_data/") diff --git a/flexmeasures/ui/templates/views/sensors.html b/flexmeasures/ui/templates/views/sensors.html index 38a2ca449..5c06332b1 100644 --- a/flexmeasures/ui/templates/views/sensors.html +++ b/flexmeasures/ui/templates/views/sensors.html @@ -154,13 +154,26 @@ start.setHours(0,0,0,0) // get start of first day end.setHours(0,0,0,0) // get start of last day - // Initialize picker to the last 2 days of sensor data - var nearEnd = new Date(end)//.setDate(end.getDate() - 1) - nearEnd.setDate(nearEnd.getDate() - 1) - picker.setDateRange( - nearEnd, - end, - ); + {% if event_starts_after and event_ends_before %} + // Initialize picker to the date selection specified in the session + var sessionStart = new Date('{{ event_starts_after }}'); + var sessionEnd = new Date('{{ event_ends_before }}') + sessionEnd.setSeconds(sessionEnd.getSeconds() - 1); // -1 second in case most recent event ends at midnight + sessionStart.setHours(0,0,0,0) // get start of first day + sessionEnd.setHours(0,0,0,0) // get start of last day + picker.setDateRange( + sessionStart, + sessionEnd, + ); + {% else %} + // Initialize picker to the last 2 days of sensor data + var nearEnd = new Date(end)//.setDate(end.getDate() - 1) + nearEnd.setDate(nearEnd.getDate() - 1) + picker.setDateRange( + nearEnd, + end, + ); + {% endif %} // No use looking for data in years outside timerange of sensor data picker.setOptions({ diff --git a/flexmeasures/ui/utils/view_utils.py b/flexmeasures/ui/utils/view_utils.py index 709cec52d..a28175e5d 100644 --- a/flexmeasures/ui/utils/view_utils.py +++ b/flexmeasures/ui/utils/view_utils.py @@ -129,6 +129,8 @@ def set_time_range_for_session(): ): # session storage seems to lose tz info and becomes UTC session["start_time"] = time_utils.as_server_time(session["start_time"]) + session["event_starts_after"] = request.values.get("event_starts_after") + session["event_ends_before"] = request.values.get("event_ends_before") if "end_time" in request.values: session["end_time"] = time_utils.localized_datetime( iso8601.parse_date(request.values.get("end_time")) diff --git a/flexmeasures/ui/views/sensors.py b/flexmeasures/ui/views/sensors.py index 016fd168c..7edfed360 100644 --- a/flexmeasures/ui/views/sensors.py +++ b/flexmeasures/ui/views/sensors.py @@ -1,7 +1,7 @@ import json from altair.utils.html import spec_to_html -from flask import current_app +from flask import current_app, session from flask_classful import FlaskView, route from flask_security import auth_required, login_required from marshmallow import fields @@ -69,5 +69,7 @@ def get(self, id: int): return render_flexmeasures_template( "views/sensors.html", sensor_id=id, + event_starts_after=session.get("event_starts_after"), + event_ends_before=session.get("event_ends_before"), msg="", ) From 2861061d20d1e6ec2d17c43b08ea65ed36c29e9a Mon Sep 17 00:00:00 2001 From: "F.N. Claessen" Date: Thu, 21 Jul 2022 19:47:51 +0200 Subject: [PATCH 2/5] Remember selected time range in session for the asset page, too Signed-off-by: F.N. Claessen --- flexmeasures/api/v3_0/assets.py | 2 ++ flexmeasures/ui/crud/assets.py | 4 +++- flexmeasures/ui/templates/crud/asset.html | 27 +++++++++++++++++------ 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/flexmeasures/api/v3_0/assets.py b/flexmeasures/api/v3_0/assets.py index 641201774..d574ff924 100644 --- a/flexmeasures/api/v3_0/assets.py +++ b/flexmeasures/api/v3_0/assets.py @@ -15,6 +15,7 @@ from flexmeasures.data.schemas.generic_assets import GenericAssetSchema as AssetSchema from flexmeasures.api.common.schemas.generic_assets import AssetIdField from flexmeasures.api.common.schemas.users import AccountIdField +from flexmeasures.ui.utils.view_utils import set_time_range_for_session asset_schema = AssetSchema() @@ -282,6 +283,7 @@ def get_chart(self, id: int, asset: GenericAsset, **kwargs): .. :quickref: Chart; Download a chart with time series """ + set_time_range_for_session() return json.dumps(asset.chart(**kwargs)) @route("//chart_data/") diff --git a/flexmeasures/ui/crud/assets.py b/flexmeasures/ui/crud/assets.py index a49339d97..486069c2f 100644 --- a/flexmeasures/ui/crud/assets.py +++ b/flexmeasures/ui/crud/assets.py @@ -1,7 +1,7 @@ from typing import Union, Optional, List, Tuple import copy -from flask import url_for, current_app +from flask import url_for, current_app, session from flask_classful import FlaskView from flask_wtf import FlaskForm from flask_security import login_required, current_user @@ -237,6 +237,8 @@ def get(self, id: str): asset=asset, asset_form=asset_form, msg="", + event_starts_after=session.get("event_starts_after"), + event_ends_before=session.get("event_ends_before"), latest_measurement_time_str=latest_measurement_time_str, asset_plot_html=asset_plot_html, mapboxAccessToken=current_app.config.get("MAPBOX_ACCESS_TOKEN", ""), diff --git a/flexmeasures/ui/templates/crud/asset.html b/flexmeasures/ui/templates/crud/asset.html index 66d6904dd..a53655aea 100644 --- a/flexmeasures/ui/templates/crud/asset.html +++ b/flexmeasures/ui/templates/crud/asset.html @@ -279,13 +279,26 @@

All sensors for {{ asset.name }}

start.setHours(0,0,0,0) // get start of first day end.setHours(0,0,0,0) // get start of last day - // Initialize picker to the last 2 days of sensor data - var nearEnd = new Date(end)//.setDate(end.getDate() - 1) - nearEnd.setDate(nearEnd.getDate() - 1) - picker.setDateRange( - nearEnd, - end, - ); + {% if event_starts_after and event_ends_before %} + // Initialize picker to the date selection specified in the session + var sessionStart = new Date('{{ event_starts_after }}'); + var sessionEnd = new Date('{{ event_ends_before }}') + sessionEnd.setSeconds(sessionEnd.getSeconds() - 1); // -1 second in case most recent event ends at midnight + sessionStart.setHours(0,0,0,0) // get start of first day + sessionEnd.setHours(0,0,0,0) // get start of last day + picker.setDateRange( + sessionStart, + sessionEnd, + ); + {% else %} + // Initialize picker to the last 2 days of sensor data + var nearEnd = new Date(end)//.setDate(end.getDate() - 1) + nearEnd.setDate(nearEnd.getDate() - 1) + picker.setDateRange( + nearEnd, + end, + ); + {% endif %} // No use looking for data in years outside timerange of sensor data picker.setOptions({ From 3d15c9da02e1c7a3eef5df8d60b11a4341c51137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20H=C3=B6ning?= Date: Sat, 23 Jul 2022 13:08:08 +0200 Subject: [PATCH 3/5] comment on deprecation opportunities in the changed function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Nicolas Höning --- flexmeasures/ui/utils/view_utils.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/flexmeasures/ui/utils/view_utils.py b/flexmeasures/ui/utils/view_utils.py index a28175e5d..6c4092f6c 100644 --- a/flexmeasures/ui/utils/view_utils.py +++ b/flexmeasures/ui/utils/view_utils.py @@ -113,10 +113,17 @@ def clear_session(): def set_time_range_for_session(): - """Set period (start_date, end_date and resolution) on session if they are not yet set. - The datepicker sends times as tz-aware UTC strings. + """Set period on session if they are not yet set. + The daterangepicker sends times as tz-aware UTC strings. We re-interpret them as being in the server's timezone. - Also set the forecast horizon, if given.""" + Also set the forecast horizon, if given. + + TODO: event_[stars|ends]_before are used on the new asset and sensor pages. + We simply store the UTC strings. + It might be that the other settings & logic can be deprecated when we clean house. + Tip: grep for timerangeEnd, where end_time is used in our base template, + and then used in the daterangepicker. We seem to use litepicker now. + """ if "start_time" in request.values: session["start_time"] = time_utils.localized_datetime( iso8601.parse_date(request.values.get("start_time")) From 88f1b4f9908e5180adc5ac64f330a9e658045082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20H=C3=B6ning?= Date: Sat, 23 Jul 2022 14:46:57 +0200 Subject: [PATCH 4/5] handle the new variables on all pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Nicolas Höning --- flexmeasures/ui/utils/view_utils.py | 3 +++ flexmeasures/ui/views/sensors.py | 4 +--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/flexmeasures/ui/utils/view_utils.py b/flexmeasures/ui/utils/view_utils.py index 6c4092f6c..6004370e2 100644 --- a/flexmeasures/ui/utils/view_utils.py +++ b/flexmeasures/ui/utils/view_utils.py @@ -47,6 +47,9 @@ def render_flexmeasures_template(html_filename: str, **variables): if "end_time" in session: variables["end_time"] = session["end_time"] + variables["event_starts_after"] = session.get("event_starts_after") + variables["event_ends_before"] = session.get("event_ends_before") + variables["page"] = html_filename.split("/")[-1].replace(".html", "") if "show_datepicker" not in variables: variables["show_datepicker"] = variables["page"] in ("analytics", "portfolio") diff --git a/flexmeasures/ui/views/sensors.py b/flexmeasures/ui/views/sensors.py index 7edfed360..016fd168c 100644 --- a/flexmeasures/ui/views/sensors.py +++ b/flexmeasures/ui/views/sensors.py @@ -1,7 +1,7 @@ import json from altair.utils.html import spec_to_html -from flask import current_app, session +from flask import current_app from flask_classful import FlaskView, route from flask_security import auth_required, login_required from marshmallow import fields @@ -69,7 +69,5 @@ def get(self, id: int): return render_flexmeasures_template( "views/sensors.html", sensor_id=id, - event_starts_after=session.get("event_starts_after"), - event_ends_before=session.get("event_ends_before"), msg="", ) From 091dbd9b2e04910184a0860f81b3b6926b9966fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20H=C3=B6ning?= Date: Sat, 23 Jul 2022 15:22:18 +0200 Subject: [PATCH 5/5] remove two more lines we handle in render_flexmeasures_template now MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Nicolas Höning --- flexmeasures/ui/crud/assets.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/flexmeasures/ui/crud/assets.py b/flexmeasures/ui/crud/assets.py index 486069c2f..a49339d97 100644 --- a/flexmeasures/ui/crud/assets.py +++ b/flexmeasures/ui/crud/assets.py @@ -1,7 +1,7 @@ from typing import Union, Optional, List, Tuple import copy -from flask import url_for, current_app, session +from flask import url_for, current_app from flask_classful import FlaskView from flask_wtf import FlaskForm from flask_security import login_required, current_user @@ -237,8 +237,6 @@ def get(self, id: str): asset=asset, asset_form=asset_form, msg="", - event_starts_after=session.get("event_starts_after"), - event_ends_before=session.get("event_ends_before"), latest_measurement_time_str=latest_measurement_time_str, asset_plot_html=asset_plot_html, mapboxAccessToken=current_app.config.get("MAPBOX_ACCESS_TOKEN", ""),