feat(grid): fetch_grid_page datasource server-side AG Grid (#41)
This commit is contained in:
@@ -0,0 +1,34 @@
|
|||||||
|
"""Datasource server-side pour AG Grid (infinite row model)."""
|
||||||
|
|
||||||
|
from src.db import count_marches, query_marches, schema
|
||||||
|
from src.utils.query_ast import ast_to_sql, filtermodel_to_ast, sort_model_to_sql
|
||||||
|
from src.utils.table import postprocess_page
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_grid_page(
|
||||||
|
filter_model,
|
||||||
|
sort_model,
|
||||||
|
start_row: int,
|
||||||
|
end_row: int,
|
||||||
|
base_where_sql: str = "TRUE",
|
||||||
|
base_params: tuple = (),
|
||||||
|
) -> tuple[list[dict], int]:
|
||||||
|
"""Renvoie (row_data, total_count) pour un bloc [start_row, end_row)."""
|
||||||
|
ast = filtermodel_to_ast(filter_model, schema)
|
||||||
|
filter_sql, filter_params = ast_to_sql(ast, schema)
|
||||||
|
where_sql = f"({base_where_sql}) AND ({filter_sql})"
|
||||||
|
params = [*base_params, *filter_params]
|
||||||
|
|
||||||
|
order_by = sort_model_to_sql(sort_model, schema) or None
|
||||||
|
total = count_marches(where_sql, params)
|
||||||
|
|
||||||
|
limit = max(0, end_row - start_row)
|
||||||
|
page = query_marches(
|
||||||
|
where_sql=where_sql,
|
||||||
|
params=params,
|
||||||
|
order_by=order_by,
|
||||||
|
limit=limit,
|
||||||
|
offset=start_row,
|
||||||
|
)
|
||||||
|
page = postprocess_page(page)
|
||||||
|
return page.to_dicts(), total
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
from src.utils.grid import fetch_grid_page
|
||||||
|
|
||||||
|
|
||||||
|
def test_fetch_grid_page_returns_rows_and_count():
|
||||||
|
rows, total = fetch_grid_page(None, None, 0, 20)
|
||||||
|
assert isinstance(rows, list)
|
||||||
|
assert isinstance(total, int)
|
||||||
|
assert total >= len(rows)
|
||||||
|
if rows:
|
||||||
|
# postprocess_page ajoute une colonne 'marche' avec un lien
|
||||||
|
assert "marche" in rows[0]
|
||||||
|
|
||||||
|
|
||||||
|
def test_fetch_grid_page_filter_reduces_count():
|
||||||
|
_, total_all = fetch_grid_page(None, None, 0, 1)
|
||||||
|
fm = {"objet": {"filterType": "text", "type": "contains", "filter": "zzzzzznope"}}
|
||||||
|
rows, total_filtered = fetch_grid_page(fm, None, 0, 20)
|
||||||
|
assert total_filtered <= total_all
|
||||||
|
assert rows == [] and total_filtered == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_fetch_grid_page_offset_slicing():
|
||||||
|
rows, _ = fetch_grid_page(None, None, 0, 5)
|
||||||
|
assert len(rows) <= 5
|
||||||
Reference in New Issue
Block a user