d110aa40f9
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
112 lines
4.3 KiB
Python
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,
|
|
}
|