This is an automated email from the ASF dual-hosted git repository. johnbodley pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/master by this push: new b181e48 [log] Updating form-data logic (#10197) b181e48 is described below commit b181e48f5c6ba10b33172fc3c865347e12136bec Author: John Bodley <4567245+john-bod...@users.noreply.github.com> AuthorDate: Sat Jul 4 12:51:43 2020 -0700 [log] Updating form-data logic (#10197) Co-authored-by: John Bodley <john.bod...@airbnb.com> --- superset/utils/log.py | 35 ++++++++++++++++++----------------- tests/utils_tests.py | 30 +++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 18 deletions(-) diff --git a/superset/utils/log.py b/superset/utils/log.py index 382d780..68a0c95 100644 --- a/superset/utils/log.py +++ b/superset/utils/log.py @@ -36,31 +36,32 @@ class AbstractEventLogger(ABC): pass def log_this(self, f: Callable[..., Any]) -> Callable[..., Any]: + from superset.views.core import get_form_data + @functools.wraps(f) def wrapper(*args: Any, **kwargs: Any) -> Any: user_id = None if g.user: user_id = g.user.get_id() - form_data = request.form.to_dict() or {} + payload = request.form.to_dict() or {} # request parameters can overwrite post body request_params = request.args.to_dict() - form_data.update(request_params) - form_data.update(kwargs) + payload.update(request_params) + payload.update(kwargs) + + dashboard_id = payload.get("dashboard_id") - slice_id = form_data.get("slice_id") - dashboard_id = form_data.get("dashboard_id") + if "form_data" in payload: + form_data, _ = get_form_data() + payload["form_data"] = form_data + slice_id = form_data.get("slice_id") + else: + slice_id = payload.get("slice_id") try: - slice_id = int( - slice_id - or json.loads( - form_data.get("form_data") # type: ignore - ).get( - "slice_id" - ) - ) - except (ValueError, TypeError): + slice_id = int(slice_id) # type: ignore + except (TypeError, ValueError): slice_id = 0 self.stats_logger.incr(f.__name__) @@ -70,10 +71,10 @@ class AbstractEventLogger(ABC): # bulk insert try: - explode_by = form_data.get("explode") - records = json.loads(form_data.get(explode_by)) # type: ignore + explode_by = payload.get("explode") + records = json.loads(payload.get(explode_by)) # type: ignore except Exception: # pylint: disable=broad-except - records = [form_data] + records = [payload] referrer = request.referrer[:1000] if request.referrer else None diff --git a/tests/utils_tests.py b/tests/utils_tests.py index 107057c..25ad02f 100644 --- a/tests/utils_tests.py +++ b/tests/utils_tests.py @@ -32,7 +32,7 @@ from sqlalchemy.exc import ArgumentError import tests.test_app from superset import app, db, security_manager from superset.exceptions import CertificateException, SupersetException -from superset.models.core import Database +from superset.models.core import Database, Log from superset.utils.cache_manager import CacheManager from superset.utils.core import ( base_json_conv, @@ -1316,3 +1316,31 @@ class TestUtils(SupersetTestCase): ) self.assertEqual(slc, None) + + def test_log_this(self) -> None: + # TODO: Add additional scenarios. + self.login(username="admin") + slc = self.get_slice("Girls", db.session) + dashboard_id = 1 + + resp = self.get_json_resp( + f"/superset/explore_json/{slc.datasource_type}/{slc.datasource_id}/" + + f'?form_data={{"slice_id": {slc.id}}}&dashboard_id={dashboard_id}', + {"form_data": json.dumps(slc.viz.form_data)}, + ) + + record = ( + db.session.query(Log) + .filter_by(action="explore_json", slice_id=slc.id) + .order_by(Log.dttm.desc()) + .first() + ) + + self.assertEqual(record.dashboard_id, dashboard_id) + self.assertEqual(json.loads(record.json)["dashboard_id"], str(dashboard_id)) + self.assertEqual(json.loads(record.json)["form_data"]["slice_id"], slc.id) + + self.assertEqual( + json.loads(record.json)["form_data"]["viz_type"], + slc.viz.form_data["viz_type"], + )