From 4fe4a854be98146183217dc172db3e02b38df666 Mon Sep 17 00:00:00 2001 From: zef Date: Mon, 25 Jul 2022 14:07:29 -0700 Subject: [PATCH 01/11] feat: hide inactive user from owner dropdown for dataset/dashboard/chart --- .../Datasource/DatasourceEditor.jsx | 10 +++++---- .../components/PropertiesModal/index.tsx | 8 +++---- .../components/PropertiesModal/index.tsx | 8 +++---- superset/views/base_api.py | 21 +++++++++++++++++++ 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/superset-frontend/src/components/Datasource/DatasourceEditor.jsx b/superset-frontend/src/components/Datasource/DatasourceEditor.jsx index 260cf5eab73f..c5a21f65e4cb 100644 --- a/superset-frontend/src/components/Datasource/DatasourceEditor.jsx +++ b/superset-frontend/src/components/Datasource/DatasourceEditor.jsx @@ -540,10 +540,12 @@ function OwnersSelector({ datasource, onChange }) { return SupersetClient.get({ endpoint: `/api/v1/dataset/related/owners?q=${query}`, }).then(response => ({ - data: response.json.result.map(item => ({ - value: item.value, - label: item.text, - })), + data: response.json.result + .filter(item => item.extra.active) + .map(item => ({ + value: item.value, + label: item.text, + })), totalCount: response.json.count, })); }, []); diff --git a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx index ebdc753226ff..7cdf76fd228d 100644 --- a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx +++ b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx @@ -132,12 +132,12 @@ const PropertiesModal = ({ return SupersetClient.get({ endpoint: `/api/v1/dashboard/related/${accessType}?q=${query}`, }).then(response => ({ - data: response.json.result.map( - (item: { value: number; text: string }) => ({ + data: response.json.result + .filter(item => item.extra.active) + .map((item: { value: number; text: string }) => ({ value: item.value, label: item.text, - }), - ), + })), totalCount: response.json.count, })); }, diff --git a/superset-frontend/src/explore/components/PropertiesModal/index.tsx b/superset-frontend/src/explore/components/PropertiesModal/index.tsx index 3aa0fa60d2f9..2a37962bfc5f 100644 --- a/superset-frontend/src/explore/components/PropertiesModal/index.tsx +++ b/superset-frontend/src/explore/components/PropertiesModal/index.tsx @@ -107,12 +107,12 @@ function PropertiesModal({ return SupersetClient.get({ endpoint: `/api/v1/chart/related/owners?q=${query}`, }).then(response => ({ - data: response.json.result.map( - (item: { value: number; text: string }) => ({ + data: response.json.result + .filter(item => item.extra.active) + .map((item: { value: number; text: string }) => ({ value: item.value, label: item.text, - }), - ), + })), totalCount: response.json.count, })); }, diff --git a/superset/views/base_api.py b/superset/views/base_api.py index 0728501cceaf..df212cc46870 100644 --- a/superset/views/base_api.py +++ b/superset/views/base_api.py @@ -223,6 +223,15 @@ class BaseSupersetModelRestApi(ModelRestApi): } """ + extra_fields_rel_fields: Dict[str, List[str]] = {"owners": ["email", "active"]} + """ + Declare extra fields for the representation of the Model object:: + + extra_fields_rel_fields = { + "": "[, ]" + } + """ + allowed_distinct_fields: Set[str] = set() add_columns: List[str] @@ -317,6 +326,17 @@ def _get_text_for_model(self, model: Model, column_name: str) -> str: return getattr(model, model_column_name) return str(model) + def _get_extra_field_for_model( + self, model: Model, column_name: str + ) -> Dict[str, str]: + ret = {} + if column_name in self.extra_fields_rel_fields: + model_column_names = self.extra_fields_rel_fields.get(column_name) + if model_column_names: + for key in model_column_names: + ret[key] = getattr(model, key) + return ret + def _get_result_from_rows( self, datamodel: SQLAInterface, rows: List[Model], column_name: str ) -> List[Dict[str, Any]]: @@ -324,6 +344,7 @@ def _get_result_from_rows( { "value": datamodel.get_pk_value(row), "text": self._get_text_for_model(row, column_name), + "extra": self._get_extra_field_for_model(row, column_name), } for row in rows ] From 44cac3ca6c9f58eb1fb52669928ba20d5471a708 Mon Sep 17 00:00:00 2001 From: zef Date: Mon, 25 Jul 2022 15:32:41 -0700 Subject: [PATCH 02/11] adding type hint ignore --- .../src/dashboard/components/PropertiesModal/index.tsx | 1 + .../src/explore/components/PropertiesModal/index.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx index 7cdf76fd228d..b108c6b45b1e 100644 --- a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx +++ b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx @@ -133,6 +133,7 @@ const PropertiesModal = ({ endpoint: `/api/v1/dashboard/related/${accessType}?q=${query}`, }).then(response => ({ data: response.json.result + // @ts-ignore .filter(item => item.extra.active) .map((item: { value: number; text: string }) => ({ value: item.value, diff --git a/superset-frontend/src/explore/components/PropertiesModal/index.tsx b/superset-frontend/src/explore/components/PropertiesModal/index.tsx index 2a37962bfc5f..b879c90bdc4e 100644 --- a/superset-frontend/src/explore/components/PropertiesModal/index.tsx +++ b/superset-frontend/src/explore/components/PropertiesModal/index.tsx @@ -108,6 +108,7 @@ function PropertiesModal({ endpoint: `/api/v1/chart/related/owners?q=${query}`, }).then(response => ({ data: response.json.result + // @ts-ignore .filter(item => item.extra.active) .map((item: { value: number; text: string }) => ({ value: item.value, From cb8d3936c4c194afa07245bd74606882c030f03e Mon Sep 17 00:00:00 2001 From: zef Date: Thu, 18 Aug 2022 08:31:16 -0700 Subject: [PATCH 03/11] fixed tests --- tests/integration_tests/base_api_tests.py | 48 +++++++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/tests/integration_tests/base_api_tests.py b/tests/integration_tests/base_api_tests.py index 8dbbb6862e3b..16cc8cc18d04 100644 --- a/tests/integration_tests/base_api_tests.py +++ b/tests/integration_tests/base_api_tests.py @@ -264,10 +264,26 @@ def test_get_filter_related_owners(self): assert 4 == response["count"] sorted_results = sorted(response["result"], key=lambda value: value["text"]) expected_results = [ - {"text": "gamma user", "value": 2}, - {"text": "gamma2 user", "value": 3}, - {"text": "gamma_no_csv user", "value": 6}, - {"text": "gamma_sqllab user", "value": 4}, + { + "extra": {"active": True, "email": "gamma@fab.org"}, + "text": "gamma user", + "value": 2, + }, + { + "extra": {"active": True, "email": "gamma2@fab.org"}, + "text": "gamma2 user", + "value": 3, + }, + { + "extra": {"active": True, "email": "gamma_no_csv@fab.org"}, + "text": "gamma_no_csv user", + "value": 6, + }, + { + "extra": {"active": True, "email": "gamma_sqllab@fab.org"}, + "text": "gamma_sqllab user", + "value": 4, + }, ] # TODO Check me assert expected_results == sorted_results @@ -286,8 +302,16 @@ def test_get_ids_related_owners(self): assert 2 == response["count"] sorted_results = sorted(response["result"], key=lambda value: value["text"]) expected_results = [ - {"text": "gamma user", "value": 2}, - {"text": "gamma_sqllab user", "value": 4}, + { + "extra": {"active": True, "email": "gamma@fab.org"}, + "text": "gamma user", + "value": 2, + }, + { + "extra": {"active": True, "email": "gamma_sqllab@fab.org"}, + "text": "gamma_sqllab user", + "value": 4, + }, ] assert expected_results == sorted_results @@ -305,8 +329,16 @@ def test_get_repeated_ids_related_owners(self): assert 2 == response["count"] sorted_results = sorted(response["result"], key=lambda value: value["text"]) expected_results = [ - {"text": "gamma user", "value": 2}, - {"text": "gamma_sqllab user", "value": 4}, + { + "extra": {"active": True, "email": "gamma@fab.org"}, + "text": "gamma user", + "value": 2, + }, + { + "extra": {"active": True, "email": "gamma_sqllab@fab.org"}, + "text": "gamma_sqllab user", + "value": 4, + }, ] assert expected_results == sorted_results From 76788c091f7624ea5bb6733b8b71e9310fc90183 Mon Sep 17 00:00:00 2001 From: zef Date: Thu, 18 Aug 2022 09:40:55 -0700 Subject: [PATCH 04/11] fixed tests --- tests/integration_tests/queries/saved_queries/api_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration_tests/queries/saved_queries/api_tests.py b/tests/integration_tests/queries/saved_queries/api_tests.py index 2569e7af406e..066e6fea1f9f 100644 --- a/tests/integration_tests/queries/saved_queries/api_tests.py +++ b/tests/integration_tests/queries/saved_queries/api_tests.py @@ -445,7 +445,7 @@ def test_related_saved_query(self): expected_result = { "count": len(databases), "result": [ - {"text": str(database), "value": database.id} for database in databases + {"extra": {}, "text": str(database), "value": database.id} for database in databases ], } From fc629b49b4960f973f1e51501947adead338bb98 Mon Sep 17 00:00:00 2001 From: zef Date: Thu, 18 Aug 2022 16:44:00 -0700 Subject: [PATCH 05/11] prettier --- tests/integration_tests/queries/saved_queries/api_tests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/integration_tests/queries/saved_queries/api_tests.py b/tests/integration_tests/queries/saved_queries/api_tests.py index 066e6fea1f9f..437225f6c519 100644 --- a/tests/integration_tests/queries/saved_queries/api_tests.py +++ b/tests/integration_tests/queries/saved_queries/api_tests.py @@ -445,7 +445,8 @@ def test_related_saved_query(self): expected_result = { "count": len(databases), "result": [ - {"extra": {}, "text": str(database), "value": database.id} for database in databases + {"extra": {}, "text": str(database), "value": database.id} + for database in databases ], } From 66c070f74470ab9eceff1083c7db57b80da2d4f8 Mon Sep 17 00:00:00 2001 From: zef Date: Thu, 1 Sep 2022 09:26:31 -0700 Subject: [PATCH 06/11] removing ts-ignore --- .../src/dashboard/components/PropertiesModal/index.tsx | 3 +-- .../src/explore/components/PropertiesModal/index.tsx | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx index b108c6b45b1e..15c04c323a05 100644 --- a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx +++ b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx @@ -133,8 +133,7 @@ const PropertiesModal = ({ endpoint: `/api/v1/dashboard/related/${accessType}?q=${query}`, }).then(response => ({ data: response.json.result - // @ts-ignore - .filter(item => item.extra.active) + .filter((item: { extra: { active: boolean } }) => item.extra.active) .map((item: { value: number; text: string }) => ({ value: item.value, label: item.text, diff --git a/superset-frontend/src/explore/components/PropertiesModal/index.tsx b/superset-frontend/src/explore/components/PropertiesModal/index.tsx index b879c90bdc4e..cb0a6e33bbab 100644 --- a/superset-frontend/src/explore/components/PropertiesModal/index.tsx +++ b/superset-frontend/src/explore/components/PropertiesModal/index.tsx @@ -108,8 +108,7 @@ function PropertiesModal({ endpoint: `/api/v1/chart/related/owners?q=${query}`, }).then(response => ({ data: response.json.result - // @ts-ignore - .filter(item => item.extra.active) + .filter((item: { extra: { active: boolean } }) => item.extra.active) .map((item: { value: number; text: string }) => ({ value: item.value, label: item.text, From 343adfebdc67e8f4339637df4fec9cdab4b2b5ee Mon Sep 17 00:00:00 2001 From: zef Date: Thu, 1 Sep 2022 10:29:48 -0700 Subject: [PATCH 07/11] dummy From 4fa05142a7d76aaa3637750978c11c0998ea45c0 Mon Sep 17 00:00:00 2001 From: zef Date: Thu, 1 Sep 2022 11:57:44 -0700 Subject: [PATCH 08/11] dummy From 1e96503452e3400416d866e98ca8054067f0d5d3 Mon Sep 17 00:00:00 2001 From: zef Date: Thu, 1 Sep 2022 13:03:37 -0700 Subject: [PATCH 09/11] dummy From d4ee6a94f198d53d97028f890baacb61e684afac Mon Sep 17 00:00:00 2001 From: zef Date: Fri, 2 Sep 2022 08:12:24 -0700 Subject: [PATCH 10/11] dummy From d6d0dc34e02ea0d2bd4e55d6bd6543987dafebaa Mon Sep 17 00:00:00 2001 From: zef Date: Fri, 2 Sep 2022 09:27:33 -0700 Subject: [PATCH 11/11] adding extra to OAS schema --- superset/views/base_api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/superset/views/base_api.py b/superset/views/base_api.py index df212cc46870..eb957a48ef43 100644 --- a/superset/views/base_api.py +++ b/superset/views/base_api.py @@ -56,6 +56,7 @@ class RelatedResultResponseSchema(Schema): value = fields.Integer(description="The related item identifier") text = fields.String(description="The related item string representation") + extra = fields.Dict(description="The extra metadata for related item") class RelatedResponseSchema(Schema):