reports: Add BaseODS.set_properties() method.

This commit is contained in:
Brett Smith 2020-07-29 16:48:16 -04:00
parent f9ea7edae3
commit 59b088b573
2 changed files with 63 additions and 0 deletions

View file

@ -29,6 +29,7 @@ import babel.numbers # type:ignore[import]
import odf.config # type:ignore[import] import odf.config # type:ignore[import]
import odf.element # type:ignore[import] import odf.element # type:ignore[import]
import odf.meta # type:ignore[import]
import odf.number # type:ignore[import] import odf.number # type:ignore[import]
import odf.opendocument # type:ignore[import] import odf.opendocument # type:ignore[import]
import odf.style # type:ignore[import] import odf.style # type:ignore[import]
@ -39,7 +40,9 @@ from decimal import Decimal
from pathlib import Path from pathlib import Path
from beancount.core import amount as bc_amount from beancount.core import amount as bc_amount
from odf.namespaces import TOOLSVERSION # type:ignore[import]
from ..cliutil import VERSION
from .. import data from .. import data
from .. import filters from .. import filters
from .. import rtutil from .. import rtutil
@ -561,6 +564,7 @@ class BaseODS(BaseSpreadsheet[RT, ST], metaclass=abc.ABCMeta):
self.document = odf.opendocument.OpenDocumentSpreadsheet() self.document = odf.opendocument.OpenDocumentSpreadsheet()
self.init_settings() self.init_settings()
self.init_styles() self.init_styles()
self.set_properties()
self.sheet = self.use_sheet("Report") self.sheet = self.use_sheet("Report")
### Low-level document tree manipulation ### Low-level document tree manipulation
@ -1046,6 +1050,21 @@ class BaseODS(BaseSpreadsheet[RT, ST], metaclass=abc.ABCMeta):
aligned_style.addElement(odf.style.ParagraphProperties(textalign=textalign)) aligned_style.addElement(odf.style.ParagraphProperties(textalign=textalign))
setattr(self, f'style_{textalign}text', aligned_style) setattr(self, f'style_{textalign}text', aligned_style)
### Properties
def set_properties(self, *,
created: Optional[datetime.datetime]=None,
generator: str='conservancy_beancount',
) -> None:
if created is None:
created = datetime.datetime.now()
created_elem = self.ensure_child(self.document.meta, odf.meta.CreationDate)
created_elem.childNodes.clear()
created_elem.addText(created.isoformat())
generator_elem = self.ensure_child(self.document.meta, odf.meta.Generator)
generator_elem.childNodes.clear()
generator_elem.addText(f'{generator}/{VERSION} {TOOLSVERSION}')
### Rows and cells ### Rows and cells
def add_row(self, *cells: odf.table.TableCell, **attrs: Any) -> odf.table.TableRow: def add_row(self, *cells: odf.table.TableCell, **attrs: Any) -> odf.table.TableRow:

View file

@ -17,12 +17,14 @@
import datetime import datetime
import io import io
import itertools import itertools
import re
import pytest import pytest
import babel.core import babel.core
import babel.numbers import babel.numbers
import odf.config import odf.config
import odf.meta
import odf.number import odf.number
import odf.style import odf.style
import odf.table import odf.table
@ -704,3 +706,45 @@ def test_ods_writer_copy_element(ods_writer):
assert actual_a.getAttribute('href') == 'linkhref' assert actual_a.getAttribute('href') == 'linkhref'
assert actual_a.text == 'linktext' assert actual_a.text == 'linktext'
assert actual2.text == 'para2' assert actual2.text == 'para2'
def test_ods_writer_default_properties(ods_writer):
meta = ods_writer.document.meta
yesterday = datetime.datetime.now() - datetime.timedelta(days=1)
creation_date_elem = get_child(meta, odf.meta.CreationDate)
creation_date = datetime.datetime.strptime(
creation_date_elem.text, '%Y-%m-%dT%H:%M:%S.%f',
)
assert creation_date > yesterday
generator = get_child(meta, odf.meta.Generator)
assert re.match(r'conservancy_beancount/\d+\.\d+', generator.text)
def test_ods_writer_set_properties(ods_writer):
ctime = datetime.datetime(2009, 9, 19, 9, 49, 59)
ods_writer.set_properties(created=ctime, generator='testgen')
meta = ods_writer.document.meta
creation_date_elem = get_child(meta, odf.meta.CreationDate)
assert creation_date_elem.text == ctime.isoformat()
generator = get_child(meta, odf.meta.Generator)
assert re.match(r'testgen/\d+\.\d+', generator.text)
@pytest.mark.parametrize('value,exptype', [
(1, 'float'),
(12.34, 'float'),
(Decimal('5.99'), 'float'),
(datetime.date(2009, 8, 17), 'date'),
(datetime.datetime(2009, 8, 17, 18, 38, 58), 'date'),
(True, 'boolean'),
(False, 'boolean'),
('foo', None)
])
def test_ods_writer_set_custom_property(ods_writer, value, exptype):
cprop = ods_writer.set_custom_property('cprop', value)
assert cprop.getAttribute('name') == 'cprop'
assert cprop.getAttribute('valuetype') == exptype
if exptype == 'boolean':
expected = str(value).lower()
elif exptype == 'date':
expected = value.isoformat()
else:
expected = str(value)
assert cprop.text == expected