experimental-accounting-api/accounting/transport.py

71 lines
2.1 KiB
Python
Raw Normal View History

# Part of accounting-api project:
# https://gitorious.org/conservancy/accounting-api
# License: AGPLv3-or-later
2013-12-10 23:25:16 +00:00
from datetime import datetime
from flask import json
from accounting.exceptions import AccountingException
from accounting.models import Amount, Transaction, Posting, Account
class AccountingEncoder(json.JSONEncoder):
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,
2013-12-11 14:12:08 +00:00
postings=o.postings,
metadata=o.metadata
)
elif isinstance(o, Posting):
return dict(
__type__=o.__class__.__name__,
account=o.account,
amount=o.amount,
2013-12-11 14:12:08 +00:00
metadata=o.metadata
)
elif isinstance(o, Amount):
return dict(
__type__=o.__class__.__name__,
amount=str(o.amount),
symbol=o.symbol
)
elif isinstance(o, AccountingException):
2013-12-10 23:25:16 +00:00
return dict(
type=o.__class__.__name__,
message=o.message,
transaction=getattr(o, 'transaction', None)
2013-12-10 23:25:16 +00:00
)
return json.JSONEncoder.default(self, o)
class AccountingDecoder(json.JSONDecoder):
def __init__(self):
json.JSONDecoder.__init__(self, object_hook=self.dict_to_object)
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__')
2013-12-10 23:25:16 +00:00
if _type == 'Transaction':
d['date'] = datetime.strptime(d['date'], '%Y-%m-%d')
return types[_type](**d)