diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx b/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx index 485952af3..98a5645fa 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx @@ -39,6 +39,8 @@ import Icon from 'src/components/Icon'; import { Select } from 'src/components/Select'; import { Tooltip } from 'src/common/components/Tooltip'; import { DEFAULT_TIME_RANGE } from 'src/explore/constants'; +import { useDebouncedEffect } from 'src/explore/exploreUtils'; +import { SLOW_DEBOUNCE } from 'src/constants'; import { SelectOptionType, FrameType } from './types'; import { @@ -220,17 +222,21 @@ export default function DateFilterLabel(props: DateFilterControlProps) { }); }, [value]); - useEffect(() => { - fetchTimeRange(timeRangeValue, endpoints).then(({ value, error }) => { - if (error) { - setEvalResponse(error || ''); - setValidTimeRange(false); - } else { - setEvalResponse(value || ''); - setValidTimeRange(true); - } - }); - }, [timeRangeValue]); + useDebouncedEffect( + () => { + fetchTimeRange(timeRangeValue, endpoints).then(({ value, error }) => { + if (error) { + setEvalResponse(error || ''); + setValidTimeRange(false); + } else { + setEvalResponse(value || ''); + setValidTimeRange(true); + } + }); + }, + SLOW_DEBOUNCE, + [timeRangeValue], + ); function onSave() { onChange(timeRangeValue); diff --git a/superset/utils/date_parser.py b/superset/utils/date_parser.py index 15e021a64..30fce841b 100644 --- a/superset/utils/date_parser.py +++ b/superset/utils/date_parser.py @@ -85,7 +85,7 @@ def parse_human_datetime(human_readable: str) -> datetime: parsed_dttm, parsed_flags = cal.parseDT(human_readable) # 0 == not parsed at all if parsed_flags == 0: - logger.exception(ex) + logger.debug(ex) raise TimeRangeParseFailError(human_readable) # when time is not extracted, we 'reset to midnight' if parsed_flags & 2 == 0: diff --git a/superset/views/api.py b/superset/views/api.py index 7df1c5e71..80cb5b666 100644 --- a/superset/views/api.py +++ b/superset/views/api.py @@ -24,6 +24,10 @@ from flask_appbuilder.api import rison from flask_appbuilder.security.decorators import has_access_api from superset import db, event_logger +from superset.charts.commands.exceptions import ( + TimeRangeParseFailError, + TimeRangeUnclearError, +) from superset.common.query_context import QueryContext from superset.legacy import update_time_range from superset.models.slice import Slice @@ -93,6 +97,6 @@ class Api(BaseSupersetView): "timeRange": time_range, } return self.json_response({"result": result}) - except ValueError as error: + except (ValueError, TimeRangeParseFailError, TimeRangeUnclearError) as error: error_msg = {"message": f"Unexpected time range: {error}"} return self.json_response(error_msg, 400)