diff --git a/src/utils/table.py b/src/utils/table.py index 096acf5..2c0d2ea 100644 --- a/src/utils/table.py +++ b/src/utils/table.py @@ -410,6 +410,22 @@ def table_postprocess(lff) -> pl.DataFrame: return dff +def postprocess_page(dff: pl.DataFrame) -> pl.DataFrame: + """Post-traitement à appliquer sur une page déjà paginée. + + Équivalent à table_postprocess mais prend une DataFrame (pas un LazyFrame) + et ne matérialise rien de plus. À appeler après que la pagination ait été + poussée en SQL. + """ + dff = dff.with_columns(pl.all().cast(pl.String).fill_null("")) + dff = add_links(dff) + if "sourceFile" in dff.columns: + dff = add_resource_link(dff) + if dff.height > 0: + dff = format_values(dff) + return dff + + def prepare_table_data( data, data_timestamp, filter_query, page_current, page_size, sort_by, source_table ): diff --git a/tests/test_table.py b/tests/test_table.py index cc89386..c47f967 100644 --- a/tests/test_table.py +++ b/tests/test_table.py @@ -303,3 +303,19 @@ def test_prepare_table_data_with_external_data_does_not_use_cache( ) assert sentinel["called"] is False + + +def test_postprocess_page_produces_same_result_as_full_then_slice( + flask_app, sample_lff +): + """Post-traiter 20 lignes doit donner le même résultat que post-traiter + l'ensemble puis slicer.""" + from src.utils import table + + full = sample_lff.collect() + with flask_app.app_context(): + via_full = table.table_postprocess(full.lazy()).slice(0, 1) + via_page = table.postprocess_page(full.slice(0, 1)) + assert via_full.columns == via_page.columns + for col in via_full.columns: + assert via_full[col].to_list() == via_page[col].to_list()