diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/DatasetPanel/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/DatasetPanel/index.tsx new file mode 100644 index 0000000000000..9fe93b8fb5888 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/DatasetPanel/index.tsx @@ -0,0 +1,23 @@ +/** + * 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. + */ +import React from 'react'; + +export default function DatasetPanel() { + return
Dataset Panel
; +} diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Footer/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Footer/index.tsx new file mode 100644 index 0000000000000..07c35741eef3e --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Footer/index.tsx @@ -0,0 +1,23 @@ +/** + * 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. + */ +import React from 'react'; + +export default function Footer() { + return
Footer
; +} diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Header/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Header/index.tsx new file mode 100644 index 0000000000000..44f0e19f7bcc6 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/Header/index.tsx @@ -0,0 +1,23 @@ +/** + * 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. + */ +import React from 'react'; + +export default function Header() { + return
Header
; +} diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/LeftPanel/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/LeftPanel/index.tsx new file mode 100644 index 0000000000000..5ffb6a12c9ce0 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/LeftPanel/index.tsx @@ -0,0 +1,23 @@ +/** + * 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. + */ +import React from 'react'; + +export default function LeftPanel() { + return
Left Panel
; +} diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/RightPanel/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/RightPanel/index.tsx new file mode 100644 index 0000000000000..60f9589aad2ef --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/RightPanel/index.tsx @@ -0,0 +1,23 @@ +/** + * 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. + */ +import React from 'react'; + +export default function RightPanel() { + return
Right Panel
; +} diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/index.tsx new file mode 100644 index 0000000000000..974091f1efe9c --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetPage/index.tsx @@ -0,0 +1,38 @@ +/** + * 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. + */ +import React from 'react'; +import Header from './Header'; +import DatasetPanel from './DatasetPanel'; +import LeftPanel from './LeftPanel'; +import RightPanel from './RightPanel'; +import Footer from './Footer'; + +export default function DatasetPage() { + return ( +
+
+ +
+ +
+
+ +
+ ); +} diff --git a/superset-frontend/src/views/routes.tsx b/superset-frontend/src/views/routes.tsx index dbb9ca2fab858..732686838fa9f 100644 --- a/superset-frontend/src/views/routes.tsx +++ b/superset-frontend/src/views/routes.tsx @@ -81,6 +81,14 @@ const DatasetList = lazy( /* webpackChunkName: "DatasetList" */ 'src/views/CRUD/data/dataset/DatasetList' ), ); + +const DatasetPage = lazy( + () => + import( + /* webpackChunkName: "DatasetEditor" */ 'src/views/CRUD/data/dataset/DatasetPage/index' + ), +); + const ExecutionLog = lazy( () => import( @@ -189,6 +197,14 @@ export const routes: Routes = [ path: '/superset/explore/p', Component: ExplorePage, }, + { + path: '/dataset/add/', + Component: DatasetPage, + }, + { + path: '/dataset/:datasetId', + Component: DatasetPage, + }, ]; const frontEndRoutes = routes diff --git a/superset/initialization/__init__.py b/superset/initialization/__init__.py index 588d9b66bfd11..8dfeff9942aba 100644 --- a/superset/initialization/__init__.py +++ b/superset/initialization/__init__.py @@ -169,7 +169,7 @@ def init_views(self) -> None: DatabaseView, ExcelToDatabaseView, ) - from superset.views.datasource.views import Datasource + from superset.views.datasource.views import DatasetEditor, Datasource from superset.views.dynamic_plugins import DynamicPluginsView from superset.views.explore import ExplorePermalinkView, ExploreView from superset.views.key_value import KV @@ -289,6 +289,7 @@ def init_views(self) -> None: appbuilder.add_view_no_menu(Dashboard) appbuilder.add_view_no_menu(DashboardModelViewAsync) appbuilder.add_view_no_menu(Datasource) + appbuilder.add_view_no_menu(DatasetEditor) appbuilder.add_view_no_menu(EmbeddedView) appbuilder.add_view_no_menu(ExploreView) appbuilder.add_view_no_menu(ExplorePermalinkView) diff --git a/superset/views/datasource/views.py b/superset/views/datasource/views.py index 60ee4baddcca2..2c137fab79610 100644 --- a/superset/views/datasource/views.py +++ b/superset/views/datasource/views.py @@ -18,10 +18,10 @@ from collections import Counter from typing import Any -from flask import request -from flask_appbuilder import expose +from flask import redirect, request +from flask_appbuilder import expose, permission_name from flask_appbuilder.api import rison -from flask_appbuilder.security.decorators import has_access_api +from flask_appbuilder.security.decorators import has_access, has_access_api from flask_babel import _ from marshmallow import ValidationError from sqlalchemy.exc import NoSuchTableError @@ -203,3 +203,27 @@ def samples(self) -> FlaskResponse: payload=payload, ) return self.json_response({"result": rv}) + + +class DatasetEditor(BaseSupersetView): + route_base = "/dataset" + class_permission_name = "Dataset" + + @expose("/add/") + @has_access + @permission_name("read") + def root(self) -> FlaskResponse: + dev = request.args.get("testing") + if dev is not None: + return super().render_app_template() + return redirect("/") + + @expose("/", methods=["GET"]) + @has_access + @permission_name("read") + # pylint: disable=unused-argument + def show(self, pk: int) -> FlaskResponse: + dev = request.args.get("testing") + if dev is not None: + return super().render_app_template() + return redirect("/")