cf70385bca
Cards: export_card (CSV/XLSX/JSON), create_model (type=model para fuentes MBQL). Documents: prosemirror_card_embed helper (resizeNode envolviendo cardEmbed), validacion automatica contra whitelist TipTap antes de enviar, copy_document refactorizado al endpoint nativo POST /api/document/:id/copy. Docs: dataset_query legacy vs MBQL5, template-tags, whitelist de nodos. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3.0 KiB
3.0 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | params | output | tested | tests | test_file_path | file_path | |||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| metabase_create_card | function | py | infra | 1.0.0 | impure | def metabase_create_card(client: MetabaseClient, name: str, dataset_query: dict, display: str = 'table', collection_id: int = 0, description: str = '') -> dict | Crea una card/pregunta en Metabase con query SQL nativa o MBQL. Endpoint: POST /api/card. |
|
false | error_go_core |
|
|
dict: objeto card creado con id y toda su configuración | false | python/functions/metabase/cards.py |
Ejemplo
card = metabase_create_card(client, "Revenue", {
"database": 1, "type": "native",
"native": {"query": "SELECT SUM(total) FROM orders"},
}, display="scalar")
Ejemplo con template-tags (filtros)
card = metabase_create_card(client, "Revenue filtrable", {
"database": 6, "type": "native",
"native": {
"query": "SELECT * FROM orders WHERE 1=1 [[AND date >= {{fecha_desde}}]]",
"template-tags": {
"fecha_desde": {
"name": "fecha_desde",
"display-name": "Fecha desde",
"id": "fecha_desde_tag",
"type": "text"
}
}
},
}, display="table")
Formato dataset_query — IMPORTANTE
Hay DOS formatos y hay que saber cuál usar:
Para CREAR cards (POST /api/card) — formato legacy:
{"database": id, "type": "native", "native": {"query": "SELECT ..."}}
Lo que DEVUELVE Metabase al LEER cards (GET /api/card/:id) — formato MBQL5:
{"lib/type": "mbql/query", "database": id,
"stages": [{"lib/type": "mbql.stage/native", "native": "SELECT ..."}]}
Son representaciones distintas de lo mismo. Al leer una card existente y querer extraer el SQL:
card = metabase_get_card(client, 42)
ds = card["dataset_query"]
# Formato MBQL5 (Metabase reciente)
stages = ds.get("stages", [])
if stages:
sql = stages[0].get("native", "")
# Formato legacy
else:
sql = ds.get("native", {}).get("query", "")
Al crear/actualizar cards, usar SIEMPRE el formato legacy — Metabase lo acepta y lo convierte internamente.
Notas
displayválidos: scalar, table, line, bar, pie, area, row, funnel, combo, pivot, map, scatter, waterfall, gauge, progress, smartscalar, sankey.- Para queries que se repiten como base de otras cards, considerar crear un "model" (type="model") y referenciar desde otras cards con
source-table: "card__<id>".