This is an automated email from the ASF dual-hosted git repository.
dpgaspar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new b051f779e6 chore: bump FAB to 5.0.2 (#36086)
b051f779e6 is described below
commit b051f779e678a317a175bb77de267d13d7fa04b4
Author: Daniel Vaz Gaspar <[email protected]>
AuthorDate: Fri Nov 14 11:57:50 2025 +0000
chore: bump FAB to 5.0.2 (#36086)
---
pyproject.toml | 2 +-
requirements/base.txt | 2 +-
requirements/development.txt | 2 +-
superset-core/pyproject.toml | 2 +-
superset/migrations/shared/utils.py | 4 +-
...8ocx6rto6_expand_username_field_to_128_chars.py | 97 ++++++++++++++++++++++
6 files changed, 103 insertions(+), 6 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index cfd2f44451..92efcf0a99 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -48,7 +48,7 @@ dependencies = [
"cryptography>=42.0.4, <45.0.0",
"deprecation>=2.1.0, <2.2.0",
"flask>=2.2.5, <3.0.0",
- "flask-appbuilder>=5.0.0,<6",
+ "flask-appbuilder>=5.0.2,<6",
"flask-caching>=2.1.0, <3",
"flask-compress>=1.13, <2.0",
"flask-talisman>=1.0.0, <2.0",
diff --git a/requirements/base.txt b/requirements/base.txt
index db48526bb7..076404726a 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -116,7 +116,7 @@ flask==2.3.3
# flask-session
# flask-sqlalchemy
# flask-wtf
-flask-appbuilder==5.0.0
+flask-appbuilder==5.0.2
# via
# apache-superset (pyproject.toml)
# apache-superset-core
diff --git a/requirements/development.txt b/requirements/development.txt
index 3a2877cf57..b479423133 100644
--- a/requirements/development.txt
+++ b/requirements/development.txt
@@ -249,7 +249,7 @@ flask==2.3.3
# flask-sqlalchemy
# flask-testing
# flask-wtf
-flask-appbuilder==5.0.0
+flask-appbuilder==5.0.2
# via
# -c requirements/base-constraint.txt
# apache-superset
diff --git a/superset-core/pyproject.toml b/superset-core/pyproject.toml
index 0511509caa..88b21657bd 100644
--- a/superset-core/pyproject.toml
+++ b/superset-core/pyproject.toml
@@ -42,7 +42,7 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
- "flask-appbuilder>=5.0.0,<6",
+ "flask-appbuilder>=5.0.2,<6",
]
[project.urls]
diff --git a/superset/migrations/shared/utils.py
b/superset/migrations/shared/utils.py
index 9adf7978bf..dbcfa2f9f5 100644
--- a/superset/migrations/shared/utils.py
+++ b/superset/migrations/shared/utils.py
@@ -57,13 +57,13 @@ DEFAULT_BATCH_SIZE = int(os.environ.get("BATCH_SIZE", 1000))
def get_table_column(
table_name: str,
column_name: str,
-) -> Optional[list[dict[str, Any]]]:
+) -> Optional[dict[str, Any]]:
"""
Get the specified column.
:param table_name: The Table name
:param column_name: The column name
- :returns: The column
+ :returns: The column dictionary or None if not found
"""
insp = inspect(op.get_context().bind)
diff --git
a/superset/migrations/versions/2025-11-12_12-54_x2s8ocx6rto6_expand_username_field_to_128_chars.py
b/superset/migrations/versions/2025-11-12_12-54_x2s8ocx6rto6_expand_username_field_to_128_chars.py
new file mode 100644
index 0000000000..e459e04db6
--- /dev/null
+++
b/superset/migrations/versions/2025-11-12_12-54_x2s8ocx6rto6_expand_username_field_to_128_chars.py
@@ -0,0 +1,97 @@
+# 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.
+"""Expand username field to 128 chars
+
+Revision ID: x2s8ocx6rto6
+Revises: c233f5365c9e
+Create Date: 2025-11-12 12:54:00.000000
+
+"""
+
+import logging
+
+import sqlalchemy as sa
+from alembic import op
+
+from superset.migrations.shared.utils import get_table_column
+
+logger = logging.getLogger("alembic.env")
+
+# revision identifiers, used by Alembic.
+revision = "x2s8ocx6rto6"
+down_revision = "c233f5365c9e"
+
+
+def upgrade():
+ """Expand ab_user.username field from 64 to 128 characters."""
+ # Check current column length to avoid errors if already upgraded
+ column_info = get_table_column("ab_user", "username")
+
+ if column_info is None:
+ logger.warning("Column ab_user.username not found. Skipping
migration.")
+ return
+
+ # Get current length - check the type attribute
+ current_type = column_info.get("type")
+ current_length = getattr(current_type, "length", None)
+
+ if current_length is not None and current_length == 128:
+ logger.info(
+ "Column ab_user.username already has length %s. Skipping
migration.",
+ current_length,
+ )
+ return
+
+ with op.batch_alter_table("ab_user") as batch_op:
+ batch_op.alter_column(
+ "username",
+ existing_type=sa.String(current_length)
+ if current_length
+ else sa.String(64),
+ type_=sa.String(128),
+ existing_nullable=False,
+ )
+
+
+def downgrade():
+ """Revert ab_user.username field from 128 to 64 characters."""
+ # Check current column length
+ column_info = get_table_column("ab_user", "username")
+
+ if column_info is None:
+ logger.warning("Column ab_user.username not found. Skipping
downgrade.")
+ return
+
+ current_type = column_info.get("type")
+ current_length = getattr(current_type, "length", None)
+
+ if current_length is not None and current_length <= 64:
+ logger.info(
+ "Column ab_user.username already has length %s. Skipping
downgrade.",
+ current_length,
+ )
+ return
+
+ with op.batch_alter_table("ab_user") as batch_op:
+ batch_op.alter_column(
+ "username",
+ existing_type=sa.String(current_length)
+ if current_length
+ else sa.String(128),
+ type_=sa.String(64),
+ existing_nullable=False,
+ )