Skip to content

Commit 74dbe24

Browse files
authored
Merge pull request #608 from iommirocks/generator-auto_rowspan
2 parents 46b2b53 + 9f8f565 commit 74dbe24

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

iommi/table.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1937,6 +1937,7 @@ def on_refine_done(self):
19371937
self.initial_rows = self.rows
19381938
self.header = HeaderConfig(_name='header', **self.header).refine_done(parent=self)
19391939
self.row = RowConfig(**self.row).refine_done(parent=self)
1940+
self._preprocessed_rows = None
19401941

19411942
# In bind initial_rows will be used to set these 3 (in that order)
19421943
self.sorted_rows = None
@@ -2220,7 +2221,8 @@ def on_bind(self) -> None:
22202221
bind_member(self, name='bulk_container')
22212222

22222223
def get_visible_rows(self):
2223-
self.visible_rows = self.parts.page.rows
2224+
if self.visible_rows is None:
2225+
self.visible_rows = self.parts.page.rows
22242226
return self.visible_rows
22252227

22262228
def _bind_query(self):
@@ -2280,7 +2282,6 @@ def render_actions(self):
22802282
def _prepare_auto_rowspan(self):
22812283
auto_rowspan_columns = [column for column in values(self.columns) if column.auto_rowspan]
22822284
if auto_rowspan_columns:
2283-
self.visible_rows = list(self.get_visible_rows())
22842285
no_value_set = object()
22852286
for column in auto_rowspan_columns:
22862287
if column.cell.attrs.get('rowspan', no_value_set) is not no_value_set:
@@ -2412,12 +2413,13 @@ def cells_for_rows(self, paginate=True):
24122413
rows = self.get_visible_rows()
24132414
else:
24142415
rows = self.sorted_and_filtered_rows
2415-
preprocessed_rows = self.invoke_callback(self.preprocess_rows, rows=rows)
2416+
if not self._preprocessed_rows:
2417+
self._preprocessed_rows = list(self.invoke_callback(self.preprocess_rows, rows=rows))
24162418

24172419
row_groups = [c for c in values(self.columns) if c.row_group.include]
24182420
row_group_values = {c._name: None for c in row_groups}
24192421

2420-
for i, row in enumerate(preprocessed_rows):
2422+
for i, row in enumerate(self._preprocessed_rows):
24212423
row = self.invoke_callback(self.preprocess_row, row=row)
24222424
assert row is not None, 'preprocess_row must return the row'
24232425

iommi/table__tests.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4468,3 +4468,34 @@ def test_annotate_on_broken_filters():
44684468
</tbody>
44694469
""",
44704470
)
4471+
4472+
4473+
def test_auto_rowspan_and_render_twice_generator(NoSortTable): # noqa: N803
4474+
class TestTable(NoSortTable):
4475+
foo = Column(auto_rowspan=True)
4476+
4477+
rows = [
4478+
Struct(foo=1),
4479+
Struct(foo=1),
4480+
Struct(foo=2),
4481+
Struct(foo=2),
4482+
]
4483+
4484+
# language=html
4485+
expected_html = """
4486+
<table class="table" >
4487+
<thead>
4488+
<tr> <th class="first_column subheader"> Foo </th> </tr>
4489+
</thead>
4490+
<tbody>
4491+
<tr> <td rowspan="2"> 1 </td> </tr>
4492+
<tr> <td style="display: none"> 1 </td> </tr>
4493+
<tr> <td rowspan="2"> 2 </td> </tr>
4494+
<tr> <td style="display: none"> 2 </td> </tr>
4495+
</tbody>
4496+
</table>"""
4497+
4498+
t = TestTable(rows=(x for x in rows))
4499+
t = t.bind(request=req('get'))
4500+
verify_table_html(table=t, expected_html=expected_html)
4501+
verify_table_html(table=t, expected_html=expected_html)

0 commit comments

Comments
 (0)