From 42193fbc3da0e2776f5a2e49b90f4fef5ed948de Mon Sep 17 00:00:00 2001 From: christopherlam Date: Sun, 5 Feb 2017 14:37:35 +0800 Subject: Add pricedb extraction --- gnucashxml.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/gnucashxml.py b/gnucashxml.py index 83be8c2..76ba930 100644 --- a/gnucashxml.py +++ b/gnucashxml.py @@ -31,11 +31,12 @@ class Book(object): A book is the main container for GNU Cash data. It doesn't really do anything at all by itself, except to have - a reference to the accounts, transactions, and commodities. + a reference to the accounts, transactions, prices, and commodities. """ - def __init__(self, guid, transactions=None, root_account=None, + def __init__(self, guid, prices=None, transactions=None, root_account=None, accounts=None, commodities=None, slots=None): self.guid = guid + self.prices = prices self.transactions = transactions or [] self.root_account = root_account self.accounts = accounts or [] @@ -217,6 +218,26 @@ class Split(object): False +class Price(object): + """ + A price is GNUCASH record of the price of a commodity against a currency + Consists of date, currency, commodity, value + """ + def __init__(self, guid=None, commodity=None, currency=None, + date=None, value=None): + self.guid = guid + self.commodity = commodity + self.currency = currency + self.date = date + self.value = value + + def __repr__(self): + return "".format(self.guid[:6], + self.date, + self.commodity, + self.value, + self.currency) + ################################################################## # XML file parsing @@ -268,6 +289,12 @@ def _book_from_tree(tree): commodities.append(comm) commoditydict[(comm.space, comm.name)] = comm + prices = [] + t = tree.find('{http://www.gnucash.org/XML/gnc}pricedb') + for child in t.findall('price'): + price = _price_from_tree(child, commoditydict) + prices.append(price) + root_account = None accounts = [] accountdict = {} @@ -296,6 +323,7 @@ def _book_from_tree(tree): slots = _slots_from_tree( tree.find('{http://www.gnucash.org/XML/book}slots')) return Book(guid=guid, + prices=prices, transactions=transactions, root_account=root_account, accounts=accounts, @@ -319,7 +347,36 @@ def _commodity_from_tree(tree): space = tree.find('{http://www.gnucash.org/XML/cmdty}space').text return Commodity(name=name, space=space) - +# Implemented: +# - price +# - price:guid +# - price:commodity +# - price:currency +# - price:date +# - price:value +def _price_from_tree(tree, commoditydict): + price = '{http://www.gnucash.org/XML/price}' + cmdty = '{http://www.gnucash.org/XML/cmdty}' + ts = "{http://www.gnucash.org/XML/ts}" + + guid = tree.find(price + 'id').text + value = _parse_number(tree.find(price + 'value').text) + date = parse_date(tree.find(price + 'time/' + ts + 'date').text) + + currency_space = tree.find(price + "currency/" + cmdty + "space").text + currency_name = tree.find(price + "currency/" + cmdty + "id").text + currency = commoditydict[(currency_space, currency_name)] + + commodity_space = tree.find(price + "commodity/" + cmdty + "space").text + commodity_name = tree.find(price + "commodity/" + cmdty + "id").text + commodity = commoditydict[(commodity_space, commodity_name)] + + return Price(guid = guid, + commodity = commodity, + date = date, + value = value, + currency = currency) + # Implemented: # - act:name # - act:id -- cgit v1.2.3