From 27da01c53cd2d5578b0d768346f21be2e49216fd Mon Sep 17 00:00:00 2001 From: Victor Garcia Reolid Date: Wed, 24 Apr 2024 23:24:18 +0200 Subject: [PATCH] Add flag to filter the data with a source in its latest version. Signed-off-by: Victor Garcia Reolid --- .../data/models/reporting/pandas_reporter.py | 17 ++++++++++++++++- .../data/schemas/reporting/pandas_reporter.py | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/flexmeasures/data/models/reporting/pandas_reporter.py b/flexmeasures/data/models/reporting/pandas_reporter.py index 3f4afb203..49193bc3e 100644 --- a/flexmeasures/data/models/reporting/pandas_reporter.py +++ b/flexmeasures/data/models/reporting/pandas_reporter.py @@ -3,6 +3,7 @@ from typing import Any from datetime import datetime, timedelta from copy import deepcopy, copy +from packaging.version import Version from flask import current_app import timely_beliefs as tb @@ -38,6 +39,7 @@ def fetch_data( input: dict, resolution: timedelta | None = None, belief_time: datetime | None = None, + use_latest_version_only: bool = False, ): """ Fetches the time_beliefs from the database @@ -58,12 +60,22 @@ def fetch_data( event_ends_before = _input_search_parameters.pop("event_ends_before", end) resolution = _input_search_parameters.pop("resolution", resolution) belief_time = _input_search_parameters.pop("belief_time", belief_time) + sources = None + + if use_latest_version_only: + sources = sensor.data_sources + if len(sources) > 0: + sources = max( + sources, + key=lambda x: Version(x.version if x.version else "0.0.0"), + ) bdf = sensor.search_beliefs( event_starts_after=event_starts_after, event_ends_before=event_ends_before, resolution=resolution, beliefs_before=belief_time, + source=sources, **_input_search_parameters, ) @@ -89,13 +101,16 @@ def _compute_report(self, **kwargs) -> list[dict[str, Any]]: belief_time: datetime | None = kwargs.get("belief_time", None) belief_horizon: timedelta | None = kwargs.get("belief_horizon", None) output: list[dict[str, Any]] = kwargs.get("output") + use_latest_version_only: bool = kwargs.get("use_latest_version_only", False) # by default, use the minimum resolution among the input sensors if resolution is None: resolution = min([i["sensor"].event_resolution for i in input]) # fetch sensor data - self.fetch_data(start, end, input, resolution, belief_time) + self.fetch_data( + start, end, input, resolution, belief_time, use_latest_version_only + ) if belief_time is None: belief_time = server_now() diff --git a/flexmeasures/data/schemas/reporting/pandas_reporter.py b/flexmeasures/data/schemas/reporting/pandas_reporter.py index 6dcac010f..956b132ff 100644 --- a/flexmeasures/data/schemas/reporting/pandas_reporter.py +++ b/flexmeasures/data/schemas/reporting/pandas_reporter.py @@ -139,6 +139,7 @@ class PandasReporterParametersSchema(ReporterParametersSchema): # for the single sensors in `input_variables` start = AwareDateTimeField(required=False) end = AwareDateTimeField(required=False) + use_latest_version_only = fields.Bool(required=False, defaul=False) @validates_schema def validate_time_parameters(self, data, **kwargs):