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

diegopucci pushed a commit to branch geido/fix/postgres-db-schema-catalogs
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 1f66feb9dfb7e43843bd1bad9a352e647dfaf986
Author: Diego Pucci <[email protected]>
AuthorDate: Fri Jun 14 17:27:20 2024 +0200

    Fix catalog schemas fetch
---
 superset/commands/database/create.py | 45 +++++++++++++++++++++++++++++++-----
 1 file changed, 39 insertions(+), 6 deletions(-)

diff --git a/superset/commands/database/create.py 
b/superset/commands/database/create.py
index 9efb39b75a..b982bf708d 100644
--- a/superset/commands/database/create.py
+++ b/superset/commands/database/create.py
@@ -19,7 +19,6 @@ from typing import Any, Optional
 
 from flask import current_app
 from flask_appbuilder.models.sqla import Model
-from flask_babel import gettext as _
 from marshmallow import ValidationError
 
 from superset import is_feature_enabled
@@ -41,6 +40,7 @@ from superset.commands.database.ssh_tunnel.exceptions import (
 from superset.commands.database.test_connection import 
TestConnectionDatabaseCommand
 from superset.daos.database import DatabaseDAO
 from superset.daos.exceptions import DAOCreateFailedError
+from superset.databases.ssh_tunnel.models import SSHTunnel
 from superset.exceptions import SupersetErrorsException
 from superset.extensions import db, event_logger, security_manager
 from superset.models.core import Database
@@ -98,12 +98,29 @@ class CreateDatabaseCommand(BaseCommand):
 
             db.session.commit()
 
-            # adding a new database we always want to force refresh schema list
-            schemas = database.get_all_schema_names(cache=False, 
ssh_tunnel=ssh_tunnel)
-            for schema in schemas:
-                security_manager.add_permission_view_menu(
-                    "schema_access", 
security_manager.get_schema_perm(database, schema)
+            # add catalog/schema permissions
+            if database.db_engine_spec.supports_catalog:
+                catalogs = database.get_all_catalog_names(
+                    cache=False,
+                    ssh_tunnel=ssh_tunnel,
                 )
+                for catalog in catalogs:
+                    security_manager.add_permission_view_menu(
+                        "catalog_access",
+                        security_manager.get_catalog_perm(
+                            database.database_name, catalog
+                        ),
+                    )
+            else:
+                # add a dummy catalog for DBs that don't support them
+                catalogs = [None]
+
+            for catalog in catalogs:
+                try:
+                    self.add_schema_permissions(database, catalog, ssh_tunnel)
+                except Exception:
+                    logger.warning("Error processing catalog '%s'", catalog)
+                    continue
 
         except (
             SSHTunnelInvalidError,
@@ -135,6 +152,22 @@ class CreateDatabaseCommand(BaseCommand):
 
         return database
 
+    def add_schema_permissions(
+        self, database: Database, catalog: Optional[str], ssh_tunnel: SSHTunnel
+    ) -> None:
+        for schema in database.get_all_schema_names(
+            catalog=catalog,
+            cache=False,
+            ssh_tunnel=ssh_tunnel,
+        ):
+            security_manager.add_permission_view_menu(
+                "schema_access",
+                security_manager.get_schema_perm(
+                    database.database_name,
+                    schema,
+                ),
+            )
+
     def validate(self) -> None:
         exceptions: list[ValidationError] = []
         sqlalchemy_uri: Optional[str] = self._properties.get("sqlalchemy_uri")

Reply via email to