20f72edb5a
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
"""Copia parameter_mappings de un dashcard a otro dentro del mismo dashboard."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from .client import MetabaseClient
|
|
from .dashboards import metabase_get_dashboard
|
|
|
|
|
|
def metabase_copy_dashcard_mappings(
|
|
client: MetabaseClient,
|
|
*,
|
|
dashboard_id: int,
|
|
source_card_id: int,
|
|
dest_card_id: int,
|
|
) -> list[dict]:
|
|
"""Copia los parameter_mappings del primer dashcard fuente al card destino.
|
|
|
|
Obtiene el dashboard, localiza el primer dashcard cuyo card_id coincide con
|
|
source_card_id y devuelve una lista nueva de parameter_mappings con card_id
|
|
sustituido por dest_card_id. No muta el dashboard ni los mappings originales.
|
|
|
|
Args:
|
|
client: Cliente autenticado con sesion activa.
|
|
dashboard_id: ID del dashboard que contiene ambas cards.
|
|
source_card_id: card_id del dashcard del que se copian los mappings.
|
|
dest_card_id: card_id que se asigna en los mappings copiados.
|
|
|
|
Returns:
|
|
Lista de dicts con los parameter_mappings adaptados al card destino.
|
|
Cada elemento tiene: parameter_id, card_id (dest_card_id), target.
|
|
Retorna lista vacia si el dashcard fuente no tiene mappings.
|
|
|
|
Raises:
|
|
ValueError: Si source_card_id no aparece en ninguna dashcard del dashboard.
|
|
|
|
Example:
|
|
>>> mappings = metabase_copy_dashcard_mappings(
|
|
... client,
|
|
... dashboard_id=10,
|
|
... source_card_id=42,
|
|
... dest_card_id=99,
|
|
... )
|
|
>>> # Usar los mappings al añadir el nuevo dashcard al dashboard
|
|
>>> new_dashcard = {
|
|
... "id": -1,
|
|
... "card_id": 99,
|
|
... "col": 0, "row": 20, "size_x": 6, "size_y": 4,
|
|
... "parameter_mappings": mappings,
|
|
... "visualization_settings": {},
|
|
... }
|
|
"""
|
|
dashboard = metabase_get_dashboard(client, dashboard_id)
|
|
dashcards: list[dict] = dashboard.get("dashcards") or []
|
|
|
|
source_dc: dict | None = None
|
|
for dc in dashcards:
|
|
if dc.get("card_id") == source_card_id:
|
|
source_dc = dc
|
|
break
|
|
|
|
if source_dc is None:
|
|
raise ValueError(
|
|
f"card {source_card_id} not in dashboard {dashboard_id}"
|
|
)
|
|
|
|
source_mappings: list[dict] = source_dc.get("parameter_mappings") or []
|
|
|
|
return [
|
|
{
|
|
"parameter_id": m["parameter_id"],
|
|
"card_id": dest_card_id,
|
|
"target": m["target"],
|
|
}
|
|
for m in source_mappings
|
|
]
|