You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by hu...@apache.org on 2022/10/03 20:44:31 UTC

[superset] 01/01: pull reference

This is an automated email from the ASF dual-hosted git repository.

hugh pushed a commit to branch fix-engine-params-ref
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 8cbb2062a9c699bca665ac10768f0bfcedba6ba3
Author: hughhhh <hu...@gmail.com>
AuthorDate: Mon Oct 3 16:44:05 2022 -0400

    pull reference
---
 superset/db_engine_specs/gsheets.py | 18 ++++++++++++++++--
 superset/models/core.py             |  2 +-
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/superset/db_engine_specs/gsheets.py b/superset/db_engine_specs/gsheets.py
index 78b42d2b3a..3011d36903 100644
--- a/superset/db_engine_specs/gsheets.py
+++ b/superset/db_engine_specs/gsheets.py
@@ -31,6 +31,7 @@ from typing_extensions import TypedDict
 
 from superset import security_manager
 from superset.constants import PASSWORD_MASK
+from superset.databases.commands.exceptions import DatabaseExtraJSONValidationError
 from superset.databases.schemas import encrypted_field_properties, EncryptedString
 from superset.db_engine_specs.sqlite import SqliteEngineSpec
 from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
@@ -209,13 +210,26 @@ class GSheetsEngineSpec(SqliteEngineSpec):
         spec.components.schema(cls.__name__, schema=cls.parameters_schema)
         return spec.to_dict()["components"]["schemas"][cls.__name__]
 
+    @classmethod
+    def get_engine_parameters(cls, properties: Dict[str, Any]) -> Dict[str, Any]:
+        try:
+            if properties.get("extra"):
+                return json.loads(properties["extra"]).get("engine_params", {})
+            return {}
+        except TypeError as ex:
+            raise DatabaseExtraJSONValidationError(
+                "Unable to parse extra_json data"
+            ) from ex
+
     @classmethod
     def validate_parameters(
         cls,
-        properties: GSheetsPropertiesType,
+        properties: Dict[str, Any],
     ) -> List[SupersetError]:
         errors: List[SupersetError] = []
-        parameters = properties.get("parameters", {})
+
+        # {'id': 7, 'configuration_method': <ConfigurationMethod.DYNAMIC_FORM: 'dynamic_form'>, 'extra': '{"engine_params":{"catalog":{"query_error_logs":"https://docs.google.com/spreadsheets/d/1XGpBx5-SPwM9mcdqMBTQcQNt-3Aa5-TEusUp5OvwMWs"}},"metadata_params":{},"schemas_allowed_for_file_upload":[]}', 'server_cert': None, 'engine': 'gsheets', 'database_name': 'Google Sheets', 'impersonate_user': True, 'masked_encrypted_extra': '{}', 'driver': 'apsw'}
+        parameters = cls.get_engine_parameters(properties)
         encrypted_credentials = parameters.get("service_account_info") or "{}"
 
         # On create the encrypted credentials are a string,
diff --git a/superset/models/core.py b/superset/models/core.py
index b0f8bbb772..008230ef48 100755
--- a/superset/models/core.py
+++ b/superset/models/core.py
@@ -261,7 +261,7 @@ class Database(
         # When returning the parameters we should use the masked SQLAlchemy URI and the
         # masked ``encrypted_extra`` to prevent exposing sensitive credentials.
         masked_uri = make_url_safe(self.sqlalchemy_uri)
-        masked_encrypted_extra = self.mask_encrypted_extra(self.encrypted_extra)
+        masked_encrypted_extra = self.masked_encrypted_extra
         encrypted_config = {}
         if masked_encrypted_extra is not None:
             try: