feat(metabase): expansion cards y documents — export, model, ProseMirror validation, copy nativo
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>
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
---
|
||||
name: metabase_create_model
|
||||
kind: function
|
||||
lang: py
|
||||
domain: infra
|
||||
version: "1.0.0"
|
||||
purity: impure
|
||||
signature: "def metabase_create_model(client: MetabaseClient, name: str, sql: str, database_id: int, collection_id: int = 0, description: str = '') -> dict"
|
||||
description: "Crea un modelo de Metabase (card con type='model') que otras cards MBQL pueden usar como fuente via source-table: 'card__<id>'."
|
||||
tags: [metabase, model, card, create, api, python]
|
||||
uses_functions: []
|
||||
uses_types: []
|
||||
returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: [httpx]
|
||||
params:
|
||||
- name: client
|
||||
desc: "instancia autenticada de MetabaseClient"
|
||||
- name: name
|
||||
desc: "nombre del modelo"
|
||||
- name: sql
|
||||
desc: "query SQL que define el modelo"
|
||||
- name: database_id
|
||||
desc: "ID de la database en Metabase donde vive la query"
|
||||
- name: collection_id
|
||||
desc: "ID de coleccion destino; 0 = root"
|
||||
- name: description
|
||||
desc: "descripcion opcional del modelo"
|
||||
output: "dict con el modelo creado: id, name, type='model', dataset_query y metadata completa"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
file_path: "python/functions/metabase/cards.py"
|
||||
---
|
||||
|
||||
## Ejemplo
|
||||
|
||||
```python
|
||||
# Crear modelo base
|
||||
model = metabase_create_model(
|
||||
client,
|
||||
name="supply_orders_base",
|
||||
sql="SELECT * FROM supply_orders WHERE status != 'cancelled'",
|
||||
database_id=6,
|
||||
collection_id=42,
|
||||
description="Ordenes de supply excluyendo canceladas",
|
||||
)
|
||||
print(model["id"]) # ej: 7820
|
||||
|
||||
# Usar el modelo como fuente en una card MBQL
|
||||
card = metabase_create_card(client, "Revenue por proveedor", {
|
||||
"database": 6,
|
||||
"type": "query",
|
||||
"query": {
|
||||
"source-table": f"card__{model['id']}",
|
||||
"aggregation": [["sum", ["field", "total", None]]],
|
||||
"breakout": [["field", "supplier_id", None]],
|
||||
},
|
||||
}, display="bar")
|
||||
```
|
||||
|
||||
## Notas
|
||||
|
||||
Un modelo es una card con `type="model"`. Metabase lo trata como una capa de abstraccion — las cards MBQL que lo referencian via `source-table: "card__<id>"` se benefician del schema inferido del modelo (tipos de columna, foreign keys, etc.).
|
||||
|
||||
A diferencia de `metabase_create_card`, esta funcion fuerza `type="model"` y siempre usa query SQL nativa. Para modelos MBQL o con configuracion avanzada (result_metadata, column types), usar `metabase_create_card_raw` con `type="model"` en el payload.
|
||||
Reference in New Issue
Block a user