This is an automated email from the ASF dual-hosted git repository. arivero pushed a commit to branch table-time-comparison in repository https://gitbox.apache.org/repos/asf/superset.git
commit 6cdbeabe9344af5623c3df08ff1dde20879e9dcf Author: Yongjie Zhao <[email protected]> AuthorDate: Mon Mar 4 11:50:05 2024 +0100 - cherry pick 2c00cc534c5906c6b4bcf7a1e22a87021d0b88d2 --- superset/views/api.py | 33 +++++++++++++++++++++-------- tests/integration_tests/charts/api_tests.py | 17 ++++++++++++++- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/superset/views/api.py b/superset/views/api.py index 3197ed13ce..8df8b3c86b 100644 --- a/superset/views/api.py +++ b/superset/views/api.py @@ -40,7 +40,15 @@ from superset.views.base import api, BaseSupersetView, handle_api_exception if TYPE_CHECKING: from superset.common.query_context_factory import QueryContextFactory -get_time_range_schema = {"type": "string"} +get_time_range_schema = { + "type": ["string", "array"], + "items": { + "type": "object", + "properties": { + "timeRange": {"type": "string"}, + }, + }, +} get_relative_time_range_schema = { "type": "object", @@ -100,15 +108,22 @@ class Api(BaseSupersetView): @expose("/v1/time_range/", methods=("GET",)) def time_range(self, **kwargs: Any) -> FlaskResponse: """Get actually time range from human-readable string or datetime expression.""" - time_range = kwargs["rison"] + time_ranges = kwargs["rison"] try: - since, until = get_since_until(time_range) - result = { - "since": since.isoformat() if since else "", - "until": until.isoformat() if until else "", - "timeRange": time_range, - } - return self.json_response({"result": result}) + if isinstance(time_ranges, str): + time_ranges = [{"timeRange": time_ranges}] + + rv = [] + for time_range in time_ranges: + since, until = get_since_until(time_range["timeRange"]) + rv.append( + { + "since": since.isoformat() if since else "", + "until": until.isoformat() if until else "", + "timeRange": time_range["timeRange"], + } + ) + return self.json_response({"result": rv}) except (ValueError, TimeRangeParseFailError, TimeRangeAmbiguousError) as error: error_msg = {"message": _("Unexpected time range: %(error)s", error=error)} return self.json_response(error_msg, 400) diff --git a/tests/integration_tests/charts/api_tests.py b/tests/integration_tests/charts/api_tests.py index 418fb9e2a4..22bcad7c76 100644 --- a/tests/integration_tests/charts/api_tests.py +++ b/tests/integration_tests/charts/api_tests.py @@ -1471,7 +1471,22 @@ class TestChartApi(ApiOwnersTestCaseMixin, InsertChartMixin, SupersetTestCase): rv = self.client.get(uri) data = json.loads(rv.data.decode("utf-8")) self.assertEqual(rv.status_code, 200) - self.assertEqual(len(data["result"]), 3) + assert "since" in data["result"][0] + assert "until" in data["result"][0] + assert "timeRange" in data["result"][0] + + humanize_time_range = [ + {"timeRange": "2021-01-01 : 2022-02-01"}, + {"timeRange": "2022-01-01 : 2023-02-01"}, + ] + uri = f"api/v1/time_range/?q={prison.dumps(humanize_time_range)}" + rv = self.client.get(uri) + data = json.loads(rv.data.decode("utf-8")) + assert rv.status_code == 200 + assert len(data["result"]) == 2 + assert "since" in data["result"][0] + assert "until" in data["result"][0] + assert "timeRange" in data["result"][0] def test_get_relative_time_range(self): """
