Source code for accounting.transport

# Part of accounting-api project:
# https://gitorious.org/conservancy/accounting-api
# License: AGPLv3-or-later

from datetime import datetime

from flask import json

from accounting.exceptions import AccountingException
from accounting.models import Amount, Transaction, Posting, Account


[docs]class AccountingEncoder(json.JSONEncoder):
[docs] def default(self, o): if isinstance(o, Account): return dict( __type__=o.__class__.__name__, name=o.name, amounts=o.amounts, accounts=o.accounts ) elif isinstance(o, Transaction): return dict( __type__=o.__class__.__name__, id=o.id, date=o.date.strftime('%Y-%m-%d'), payee=o.payee, postings=o.postings, metadata=o.metadata ) elif isinstance(o, Posting): return dict( __type__=o.__class__.__name__, account=o.account, amount=o.amount, metadata=o.metadata ) elif isinstance(o, Amount): return dict( __type__=o.__class__.__name__, amount=str(o.amount), symbol=o.symbol ) elif isinstance(o, AccountingException): return dict( type=o.__class__.__name__, message=o.message ) return json.JSONEncoder.default(self, o)
[docs]class AccountingDecoder(json.JSONDecoder): def __init__(self): json.JSONDecoder.__init__(self, object_hook=self.dict_to_object)
[docs] def dict_to_object(self, d): if '__type__' not in d: return d types = {c.__name__: c for c in [Amount, Transaction, Posting, Account, AccountingException]} _type = d.pop('__type__') if _type == 'Transaction': d['date'] = datetime.strptime(d['date'], '%Y-%m-%d') return types[_type](**d)

Related Topics