refactor(Dashboard): Native filters form update endpoint (#30609)

This commit is contained in:
Geido
2024-10-21 14:11:22 +03:00
committed by GitHub
parent 47c5334502
commit d9a1db044a
25 changed files with 1017 additions and 228 deletions

View File

@@ -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])