From 87106c3769504379b527c51380a204c11e151e52 Mon Sep 17 00:00:00 2001 From: duskybomb Date: Tue, 3 Jul 2018 23:00:45 +0530 Subject: [PATCH 1/2] Implement reading and setting default values --- facturx/facturx.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/facturx/facturx.py b/facturx/facturx.py index 09c5df3..bc2257b 100644 --- a/facturx/facturx.py +++ b/facturx/facturx.py @@ -68,6 +68,7 @@ def __init__(self, pdf_invoice, flavor='factur-x', level='minimum'): else: self.flavor, self.xml = xml_flavor.XMLFlavor.from_template(flavor, level) logger.info('PDF does not have XML embedded. Adding from template.') + self._add_default_to_xml() self.flavor.check_xsd(self.xml) self._namespaces = self.xml.nsmap @@ -95,10 +96,17 @@ def _xml_from_file(self, pdf_file): xml_filename) return xml_content + def _add_default_to_xml(self): + fields_data = xml_flavor.FIELDS + + for field, values in fields_data.items(): + if '_default' in values and self[field] is None: + self[field] = fields_data[field]['_default'] + def __getitem__(self, field_name): path = self.flavor._get_xml_path(field_name) - value = self.xml.xpath(path, namespaces=self._namespaces) - if value is not None: + value = self.xml.xpath(path, namespaces=self.xml.nsmap) + if len(value) > 0: value = value[0].text if 'date' in field_name: value = datetime.strptime(value, '%Y%m%d') @@ -106,7 +114,7 @@ def __getitem__(self, field_name): def __setitem__(self, field_name, value): path = self.flavor._get_xml_path(field_name) - res = self.xml.xpath(path, namespaces=self._namespaces) + res = self.xml.xpath(path, namespaces=self.xml.nsmap) if len(res) > 1: raise LookupError('Multiple nodes found for this path. Refusing to edit.') From 78bc5d0faa0156aede42b6a1fe0a950bda81d583 Mon Sep 17 00:00:00 2001 From: duskybomb Date: Thu, 19 Jul 2018 21:23:50 +0530 Subject: [PATCH 2/2] Added tests - to check default values Corrected test - write pdf - write xml --- facturx/facturx.py | 2 +- facturx/flavors/factur-x/xml/basic.xml | 2 +- facturx/flavors/factur-x/xml/basicwl.xml | 2 +- facturx/flavors/factur-x/xml/en16931.xml | 2 +- facturx/flavors/factur-x/xml/minimum.xml | 2 +- facturx/flavors/fields.yml | 2 +- facturx/flavors/zugferd/xml/basic.xml | 2 +- facturx/flavors/zugferd/xml/comfort.xml | 2 +- facturx/tests/compare/no_embedded_data.xml | 30 +++++++++++----------- facturx/tests/test_facturx.py | 17 +++++++++--- 10 files changed, 36 insertions(+), 27 deletions(-) diff --git a/facturx/facturx.py b/facturx/facturx.py index bc2257b..d34bda7 100644 --- a/facturx/facturx.py +++ b/facturx/facturx.py @@ -100,7 +100,7 @@ def _add_default_to_xml(self): fields_data = xml_flavor.FIELDS for field, values in fields_data.items(): - if '_default' in values and self[field] is None: + if '_default' in values and (self[field] is None or self[field] == "0"): self[field] = fields_data[field]['_default'] def __getitem__(self, field_name): diff --git a/facturx/flavors/factur-x/xml/basic.xml b/facturx/flavors/factur-x/xml/basic.xml index 3ef7556..1959d34 100755 --- a/facturx/flavors/factur-x/xml/basic.xml +++ b/facturx/flavors/factur-x/xml/basic.xml @@ -9,7 +9,7 @@ - 380 + 0 diff --git a/facturx/flavors/factur-x/xml/basicwl.xml b/facturx/flavors/factur-x/xml/basicwl.xml index 3bb838b..05767bb 100755 --- a/facturx/flavors/factur-x/xml/basicwl.xml +++ b/facturx/flavors/factur-x/xml/basicwl.xml @@ -9,7 +9,7 @@ - 380 + 0 diff --git a/facturx/flavors/factur-x/xml/en16931.xml b/facturx/flavors/factur-x/xml/en16931.xml index 4f0536f..e83a18b 100644 --- a/facturx/flavors/factur-x/xml/en16931.xml +++ b/facturx/flavors/factur-x/xml/en16931.xml @@ -9,7 +9,7 @@ - 380 + 0 diff --git a/facturx/flavors/factur-x/xml/minimum.xml b/facturx/flavors/factur-x/xml/minimum.xml index cf19aae..5d326ef 100755 --- a/facturx/flavors/factur-x/xml/minimum.xml +++ b/facturx/flavors/factur-x/xml/minimum.xml @@ -10,7 +10,7 @@ - 380 + 0 diff --git a/facturx/flavors/fields.yml b/facturx/flavors/fields.yml index c86aac5..a23212a 100644 --- a/facturx/flavors/fields.yml +++ b/facturx/flavors/fields.yml @@ -34,7 +34,7 @@ type: factur-x: //rsm:ExchangedDocument/ram:TypeCode zugferd: //rsm:HeaderExchangedDocument/ram:TypeCode _required: true - _default: 380 + _default: "380" currency: _path: factur-x: //rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:InvoiceCurrencyCode diff --git a/facturx/flavors/zugferd/xml/basic.xml b/facturx/flavors/zugferd/xml/basic.xml index d7313c5..3d8e164 100644 --- a/facturx/flavors/zugferd/xml/basic.xml +++ b/facturx/flavors/zugferd/xml/basic.xml @@ -8,7 +8,7 @@ - 380 + 0 diff --git a/facturx/flavors/zugferd/xml/comfort.xml b/facturx/flavors/zugferd/xml/comfort.xml index 61c0a89..63a55e9 100644 --- a/facturx/flavors/zugferd/xml/comfort.xml +++ b/facturx/flavors/zugferd/xml/comfort.xml @@ -10,7 +10,7 @@ - 380 + 0 diff --git a/facturx/tests/compare/no_embedded_data.xml b/facturx/tests/compare/no_embedded_data.xml index 70664fa..c6b7962 100644 --- a/facturx/tests/compare/no_embedded_data.xml +++ b/facturx/tests/compare/no_embedded_data.xml @@ -1,52 +1,52 @@ - A1 + urn:factur-x.eu:1p0:minimum - 2017-TEST-04 + 380 - 20171031 + - CodeSERVICE A + - FOURNISSEUR F + - 99988877900017 + - FR + - FR34999888779 + - CLIENT 1 + - 77788899100018 + - CDE234 + EUR - 15976.87 - 3195.37 - 19172.24 - 19172.24 + 0 + 0 + 0 + 0 diff --git a/facturx/tests/test_facturx.py b/facturx/tests/test_facturx.py index dc34732..927724a 100644 --- a/facturx/tests/test_facturx.py +++ b/facturx/tests/test_facturx.py @@ -2,6 +2,7 @@ import unittest from facturx.facturx import * from lxml import etree +from datetime import datetime as dt class TestReading(unittest.TestCase): @@ -36,7 +37,7 @@ def test_file_embedded_data(self, file_name='embedded_data.pdf'): self.assertTrue(FacturX(file_path)._xml_from_file(file_path) is not None, "The PDF file has no embedded file") def test_write_pdf(self): - file_path = self.find_file('no_embedded_data.pdf') + file_path = self.find_file('embedded_data.pdf') factx = FacturX(file_path) test_file_path = os.path.join(self.test_files_dir, 'test.pdf') @@ -46,13 +47,15 @@ def test_write_pdf(self): self.discover_files() # checking that xml is embedded - self.assertTrue(self.test_file_embedded_data(file_name='test.pdf') is None) + self.assertTrue( + self.test_file_embedded_data(file_name='test.pdf') is None) os.remove(test_file_path) def test_write_xml(self): compare_file_dir = os.path.join(os.path.dirname(__file__), 'compare') - expected_file_path = os.path.join(compare_file_dir, 'no_embedded_data.xml') + expected_file_path = os.path.join(compare_file_dir, + 'no_embedded_data.xml') test_file_path = os.path.join(compare_file_dir, 'test.xml') factx = FacturX(self.find_file('no_embedded_data.pdf')) @@ -67,9 +70,15 @@ def test_write_xml(self): test_file_root = etree.XML(test_file.read(), parser) test_file_str = etree.tostring(test_file_root) - self.assertTrue(expected_file_str == test_file_str, "Files don't match") + self.assertEqual(expected_file_str, test_file_str, "Files don't match") os.remove(test_file_path) + def test_default_value(self): + file_path = self.find_file('no_embedded_data.pdf') + factx = FacturX(file_path) + self.assertEqual(factx['type'], "380", + "default value of type doesn't match") + def main(): unittest.main()