feat: support to fetch multiple date time in time_range endpoint (#27370)

Co-authored-by: Yongjie Zhao <yongjie.zhao@burda-forward.de>
This commit is contained in:
Yongjie Zhao 2024-03-04 11:50:05 +01:00 committed by GitHub
parent e89ec4d593
commit 2c00cc534c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 42 additions and 12 deletions

View File

@ -72,8 +72,8 @@ export const fetchTimeRange = async (
try {
const response = await SupersetClient.get({ endpoint });
const timeRangeString = buildTimeRangeString(
response?.json?.result?.since || '',
response?.json?.result?.until || '',
response?.json?.result[0]?.since || '',
response?.json?.result[0]?.until || '',
);
return {
value: formatTimeRange(timeRangeString, columnPlaceholder),

View File

@ -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"},
},
},
}
class Api(BaseSupersetView):
@ -95,15 +103,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)

View File

@ -1421,7 +1421,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_query_form_data(self):
"""