Files
fn_registry/python/functions/metabase/metabase_smartscalar_anothercolumn_viz.py
T
egutierrez d110aa40f9 feat(metabase): auto-commit con 17 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 18:40:22 +02:00

112 lines
4.3 KiB
Python

"""Construye visualization_settings para smartscalar con comparacion anotherColumn."""
from __future__ import annotations
from .metabase_viz_column_format import metabase_viz_column_format
def metabase_smartscalar_anothercolumn_viz(
*,
main_column: str,
compare_column: str,
label: str = "vs N-1",
number_style: str = "percent",
decimals: int = 2,
currency: str = "EUR",
comparison_id: str = "cmp_n1",
) -> dict:
"""Construye visualization_settings para smartscalar con comparacion anotherColumn.
Genera el dict completo de ``visualization_settings`` para una card con
``display=smartscalar`` que muestra ``main_column`` con una comparacion
de tipo ``anotherColumn`` apuntando a ``compare_column`` (ambas columnas
en la misma fila del query).
Este patron es util cuando el query devuelve directamente el valor actual
y el valor de comparacion como columnas separadas (en lugar del patron de
2 filas temporales de ``previousValue``).
Args:
main_column: Nombre de la columna que se muestra como valor principal
en el smartscalar. Debe coincidir exactamente con el nombre de
columna en el resultado del query.
compare_column: Nombre de la columna que se usa como valor de
comparacion. Debe estar en el mismo resultado del query que
``main_column``.
label: Etiqueta mostrada bajo el delta de comparacion. Default
``"vs N-1"``.
number_style: Estilo de formato para ambas columnas. Valores:
``"percent"``, ``"currency"``, ``"decimal"``, ``""`` (default
Metabase). Default ``"percent"``.
decimals: Numero de decimales para ambas columnas. Default ``2``.
currency: Codigo ISO de moneda (``"EUR"``, ``"USD"``, ...). Solo
relevante cuando ``number_style="currency"``. Default ``"EUR"``.
comparison_id: Identificador interno de la comparacion dentro del
array ``scalar.comparisons``. Debe ser unico por card. Default
``"cmp_n1"``.
Returns:
Dict con la estructura completa de ``visualization_settings``::
{
"scalar.field": "<main_column>",
"scalar.comparisons": [
{"id": "<comparison_id>", "type": "anotherColumn",
"column": "<compare_column>", "label": "<label>"},
],
"column_settings": {
'["name","<main_column>"]': {...formato...},
'["name","<compare_column>"]': {...mismo formato...},
},
}
Example:
>>> viz = metabase_smartscalar_anothercolumn_viz(
... main_column="Margen",
... compare_column="MargenN1",
... label="vs N-1",
... number_style="percent",
... decimals=2,
... )
>>> assert viz["scalar.field"] == "Margen"
>>> assert viz["scalar.comparisons"][0]["type"] == "anotherColumn"
>>> assert viz["scalar.comparisons"][0]["column"] == "MargenN1"
>>> assert '["name","Margen"]' in viz["column_settings"]
>>> assert '["name","MargenN1"]' in viz["column_settings"]
>>> # Con formato moneda
>>> viz = metabase_smartscalar_anothercolumn_viz(
... main_column="Venta",
... compare_column="VentaN1",
... label="vs ano anterior",
... number_style="currency",
... decimals=0,
... currency="EUR",
... )
"""
# Argumentos de formato comunes a ambas columnas
fmt_kwargs: dict = {
"number_style": number_style,
"decimals": decimals,
}
if number_style == "currency" and currency:
fmt_kwargs["currency"] = currency
fmt_kwargs["currency_in_header"] = False
column_settings: dict = {}
column_settings.update(metabase_viz_column_format(main_column, **fmt_kwargs))
column_settings.update(metabase_viz_column_format(compare_column, **fmt_kwargs))
return {
"scalar.field": main_column,
"scalar.comparisons": [
{
"id": comparison_id,
"type": "anotherColumn",
"column": compare_column,
"label": label,
}
],
"column_settings": column_settings,
}