usawa

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | Submodules | LICENSE

commit d11b6d22e2d986e54c8d0809b88e3f101588a6c1
parent d4340f1d41ac5210cc7355ad988964949ec244c7
Author: lash <dev@holbrook.no>
Date:   Fri, 13 Feb 2026 11:24:06 +0000

Add asset xml import

Diffstat:
Mdummy/tests/asset.py | 12++++++++++++
Mdummy/tests/entry.py | 14++++++++++++++
Mdummy/usawa/asset.py | 41++++++++++++++++++++++++++++++++++++++---
Mdummy/usawa/data/schema.xsd | 1+
Mdummy/usawa/entry.py | 2--
5 files changed, 65 insertions(+), 5 deletions(-)

diff --git a/dummy/tests/asset.py b/dummy/tests/asset.py @@ -28,5 +28,17 @@ class TestAsset(unittest.TestCase): logg.debug('asset {}'.format(lxml.etree.tostring(tree))) + def test_asset_import(self): + fp = os.path.join(testdir, 'test.xml') + asset = Asset.from_file(fp, slug='foo', description='barbarbar', extref='xyzzy', localref='plugh') + tree = asset.to_tree() + + s = lxml.etree.tostring(tree) + tree = lxml.etree.fromstring(s) + o = Asset.from_tree(tree) + logg.debug('imported asset {}'.format(o)) + + + if __name__ == '__main__': unittest.main() diff --git a/dummy/tests/entry.py b/dummy/tests/entry.py @@ -94,5 +94,19 @@ class TestEntry(unittest.TestCase): Entry.unwrap(data, acl=acl) + def test_entry_export_import(self): + dst = EntryPart('FOO', 'asset', 'foo', 1337) + src = EntryPart('FOO', 'income', 'foo', 1337, debit=True) + o = Entry(42, datetime.datetime.strptime('2025-11-11', '%Y-%m-%d'), parent=self.parent, ref=self.ref, description=self.description, tx_datereg=self.dtreg) + o.add_part(src, debit=True) + o.add_part(dst) + wallet = DemoWallet() + o.sign(wallet) + tree = o.to_tree() + + s = lxml.etree.tostring(tree) + tree = lxml.etree.fromstring(s) + tree = Entry.from_tree(tree, self.uidx) + if __name__ == '__main__': unittest.main() diff --git a/dummy/usawa/asset.py b/dummy/usawa/asset.py @@ -107,8 +107,10 @@ class Asset: def to_tree(self): tree = lxml.etree.Element('attachment', nsmap=nsmap()) - tree.set('mime', self.get_mimestring()) - tree.set('uuid', self.uuid) + if self.mime != None: + tree.set('mime', self.get_mimestring()) + if self.uuid != None: + tree.set('uuid', self.uuid) o = lxml.etree.SubElement(tree, 'digest') o.text = self.digest.hex() @@ -138,7 +140,40 @@ class Asset: tree.append(o) return tree - + + + """ + :todo: add to docs cannot directly import from tree generated from to_tree, must go way by string export + """ + @staticmethod + def from_tree(tree): + o = Asset() + o.uuid = tree.get('uuid') + o.mime = tree.get('mime') + v = tree.find('digest', namespaces=nsmap()).text + o.digest = bytes.fromhex(v) + o.ref = tree.find('ref', namespaces=nsmap()).text + + v = tree.find('extref', namespaces=nsmap()) + if v != None: + o.extref = v.text + + v = tree.find('filename', namespaces=nsmap()) + if v != None: + v = parse_path(v.text) + o.slug = v[0] + o.ext = v[1] + + v = tree.find('description', namespaces=nsmap()) + if v != None: + o.description = v.text + + logg.warning('asset sigs not yet implemented') + for v in tree.findall('sig', namespaces=nsmap()): + logg.debug('skipping sig from ' . v.get('keyid')) + + return o + def __str__(self): return 'file ̈́' + self.get_filename() + ' mime ' + self.get_mimestring() + ' digest ' + self.digest.hex() diff --git a/dummy/usawa/data/schema.xsd b/dummy/usawa/data/schema.xsd @@ -162,6 +162,7 @@ <xs:element name="extref" type="xs:string" minOccurs="0" maxOccurs="1" /> <xs:element name="filename" type="xs:string" minOccurs="0" maxOccurs="1" /> <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1" /> + <xs:element name="sig" type="Signature" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> <xs:attribute name="mime" type="xs:string" /> <xs:attribute name="uuid" type="xs:string" /> diff --git a/dummy/usawa/entry.py b/dummy/usawa/entry.py @@ -229,8 +229,6 @@ class Entry: serial = int(o.find('serial', namespaces=nsmap()).text) if min > serial: raise ValueError('entry serial preceeds ledger') - #unit = o.find('unit', namespaces=nsmap()).text - #unitindex.sym(unit) ref = o.find('ref', namespaces=nsmap()).text parent = o.find('parent', namespaces=nsmap()).text