From 9f9c3a8f37ab39310e66d6a32b337b2d020e0395 Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Fri, 12 Jan 2024 11:18:39 -0500 Subject: [PATCH] fix(database): allow filtering by UUID (#26469) --- superset/databases/api.py | 11 +++++++ tests/unit_tests/databases/api_test.py | 40 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/superset/databases/api.py b/superset/databases/api.py index caa46d31645..701aed75da6 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -193,6 +193,17 @@ class DatabaseRestApi(BaseSupersetModelRestApi): edit_columns = add_columns + search_columns = [ + "allow_file_upload", + "allow_dml", + "allow_run_async", + "created_by", + "changed_by", + "database_name", + "expose_in_sqllab", + "uuid", + ] + search_filters = {"allow_file_upload": [DatabaseUploadEnabledFilter]} list_select_columns = list_columns + ["extra", "sqlalchemy_uri", "password"] diff --git a/tests/unit_tests/databases/api_test.py b/tests/unit_tests/databases/api_test.py index 24fde883695..d64c0612565 100644 --- a/tests/unit_tests/databases/api_test.py +++ b/tests/unit_tests/databases/api_test.py @@ -27,6 +27,46 @@ from pytest_mock import MockFixture from sqlalchemy.orm.session import Session +def test_filter_by_uuid( + session: Session, + client: Any, + full_api_access: None, +) -> None: + """ + Test that we can filter databases by UUID. + + Note: this functionality is not used by the Superset UI, but is needed by 3rd + party tools that use the Superset API. If this tests breaks, please make sure + that the functionality is properly deprecated between major versions with + enough warning so that tools can be adapted. + """ + from superset.databases.api import DatabaseRestApi + from superset.models.core import Database + + DatabaseRestApi.datamodel.session = session + + # create table for databases + Database.metadata.create_all(session.get_bind()) # pylint: disable=no-member + session.add( + Database( + database_name="my_db", + sqlalchemy_uri="sqlite://", + uuid=UUID("7c1b7880-a59d-47cd-8bf1-f1eb8d2863cb"), + ) + ) + session.commit() + + response = client.get( + "/api/v1/database/?q=(filters:!((col:uuid,opr:eq,value:" + "%277c1b7880-a59d-47cd-8bf1-f1eb8d2863cb%27)))" + ) + assert response.status_code == 200 + + payload = response.json + assert len(payload["result"]) == 1 + assert payload["result"][0]["uuid"] == "7c1b7880-a59d-47cd-8bf1-f1eb8d2863cb" + + def test_post_with_uuid( session: Session, client: Any,