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