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"],
+        )

Reply via email to