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

beto 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 ec22acb  fix: handle schemas_allowed_for_csv_upload serde (#16038)
ec22acb is described below

commit ec22acb7864e6588c59a72170edb2a4c209b43e5
Author: Beto Dealmeida <[email protected]>
AuthorDate: Tue Aug 3 09:10:32 2021 -0700

    fix: handle schemas_allowed_for_csv_upload serde (#16038)
    
    * fix: handle schemas_allowed_for_csv_upload serde
    
    * Add migration
---
 .../data/database/DatabaseModal/ExtraOptions.tsx   | 10 ++-
 .../CRUD/data/database/DatabaseModal/index.tsx     | 16 ++++-
 .../src/views/CRUD/data/database/types.ts          |  2 +-
 ...3605f370a_fix_schemas_allowed_for_csv_upload.py | 82 ++++++++++++++++++++++
 4 files changed, 104 insertions(+), 6 deletions(-)

diff --git 
a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx 
b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx
index 71baa36..0e1e3ce 100644
--- 
a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx
+++ 
b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx
@@ -372,13 +372,17 @@ const ExtraOptions = ({
             <input
               type="text"
               name="schemas_allowed_for_csv_upload"
-              value={db?.extra_json?.schemas_allowed_for_csv_upload || ''}
-              placeholder={t('Select one or multiple schemas')}
+              value={(
+                db?.extra_json?.schemas_allowed_for_csv_upload || []
+              ).join(',')}
+              placeholder="schema1,schema2"
               onChange={onExtraInputChange}
             />
           </div>
           <div className="helper">
-            {t('A list of schemas that CSVs are allowed to upload to.')}
+            {t(
+              'A comma-separated list of schemas that CSVs are allowed to 
upload to.',
+            )}
           </div>
         </StyledInputContainer>
         <StyledInputContainer css={{ no_margin_bottom }}>
diff --git 
a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx 
b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx
index d655ed3..119f15f 100644
--- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx
+++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx
@@ -222,6 +222,17 @@ function dbReducer(
           },
         };
       }
+      if (action.payload.name === 'schemas_allowed_for_csv_upload') {
+        return {
+          ...trimmedState,
+          extra_json: {
+            ...trimmedState.extra_json,
+            schemas_allowed_for_csv_upload: (action.payload.value || '').split(
+              ',',
+            ),
+          },
+        };
+      }
       return {
         ...trimmedState,
         extra_json: {
@@ -409,8 +420,9 @@ const serializeExtra = (extraJson: 
DatabaseObject['extra_json']) =>
     engine_params: JSON.parse(
       ((extraJson?.engine_params as unknown) as string) || '{}',
     ),
-    schemas_allowed_for_csv_upload:
-      (extraJson?.schemas_allowed_for_csv_upload as string) || '[]',
+    schemas_allowed_for_csv_upload: (
+      extraJson?.schemas_allowed_for_csv_upload || []
+    ).filter(schema => schema !== ''),
   });
 
 const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({
diff --git a/superset-frontend/src/views/CRUD/data/database/types.ts 
b/superset-frontend/src/views/CRUD/data/database/types.ts
index 4cf4b84..f6341d3 100644
--- a/superset-frontend/src/views/CRUD/data/database/types.ts
+++ b/superset-frontend/src/views/CRUD/data/database/types.ts
@@ -83,7 +83,7 @@ export type DatabaseObject = {
       table_cache_timeout?: number; // in Performance
     }; // No field, holds schema and table timeout
     allows_virtual_table_explore?: boolean; // in SQL Lab
-    schemas_allowed_for_csv_upload?: [] | string; // in Security
+    schemas_allowed_for_csv_upload?: string[]; // in Security
     cancel_query_on_windows_unload?: boolean; // in Performance
     version?: string;
 
diff --git 
a/superset/migrations/versions/e323605f370a_fix_schemas_allowed_for_csv_upload.py
 
b/superset/migrations/versions/e323605f370a_fix_schemas_allowed_for_csv_upload.py
new file mode 100644
index 0000000..eb5d1b4
--- /dev/null
+++ 
b/superset/migrations/versions/e323605f370a_fix_schemas_allowed_for_csv_upload.py
@@ -0,0 +1,82 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+"""fix schemas_allowed_for_csv_upload
+
+Revision ID: e323605f370a
+Revises: 31b2a1039d4a
+Create Date: 2021-08-02 16:39:45.329151
+
+"""
+import json
+import logging
+
+from alembic import op
+from sqlalchemy import Column, Integer, Text
+from sqlalchemy.ext.declarative import declarative_base
+
+from superset import db
+
+# revision identifiers, used by Alembic.
+revision = "e323605f370a"
+down_revision = "31b2a1039d4a"
+
+
+Base = declarative_base()
+
+
+class Database(Base):
+
+    __tablename__ = "dbs"
+    id = Column(Integer, primary_key=True)
+    extra = Column(Text)
+
+
+def upgrade():
+    """
+    Fix databases with ``schemas_allowed_for_csv_upload`` stored as string.
+    """
+    bind = op.get_bind()
+    session = db.Session(bind=bind)
+
+    for database in session.query(Database).all():
+        try:
+            extra = json.loads(database.extra)
+        except json.decoder.JSONDecodeError as ex:
+            logging.warning(str(ex))
+            continue
+
+        schemas_allowed_for_csv_upload = 
extra.get("schemas_allowed_for_csv_upload")
+        if not isinstance(schemas_allowed_for_csv_upload, str):
+            continue
+
+        if schemas_allowed_for_csv_upload == "[]":
+            extra["schemas_allowed_for_csv_upload"] = []
+        else:
+            extra["schemas_allowed_for_csv_upload"] = [
+                schema.strip()
+                for schema in schemas_allowed_for_csv_upload.split(",")
+                if schema.strip()
+            ]
+
+        database.extra = json.dumps(extra)
+
+    session.commit()
+    session.close()
+
+
+def downgrade():
+    pass

Reply via email to