Changeset - af6e28d1680a
[Not reviewed]
0 2 0
Joar Wandborg - 10 years ago 2013-12-09 20:49:38
joar@wandborg.se
Use Amount objects, use the XML output in bal()
2 files changed with 62 insertions and 21 deletions:
0 comments (0 inline, 0 general)
accounting/__init__.py
Show inline comments
...
 
@@ -42,3 +42,2 @@ class Ledger:
 

	
 

	
 
        process = self.get_process()
...
 
@@ -113,3 +112,3 @@ class Ledger:
 
    def bal(self):
 
        output = self.send_command('bal --format "%A|%t\\\\n"')
 
        output = self.send_command('xml')
 

	
...
 
@@ -120,9 +119,29 @@ class Ledger:
 

	
 
        for line in output.split(b'\n'):
 
            try:
 
                name, balance =  line.decode('utf8').split('|')
 
            except ValueError:
 
                continue
 
        xml = ElementTree.fromstring(output.decode('utf8'))
 

	
 
            accounts.append(Account(name=name, balance=balance))
 
        accounts = self._recurse_accounts(xml.find('./accounts'))
 

	
 
        return accounts
 

	
 
    def _recurse_accounts(self, root):
 
        accounts = []
 

	
 
        for account in root.findall('./account'):
 
            name = account.find('./fullname').text
 

	
 
            amounts = []
 

	
 
            account_amounts = account.findall('./account-total/balance/amount') or \
 
                    account.findall('./account-amount/amount')
 

	
 
            if account_amounts:
 
                for amount in account_amounts:
 
                    quantity = amount.find('./quantity').text
 
                    symbol = amount.find('./commodity/symbol').text
 

	
 
                    amounts.append(Amount(amount=quantity, symbol=symbol))
 

	
 
            accounts.append(Account(name=name,
 
                                    amounts=amounts,
 
                                    accounts=self._recurse_accounts(account)))
 

	
...
 
@@ -131,3 +150,3 @@ class Ledger:
 
    def reg(self):
 
        output = self.send_command( 'xml')
 
        output = self.send_command('xml')
 

	
...
 
@@ -154,3 +173,4 @@ class Ledger:
 
                postings.append(
 
                    Posting(account=account, amount=amount, symbol=symbol))
 
                    Posting(account=account,
 
                            amount=Amount(amount=amount, symbol=symbol)))
 

	
...
 
@@ -172,9 +192,9 @@ class Transaction:
 
                    self=self,
 
                    date=self.date.isoformat())
 
                    date=self.date.strftime('%Y-%m-%d'))
 

	
 

	
 
class Posting:
 
    def __init__(self, account=None, amount=None, symbol=None):
 
    def __init__(self, account=None, amount=None):
 
        self.account = account
 
        self.amount = amount
 
        self.symbol = symbol
 

	
...
 
@@ -182,3 +202,13 @@ class Posting:
 
        return ('<{self.__class__.__name__} "{self.account}"' +
 
                ' {self.symbol} {self.amount}>').format(self=self)
 
                ' {self.amount}>').format(self=self)
 

	
 

	
 
class Amount:
 
    def __init__(self, amount=None, symbol=None):
 
        self.amount = amount
 
        self.symbol = symbol
 

	
 
    def __repr__(self):
 
        return ('<{self.__class__.__name__} {self.symbol}' +
 
                ' {self.amount}>').format(self=self)
 

	
...
 
@@ -186,9 +216,10 @@ class Posting:
 
class Account:
 
    def __init__(self, name=None, balance=None):
 
    def __init__(self, name=None, amounts=None, accounts=None):
 
        self.name = name
 
        self.balance = balance
 
        self.amounts = amounts
 
        self.accounts = accounts
 

	
 
    def __repr__(self):
 
        return '<{self.__class__.__name__}: "{self.name}" {self.balance} >'.format(
 
            self=self)
 
        return ('<{self.__class__.__name__} "{self.name}" {self.amounts}' +
 
                ' {self.accounts}>').format(self=self)
 

	
...
 
@@ -198,3 +229,3 @@ def main(argv=None):
 
        argv = sys.argv
 
    logging.basicConfig(level=logging.DEBUG)
 
    logging.basicConfig(level=logging.INFO)
 
    ledger = Ledger(ledger_file='non-profit-test-data.ledger')
accounting/web.py
Show inline comments
...
 
@@ -4,3 +4,3 @@ from flask import Flask, g, jsonify, json
 

	
 
from accounting import Ledger, Account, Posting, Transaction
 
from accounting import Ledger, Account, Posting, Transaction, Amount
 

	
...
 
@@ -13,2 +13,3 @@ ledger = Ledger(ledger_file=app.config['LEDGER_FILE'])
 

	
 

	
 
class AccountingEncoder(json.JSONEncoder):
...
 
@@ -18,3 +19,4 @@ class AccountingEncoder(json.JSONEncoder):
 
                name=o.name,
 
                balance=o.balance
 
                amounts=o.amounts,
 
                accounts=o.accounts
 
            )
...
 
@@ -30,2 +32,6 @@ class AccountingEncoder(json.JSONEncoder):
 
                amount=o.amount,
 
            )
 
        elif isinstance(o, Amount):
 
            return dict(
 
                amount=o.amount,
 
                symbol=o.symbol
...
 
@@ -35,4 +41,6 @@ class AccountingEncoder(json.JSONEncoder):
 

	
 

	
 
app.json_encoder = AccountingEncoder
 

	
 

	
 
@app.route('/')
...
 
@@ -41,2 +49,3 @@ def index():
 

	
 

	
 
@app.route('/balance')
...
 
@@ -47,2 +56,3 @@ def balance_report():
 

	
 

	
 
@app.route('/register')
0 comments (0 inline, 0 general)