From ce3cb102ce81c393e4480e829ed9f53e54aa43cf Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Tue, 26 Apr 2022 17:58:41 +0000 Subject: [PATCH 01/16] fix api for checking owners --- superset/views/datasource/views.py | 32 +++++++++--------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/superset/views/datasource/views.py b/superset/views/datasource/views.py index 791f7c500e0cf..370cf2118206f 100644 --- a/superset/views/datasource/views.py +++ b/superset/views/datasource/views.py @@ -81,29 +81,15 @@ def save(self) -> FlaskResponse: if "owners" in datasource_dict and orm_datasource.owner_class is not None: # Check ownership - if app.config.get("OLD_API_CHECK_DATASET_OWNERSHIP"): - # mimic the behavior of the new dataset command that - # checks ownership and ensures that non-admins aren't locked out - # of the object - try: - check_ownership(orm_datasource) - except SupersetSecurityException as ex: - raise DatasetForbiddenError() from ex - user = security_manager.get_user_by_id(g.user.id) - datasource_dict["owners"] = populate_owners( - user, datasource_dict["owners"], default_to_user=False - ) - else: - # legacy behavior - datasource_dict["owners"] = ( - db.session.query(orm_datasource.owner_class) - .filter( - orm_datasource.owner_class.id.in_( - datasource_dict["owners"] or [] - ) - ) - .all() - ) + try: + check_ownership(orm_datasource) + except SupersetSecurityException as ex: + raise DatasetForbiddenError() from ex + + user = security_manager.get_user_by_id(g.user.id) + datasource_dict["owners"] = populate_owners( + user, datasource_dict["owners"], default_to_user=False + ) duplicates = [ name From 3c500fe31721669243b4420b0b47f91fb021d243 Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Tue, 26 Apr 2022 19:53:56 +0000 Subject: [PATCH 02/16] fix styles for disabling --- .../views/CRUD/data/dataset/DatasetList.tsx | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx index c99a69e1c1177..cfd0773be97f9 100644 --- a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx @@ -16,7 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -import { SupersetClient, t, styled } from '@superset-ui/core'; +import { + SupersetClient, + t, + styled, + SupersetTheme, + css, +} from '@superset-ui/core'; import React, { FunctionComponent, useState, @@ -57,6 +63,7 @@ import ImportModelsModal from 'src/components/ImportModal/index'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import WarningIconWithTooltip from 'src/components/WarningIconWithTooltip'; import AddDatasetModal from './AddDatasetModal'; +import { isUserAdmin } from 'src/dashboard/util/findPermission'; import { PAGE_SIZE, SORT_BY, @@ -75,6 +82,14 @@ const FlexRowContainer = styled.div` const Actions = styled.div` color: ${({ theme }) => theme.colors.grayscale.base}; + + .disabled { + color: ${({ theme }) => theme.colors.grayscale.light1}; + .ant-menu-item:hover { + color: ${({ theme }) => theme.colors.grayscale.base}; + cursor: default; + } + } `; type Dataset = { @@ -163,6 +178,7 @@ const DatasetList: FunctionComponent = ({ endpoint: `/api/v1/dataset/${id}`, }) .then(({ json = {} }) => { + console.log(json); const addCertificationFields = json.result.columns.map( (column: ColumnObject) => { const { @@ -344,6 +360,20 @@ const DatasetList: FunctionComponent = ({ }, { Cell: ({ row: { original } }: any) => { + console.log( + 'original.owners', + original.owners.map((o: any) => o.id), + ); + console.log( + 'allow edit', + original.owners.map((o: any) => o.id).includes(user.userId), + ); + + // Verify owner or isAdmin + const allowEdit = + original.owners.map((o: any) => o.id).includes(user.userId) || + isUserAdmin(user); + const handleEdit = () => openDatasetEditModal(original); const handleDelete = () => openDatasetDeleteModal(original); const handleExport = () => handleBulkDatasetExport([original]); @@ -387,14 +417,20 @@ const DatasetList: FunctionComponent = ({ {canEdit && ( From 6d5e269a1fee3bcdd316d5a11292f28233e3ceb7 Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Tue, 26 Apr 2022 20:02:25 +0000 Subject: [PATCH 03/16] fix styles for disabling --- .../controls/DatasourceControl/index.jsx | 15 +++++++++- .../views/CRUD/data/dataset/DatasetList.tsx | 28 ++++++++++--------- superset/views/datasource/views.py | 2 +- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx index b011901eb0306..48070122fe487 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx @@ -35,6 +35,7 @@ import Button from 'src/components/Button'; import ErrorAlert from 'src/components/ErrorMessage/ErrorAlert'; import WarningIconWithTooltip from 'src/components/WarningIconWithTooltip'; import { URL_PARAMS } from 'src/constants'; +import { isUserAdmin } from 'src/dashboard/util/findPermission'; const propTypes = { actions: PropTypes.object.isRequired, @@ -196,11 +197,23 @@ class DatasourceControl extends React.PureComponent { } const isSqlSupported = datasource.type === 'table'; + const appContainer = document.getElementById('app'); + const bootstrapData = JSON.parse( + appContainer?.getAttribute('data-bootstrap') || '{}', + ); + const user = bootstrapData.user; + const allowEdit = + datasource.owners.map(o => o.id).includes(user.userId) || + isUserAdmin(user); const datasourceMenu = ( {this.props.isEditable && ( - + {t('Edit dataset')} )} diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx index cfd0773be97f9..ebf03e5df637a 100644 --- a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx @@ -62,8 +62,9 @@ import InfoTooltip from 'src/components/InfoTooltip'; import ImportModelsModal from 'src/components/ImportModal/index'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import WarningIconWithTooltip from 'src/components/WarningIconWithTooltip'; -import AddDatasetModal from './AddDatasetModal'; import { isUserAdmin } from 'src/dashboard/util/findPermission'; +import AddDatasetModal from './AddDatasetModal'; + import { PAGE_SIZE, SORT_BY, @@ -84,11 +85,22 @@ const Actions = styled.div` color: ${({ theme }) => theme.colors.grayscale.base}; .disabled { + svg, + i { + &:hover { + path { + fill: ${({ theme }) => theme.colors.grayscale.light1}; + } + } + } color: ${({ theme }) => theme.colors.grayscale.light1}; .ant-menu-item:hover { - color: ${({ theme }) => theme.colors.grayscale.base}; + color: ${({ theme }) => theme.colors.grayscale.light1}; cursor: default; } + &::after { + color: ${({ theme }) => theme.colors.grayscale.light1}; + } } `; @@ -178,7 +190,6 @@ const DatasetList: FunctionComponent = ({ endpoint: `/api/v1/dataset/${id}`, }) .then(({ json = {} }) => { - console.log(json); const addCertificationFields = json.result.columns.map( (column: ColumnObject) => { const { @@ -360,15 +371,6 @@ const DatasetList: FunctionComponent = ({ }, { Cell: ({ row: { original } }: any) => { - console.log( - 'original.owners', - original.owners.map((o: any) => o.id), - ); - console.log( - 'allow edit', - original.owners.map((o: any) => o.id).includes(user.userId), - ); - // Verify owner or isAdmin const allowEdit = original.owners.map((o: any) => o.id).includes(user.userId) || @@ -424,7 +426,7 @@ const DatasetList: FunctionComponent = ({ 'You must be a dataset owner in order to edit. Please reach out to a dataset owner to request modifications or edit access.', ) } - placement="bottom" + placement="bottomRight" > Date: Wed, 27 Apr 2022 19:04:30 +0000 Subject: [PATCH 04/16] fix lint --- .../explore/components/controls/DatasourceControl/index.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx index 48070122fe487..21f331777425a 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx @@ -198,10 +198,9 @@ class DatasourceControl extends React.PureComponent { const isSqlSupported = datasource.type === 'table'; const appContainer = document.getElementById('app'); - const bootstrapData = JSON.parse( + const { user } = JSON.parse( appContainer?.getAttribute('data-bootstrap') || '{}', ); - const user = bootstrapData.user; const allowEdit = datasource.owners.map(o => o.id).includes(user.userId) || isUserAdmin(user); From 158417fe2affb85e7dd39f7bad50bedb415989b9 Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Wed, 27 Apr 2022 23:04:30 +0000 Subject: [PATCH 05/16] fix lint --- .../src/views/CRUD/data/dataset/DatasetList.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx index ebf03e5df637a..6a002d5ea266b 100644 --- a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx @@ -16,13 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { - SupersetClient, - t, - styled, - SupersetTheme, - css, -} from '@superset-ui/core'; +import { SupersetClient, t, styled } from '@superset-ui/core'; import React, { FunctionComponent, useState, From 2815838e903b6158281240d43b377470b60a2cda Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Thu, 28 Apr 2022 00:01:31 +0000 Subject: [PATCH 06/16] add owners key --- tests/integration_tests/datasource_tests.py | 23 +++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/integration_tests/datasource_tests.py b/tests/integration_tests/datasource_tests.py index 1428a20c48352..6a66b1901b25a 100644 --- a/tests/integration_tests/datasource_tests.py +++ b/tests/integration_tests/datasource_tests.py @@ -299,11 +299,14 @@ def save_datasource_from_dict(self, datasource_post): @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_change_database(self): self.login(username="admin") + admin_user = self.get_user("admin") + tbl = self.get_table(name="birth_names") tbl_id = tbl.id db_id = tbl.database_id datasource_post = get_datasource_post() datasource_post["id"] = tbl_id + datasource_post["owners"] = [admin_user.id] new_db = self.create_fake_db() datasource_post["database"]["id"] = new_db.id @@ -316,6 +319,26 @@ def test_change_database(self): self.delete_fake_db() + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") + def test_edit_alpha_not_owner(self): + self.login(username="alpha") + alpha_user = self.get_user("alpha") + + tbl = self.get_table(name="birth_names") + tbl_id = tbl.id + datasource_post = get_datasource_post() + datasource_post["id"] = tbl_id + datasource_post["owners"] = [alpha_user.id] + + new_db = self.create_fake_db() + datasource_post["database"]["id"] = new_db.id + + data = dict(data=json.dumps(datasource_post)) + resp = self.get_json_resp("/datasource/save/", data, raise_on_error=False) + self.assertIn("Changing this dataset is forbidden", resp["error"]) + + self.delete_fake_db() + def test_save_duplicate_key(self): self.login(username="admin") tbl_id = self.get_table(name="birth_names").id From df81e2bc630ff14e30c3fe46c010ddfdee5cfd48 Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Thu, 28 Apr 2022 01:13:59 +0000 Subject: [PATCH 07/16] plzz --- tests/integration_tests/datasource_tests.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/integration_tests/datasource_tests.py b/tests/integration_tests/datasource_tests.py index 6a66b1901b25a..62da9b9b937bf 100644 --- a/tests/integration_tests/datasource_tests.py +++ b/tests/integration_tests/datasource_tests.py @@ -319,7 +319,6 @@ def test_change_database(self): self.delete_fake_db() - @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_edit_alpha_not_owner(self): self.login(username="alpha") alpha_user = self.get_user("alpha") From d5d67195086153e6fe413af51a53165af6faa61b Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Thu, 28 Apr 2022 16:11:51 +0000 Subject: [PATCH 08/16] remove --- tests/integration_tests/datasource_tests.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/tests/integration_tests/datasource_tests.py b/tests/integration_tests/datasource_tests.py index 62da9b9b937bf..7722f44f222e9 100644 --- a/tests/integration_tests/datasource_tests.py +++ b/tests/integration_tests/datasource_tests.py @@ -319,25 +319,6 @@ def test_change_database(self): self.delete_fake_db() - def test_edit_alpha_not_owner(self): - self.login(username="alpha") - alpha_user = self.get_user("alpha") - - tbl = self.get_table(name="birth_names") - tbl_id = tbl.id - datasource_post = get_datasource_post() - datasource_post["id"] = tbl_id - datasource_post["owners"] = [alpha_user.id] - - new_db = self.create_fake_db() - datasource_post["database"]["id"] = new_db.id - - data = dict(data=json.dumps(datasource_post)) - resp = self.get_json_resp("/datasource/save/", data, raise_on_error=False) - self.assertIn("Changing this dataset is forbidden", resp["error"]) - - self.delete_fake_db() - def test_save_duplicate_key(self): self.login(username="admin") tbl_id = self.get_table(name="birth_names").id From 0abe50e27b47133a6fba37055764fee63a056fc8 Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Thu, 28 Apr 2022 17:38:59 +0000 Subject: [PATCH 09/16] update test --- tests/integration_tests/datasource_tests.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/integration_tests/datasource_tests.py b/tests/integration_tests/datasource_tests.py index 7722f44f222e9..6d46afa0a9ddd 100644 --- a/tests/integration_tests/datasource_tests.py +++ b/tests/integration_tests/datasource_tests.py @@ -278,6 +278,7 @@ def test_save(self): datasource_post = get_datasource_post() datasource_post["id"] = tbl_id + datasource_post["owners"] = [1] data = dict(data=json.dumps(datasource_post)) resp = self.get_json_resp("/datasource/save/", data) for k in datasource_post: @@ -321,10 +322,12 @@ def test_change_database(self): def test_save_duplicate_key(self): self.login(username="admin") + admin_user = self.get_user("admin") tbl_id = self.get_table(name="birth_names").id datasource_post = get_datasource_post() datasource_post["id"] = tbl_id + datasource_post["owners"] = [admin_user.id] datasource_post["columns"].extend( [ { @@ -349,10 +352,12 @@ def test_save_duplicate_key(self): def test_get_datasource(self): self.login(username="admin") + admin_user = self.get_user("admin") tbl = self.get_table(name="birth_names") datasource_post = get_datasource_post() datasource_post["id"] = tbl.id + datasource_post["owners"] = [admin_user.id] data = dict(data=json.dumps(datasource_post)) self.get_json_resp("/datasource/save/", data) url = f"/datasource/get/{tbl.type}/{tbl.id}/" From fce73909a388b091a022810190b98de6a032556d Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Thu, 28 Apr 2022 20:40:08 +0000 Subject: [PATCH 10/16] add tooltip --- .../controls/DatasourceControl/index.jsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx index 21f331777425a..25200f1ea474b 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx @@ -205,6 +205,8 @@ class DatasourceControl extends React.PureComponent { datasource.owners.map(o => o.id).includes(user.userId) || isUserAdmin(user); + const editText = t('Edit dataset'); + const datasourceMenu = ( {this.props.isEditable && ( @@ -213,7 +215,17 @@ class DatasourceControl extends React.PureComponent { data-test="edit-dataset" disabled={!allowEdit} > - {t('Edit dataset')} + {!allowEdit ? ( + + {editText} + + ) : ( + editText + )} )} {t('Change dataset')} From 929ecb98e02b6edb44ed06257291fcb9471fca9a Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Thu, 28 Apr 2022 20:42:15 +0000 Subject: [PATCH 11/16] add type --- superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx index 6a002d5ea266b..563a3bce1fc4c 100644 --- a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx @@ -367,7 +367,7 @@ const DatasetList: FunctionComponent = ({ Cell: ({ row: { original } }: any) => { // Verify owner or isAdmin const allowEdit = - original.owners.map((o: any) => o.id).includes(user.userId) || + original.owners.map((o: Owner) => o.id).includes(user.userId) || isUserAdmin(user); const handleEdit = () => openDatasetEditModal(original); From e6bdf937552a687dc1082228b0886723cde11b96 Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Thu, 28 Apr 2022 20:51:38 +0000 Subject: [PATCH 12/16] fix test --- .../controls/DatasourceControl/DatasourceControl.test.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx index 73c2777663a19..38330d0cebf82 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx @@ -41,6 +41,7 @@ const defaultProps = { id: 1, columns: [], metrics: [], + owners: [{ username: 'admin', userId: 1 }], database: { backend: 'mysql', name: 'main', From c409a23f2fee61b0b91e3e1d212c126840b75ebc Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Fri, 29 Apr 2022 02:13:56 +0000 Subject: [PATCH 13/16] fix user reference --- .../src/shared-controls/index.tsx | 6 ++++++ .../controls/DatasourceControl/DatasourceControl.test.jsx | 2 ++ .../explore/components/controls/DatasourceControl/index.jsx | 6 ++---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx index 382fcb5bb3316..713fbf1c2dd27 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx @@ -91,6 +91,11 @@ export const PRIMARY_COLOR = { r: 0, g: 122, b: 135, a: 1 }; const ROW_LIMIT_OPTIONS = [10, 50, 100, 250, 500, 1000, 5000, 10000, 50000]; const SERIES_LIMITS = [5, 10, 25, 50, 100, 500]; +const appContainer = document.getElementById('app'); +const { user } = JSON.parse( + appContainer?.getAttribute('data-bootstrap') || '{}', +); + type Control = { savedMetrics?: Metric[] | null; default?: unknown; @@ -167,6 +172,7 @@ const datasourceControl: SharedControlConfig<'DatasourceControl'> = { mapStateToProps: ({ datasource, form_data }) => ({ datasource, form_data, + user, }), }; diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx index 38330d0cebf82..ff6fb4a2cddbf 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx @@ -29,6 +29,7 @@ import { import DatasourceControl from 'src/explore/components/controls/DatasourceControl'; import Icons from 'src/components/Icons'; import { Tooltip } from 'src/components/Tooltip'; +import { user } from 'src/SqlLab/fixtures'; const defaultProps = { name: 'datasource', @@ -52,6 +53,7 @@ const defaultProps = { setDatasource: sinon.spy(), }, onChange: sinon.spy(), + user, }; describe('DatasourceControl', () => { diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx index 25200f1ea474b..87294a0b10e76 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx @@ -196,11 +196,9 @@ class DatasourceControl extends React.PureComponent { } } + console.log(this.props); const isSqlSupported = datasource.type === 'table'; - const appContainer = document.getElementById('app'); - const { user } = JSON.parse( - appContainer?.getAttribute('data-bootstrap') || '{}', - ); + const { user } = this.props; const allowEdit = datasource.owners.map(o => o.id).includes(user.userId) || isUserAdmin(user); From 206e28807b350cd0f73e2bfe11dcd63f0b04206f Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Fri, 29 Apr 2022 16:57:55 +0000 Subject: [PATCH 14/16] lit --- .../DatasourceControl/DatasourceControl.test.jsx | 14 ++++++++++++-- .../DatasourceControl/DatasourceControl.test.tsx | 11 +++++++++++ .../controls/DatasourceControl/index.jsx | 1 - .../views/CRUD/data/dataset/DatasetList.test.jsx | 1 + 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx index ff6fb4a2cddbf..41a40c0bc4422 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx @@ -29,7 +29,6 @@ import { import DatasourceControl from 'src/explore/components/controls/DatasourceControl'; import Icons from 'src/components/Icons'; import { Tooltip } from 'src/components/Tooltip'; -import { user } from 'src/SqlLab/fixtures'; const defaultProps = { name: 'datasource', @@ -53,7 +52,17 @@ const defaultProps = { setDatasource: sinon.spy(), }, onChange: sinon.spy(), - user, + user: { + createdOn: '2021-04-27T18:12:38.952304', + email: 'admin', + firstName: 'admin', + isActive: true, + lastName: 'admin', + permissions: {}, + roles: { Admin: Array(173) }, + userId: 1, + username: 'admin', + }, }; describe('DatasourceControl', () => { @@ -110,6 +119,7 @@ describe('DatasourceControl', () => { id: 1, columns: [], metrics: [], + owners: [{ username: 'admin', userId: 1 }], database: { backend: 'druid', name: 'main', diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx index f4f66ef43ead8..4811743489ff2 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx @@ -48,6 +48,17 @@ const createProps = () => ({ name: 'datasource', actions: {}, isEditable: true, + user: { + createdOn: '2021-04-27T18:12:38.952304', + email: 'admin', + firstName: 'admin', + isActive: true, + lastName: 'admin', + permissions: {}, + roles: { Admin: Array(173) }, + userId: 1, + username: 'admin', + }, onChange: jest.fn(), onDatasourceSave: jest.fn(), }); diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx index 87294a0b10e76..73aa5e4d913d5 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx @@ -196,7 +196,6 @@ class DatasourceControl extends React.PureComponent { } } - console.log(this.props); const isSqlSupported = datasource.type === 'table'; const { user } = this.props; const allowEdit = diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.test.jsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.test.jsx index 0854f006de517..58acc6e32a3ac 100644 --- a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.test.jsx +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.test.jsx @@ -55,6 +55,7 @@ const mockdatasets = [...new Array(3)].map((_, i) => ({ id: i, schema: `schema ${i}`, table_name: `coolest table ${i}`, + owners: [{ username: 'admin', userId: 1 }], })); const mockUser = { From ccf1acad221309a9b3b7042036b02e4a5423c5e7 Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Fri, 29 Apr 2022 19:42:12 +0000 Subject: [PATCH 15/16] fix test --- .../explore/components/DatasourcePanel/DatasourcePanel.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx b/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx index 0f11f48dd840c..8ac8a8ababa65 100644 --- a/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx +++ b/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx @@ -47,6 +47,7 @@ const datasource = { main_dttm_col: 'None', datasource_name: 'table1', description: 'desc', + owners: [{ username: 'admin', userId: 1 }], }; const props: DatasourcePanelProps = { datasource, From d33cc8bb51b0300497f17643f21eeae4ef262934 Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Fri, 29 Apr 2022 20:16:08 +0000 Subject: [PATCH 16/16] work --- .../DatasourcePanel/DatasourcePanel.test.tsx | 16 ++++++++++++++++ .../explore/components/DatasourcePanel/index.tsx | 2 ++ 2 files changed, 18 insertions(+) diff --git a/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx b/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx index 8ac8a8ababa65..99c596b80ed9c 100644 --- a/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx +++ b/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx @@ -49,6 +49,20 @@ const datasource = { description: 'desc', owners: [{ username: 'admin', userId: 1 }], }; + +const mockUser = { + createdOn: '2021-04-27T18:12:38.952304', + email: 'admin', + firstName: 'admin', + isActive: true, + lastName: 'admin', + permissions: {}, + roles: { Admin: Array(173) }, + userId: 1, + username: 'admin', + isAnonymous: false, +}; + const props: DatasourcePanelProps = { datasource, controls: { @@ -58,6 +72,7 @@ const props: DatasourcePanelProps = { type: DatasourceControl, label: 'hello', datasource, + user: mockUser, }, }, actions: { @@ -155,6 +170,7 @@ test('should render a warning', async () => { datasource: { ...props.controls.datasource, datasource: deprecatedDatasource, + user: mockUser, }, }, }), diff --git a/superset-frontend/src/explore/components/DatasourcePanel/index.tsx b/superset-frontend/src/explore/components/DatasourcePanel/index.tsx index c38c1b59ae4fc..8bd39aa52f02c 100644 --- a/superset-frontend/src/explore/components/DatasourcePanel/index.tsx +++ b/superset-frontend/src/explore/components/DatasourcePanel/index.tsx @@ -31,12 +31,14 @@ import { FAST_DEBOUNCE } from 'src/constants'; import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; import { ExploreActions } from 'src/explore/actions/exploreActions'; import Control from 'src/explore/components/Control'; +import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; import DatasourcePanelDragOption from './DatasourcePanelDragOption'; import { DndItemType } from '../DndItemType'; import { StyledColumnOption, StyledMetricOption } from '../optionRenderers'; interface DatasourceControl extends ControlConfig { datasource?: DatasourceMeta; + user: UserWithPermissionsAndRoles; } export interface Props {