This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new e7b965a3b2 fix: Bad date type in email text report for table chart
(#20119)
e7b965a3b2 is described below
commit e7b965a3b2bb22da75b42d64cf4856073ecc026d
Author: Smart-Codi <[email protected]>
AuthorDate: Thu Jul 7 18:31:50 2022 +0100
fix: Bad date type in email text report for table chart (#20119)
* fix bad date type in email text report for table chart
* fix test, pylint issue
* add test case for date type
---
superset/utils/csv.py | 18 ++++++-
tests/integration_tests/reports/commands_tests.py | 58 ++++++++++++++++++++++-
2 files changed, 74 insertions(+), 2 deletions(-)
diff --git a/superset/utils/csv.py b/superset/utils/csv.py
index 914ab8cf56..54f30362fe 100644
--- a/superset/utils/csv.py
+++ b/superset/utils/csv.py
@@ -14,6 +14,7 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+import logging
import re
import urllib.request
from typing import Any, Dict, Optional
@@ -23,6 +24,10 @@ import numpy as np
import pandas as pd
import simplejson
+from superset.utils.core import GenericDataType
+
+logger = logging.getLogger(__name__)
+
negative_number_re = re.compile(r"^-[0-9.]+$")
# This regex will match if the string starts with:
@@ -102,11 +107,22 @@ def get_chart_dataframe(
return None
result = simplejson.loads(content.decode("utf-8"))
-
# need to convert float value to string to show full long number
pd.set_option("display.float_format", lambda x: str(x))
df = pd.DataFrame.from_dict(result["result"][0]["data"])
+ try:
+ # if any column type is equal to 2, need to convert data into
+ # datetime timestamp for that column.
+ if GenericDataType.TEMPORAL in result["result"][0]["coltypes"]:
+ for i in range(len(result["result"][0]["coltypes"])):
+ if result["result"][0]["coltypes"][i] ==
GenericDataType.TEMPORAL:
+ df[result["result"][0]["colnames"][i]] = df[
+ result["result"][0]["colnames"][i]
+ ].astype("datetime64[ms]")
+ except BaseException as err:
+ logger.error(err)
+
# rebuild hierarchical columns and index
df.columns = pd.MultiIndex.from_tuples(
tuple(colname) if isinstance(colname, list) else (colname,)
diff --git a/tests/integration_tests/reports/commands_tests.py
b/tests/integration_tests/reports/commands_tests.py
index dd23d291fd..63a54ff561 100644
--- a/tests/integration_tests/reports/commands_tests.py
+++ b/tests/integration_tests/reports/commands_tests.py
@@ -16,7 +16,7 @@
# under the License.
import json
from contextlib import contextmanager
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
from typing import Any, Dict, List, Optional
from unittest.mock import Mock, patch
from uuid import uuid4
@@ -960,6 +960,8 @@ def test_email_chart_report_schedule_with_text(
mock_open.return_value = response
mock_urlopen.return_value = response
mock_urlopen.return_value.getcode.return_value = 200
+
+ # test without date type.
response.read.return_value = json.dumps(
{
"result": [
@@ -971,6 +973,7 @@ def test_email_chart_report_schedule_with_text(
},
"colnames": [("t1",), ("t2",), ("t3__sum",)],
"indexnames": [(0,), (1,)],
+ "coltypes": [1, 1],
},
],
}
@@ -1011,6 +1014,59 @@ def test_email_chart_report_schedule_with_text(
# Assert logs are correct
assert_log(ReportState.SUCCESS)
+ # test with date type.
+ dt = datetime(2022, 1, 1).replace(tzinfo=timezone.utc)
+ ts = datetime.timestamp(dt) * 1000
+ response.read.return_value = json.dumps(
+ {
+ "result": [
+ {
+ "data": {
+ "t1": {0: "c11", 1: "c21"},
+ "t2__date": {0: ts, 1: ts},
+ "t3__sum": {0: "c13", 1: "c23"},
+ },
+ "colnames": [("t1",), ("t2__date",), ("t3__sum",)],
+ "indexnames": [(0,), (1,)],
+ "coltypes": [1, 2],
+ },
+ ],
+ }
+ ).encode("utf-8")
+
+ with freeze_time("2020-01-01T00:00:00Z"):
+ AsyncExecuteReportScheduleCommand(
+ TEST_ID, create_report_email_chart_with_text.id, datetime.utcnow()
+ ).run()
+
+ # assert that the data is embedded correctly
+ table_html = """<table border="1" class="dataframe">
+ <thead>
+ <tr>
+ <th></th>
+ <th>t1</th>
+ <th>t2__date</th>
+ <th>t3__sum</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th>0</th>
+ <td>c11</td>
+ <td>2022-01-01</td>
+ <td>c13</td>
+ </tr>
+ <tr>
+ <th>1</th>
+ <td>c21</td>
+ <td>2022-01-01</td>
+ <td>c23</td>
+ </tr>
+ </tbody>
+</table>"""
+
+ assert table_html in email_mock.call_args[0][2]
+
@pytest.mark.usefixtures(
"load_birth_names_dashboard_with_slices", "create_report_email_dashboard"