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):
         """

Reply via email to