From 6703d1af87ad70057e35bd6493400872e2cef266 Mon Sep 17 00:00:00 2001 From: Brett Smith Date: Mon, 15 Mar 2021 11:59:12 -0400 Subject: [PATCH] reports: BaseODS puts each line of strings in a P tag. This seems to be the most straightforward way to get Calc to automatically determine a nice row height for multi-line string cells. This has become a lot more noticeable now that query-report supports putting postal addresses in cells. --- conservancy_beancount/reports/core.py | 13 ++++++++++--- tests/test_reports_fund.py | 4 +++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/conservancy_beancount/reports/core.py b/conservancy_beancount/reports/core.py index 300e404..524e729 100644 --- a/conservancy_beancount/reports/core.py +++ b/conservancy_beancount/reports/core.py @@ -1436,9 +1436,15 @@ class BaseODS(BaseSpreadsheet[RT, ST], metaclass=abc.ABCMeta): return self.multilink_cell(self._meta_link_pairs(links), **attrs) def multiline_cell(self, lines: Iterable[Any], **attrs: Any) -> odf.table.TableCell: + item_lines = [str(item).splitlines() for item in lines if item is not None] + if any(len(seq) > 1 for seq in item_lines): + for seq in item_lines: + seq.append('') + seq.pop() cell = odf.table.TableCell(valuetype='string', **attrs) - for line in lines: - cell.addElement(odf.text.P(text=str(line))) + for seq in item_lines: + for line in seq: + cell.addElement(odf.text.P(text=line)) return cell def multilink_cell(self, links: Iterable[LinkType], **attrs: Any) -> odf.table.TableCell: @@ -1457,7 +1463,8 @@ class BaseODS(BaseSpreadsheet[RT, ST], metaclass=abc.ABCMeta): def string_cell(self, text: str, **attrs: Any) -> odf.table.TableCell: cell = odf.table.TableCell(valuetype='string', **attrs) - cell.addElement(odf.text.P(text=text)) + for line in text.splitlines(): + cell.addElement(odf.text.P(text=line)) return cell def write_row(self, row: RT) -> None: diff --git a/tests/test_reports_fund.py b/tests/test_reports_fund.py index 569129b..4466015 100644 --- a/tests/test_reports_fund.py +++ b/tests/test_reports_fund.py @@ -193,7 +193,9 @@ def check_ods_sheet(sheet, account_balances, *, full): cells = iter(testutil.ODSCell.from_row(row)) try: fund = next(cells).firstChild.text - except (AttributeError, StopIteration): + except AttributeError: + fund = '' + except StopIteration: continue try: balances = account_bals.pop(fund)