commit d11b6d22e2d986e54c8d0809b88e3f101588a6c1
parent d4340f1d41ac5210cc7355ad988964949ec244c7
Author: lash <dev@holbrook.no>
Date: Fri, 13 Feb 2026 11:24:06 +0000
Add asset xml import
Diffstat:
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