mirror of
https://github.com/apache/superset.git
synced 2026-04-23 18:14:56 +00:00
refactor(Dashboard): Native filters form update endpoint (#30609)
This commit is contained in:
@@ -28,6 +28,7 @@ from superset.commands.dashboard.exceptions import (
|
||||
DashboardAccessDeniedError,
|
||||
DashboardForbiddenError,
|
||||
DashboardNotFoundError,
|
||||
DashboardUpdateFailedError,
|
||||
)
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.dashboards.filters import DashboardAccessFilter, is_uuid
|
||||
@@ -318,6 +319,77 @@ class DashboardDAO(BaseDAO[Dashboard]):
|
||||
db.session.add(dash)
|
||||
return dash
|
||||
|
||||
@classmethod
|
||||
def update_native_filters_config(
|
||||
cls,
|
||||
dashboard: Dashboard | None = None,
|
||||
attributes: dict[str, Any] | None = None,
|
||||
) -> list[dict[str, Any]]:
|
||||
if not dashboard:
|
||||
raise DashboardUpdateFailedError("Dashboard not found")
|
||||
|
||||
if attributes:
|
||||
metadata = json.loads(dashboard.json_metadata or "{}")
|
||||
native_filter_configuration = metadata.get(
|
||||
"native_filter_configuration", []
|
||||
)
|
||||
reordered_filter_ids: list[int] = attributes.get("reordered", [])
|
||||
updated_configuration = []
|
||||
|
||||
# Modify / Delete existing filters
|
||||
for conf in native_filter_configuration:
|
||||
deleted_filter = next(
|
||||
(f for f in attributes.get("deleted", []) if f == conf.get("id")),
|
||||
None,
|
||||
)
|
||||
if deleted_filter:
|
||||
continue
|
||||
|
||||
modified_filter = next(
|
||||
(
|
||||
f
|
||||
for f in attributes.get("modified", [])
|
||||
if f.get("id") == conf.get("id")
|
||||
),
|
||||
None,
|
||||
)
|
||||
if modified_filter:
|
||||
# Filter was modified, substitute it
|
||||
updated_configuration.append(modified_filter)
|
||||
else:
|
||||
# Filter was not modified, keep it as is
|
||||
updated_configuration.append(conf)
|
||||
|
||||
# Append new filters
|
||||
for new_filter in attributes.get("modified", []):
|
||||
new_filter_id = new_filter.get("id")
|
||||
if new_filter_id not in [f.get("id") for f in updated_configuration]:
|
||||
updated_configuration.append(new_filter)
|
||||
|
||||
if (
|
||||
reordered_filter_ids
|
||||
and new_filter_id not in reordered_filter_ids
|
||||
):
|
||||
reordered_filter_ids.append(new_filter_id)
|
||||
|
||||
# Reorder filters
|
||||
if reordered_filter_ids:
|
||||
filter_map = {
|
||||
filter_config["id"]: filter_config
|
||||
for filter_config in updated_configuration
|
||||
}
|
||||
|
||||
updated_configuration = [
|
||||
filter_map[filter_id]
|
||||
for filter_id in reordered_filter_ids
|
||||
if filter_id in filter_map
|
||||
]
|
||||
|
||||
metadata["native_filter_configuration"] = updated_configuration
|
||||
dashboard.json_metadata = json.dumps(metadata)
|
||||
|
||||
return updated_configuration
|
||||
|
||||
@staticmethod
|
||||
def add_favorite(dashboard: Dashboard) -> None:
|
||||
ids = DashboardDAO.favorited_ids([dashboard])
|
||||
|
||||
Reference in New Issue
Block a user