Files @ 8abbe3462fda
Branch filter:

Location: NPO-Accounting/experimental-accounting-api/accounting/models.py

Joar Wandborg
[tests] Check transactions for errors before being added

- Added support for Exception-specific HTTP response codes for
AccountinExceptions.
# Part of accounting-api project:
# https://gitorious.org/conservancy/accounting-api
# License: AGPLv3-or-later
import datetime
import uuid

from decimal import Decimal


class Transaction:
    def __init__(self, id=None, date=None, payee=None, postings=None,
                 metadata=None, _generate_id=False):
        if type(date) == datetime.datetime:
            date = date.date()

        self.id = id
        self.date = date
        self.payee = payee
        self.postings = postings
        self.metadata = metadata if metadata is not None else {}

        if _generate_id:
            self.generate_id()

    def generate_id(self):
        self.id = str(uuid.uuid4())

    def __eq__(self, other):
        return self.__dict__ == other.__dict__

    def __repr__(self):
        return ('<{self.__class__.__name__} {self.id} {date}' +
                ' {self.payee} {self.postings}').format(
                    self=self,
                    date=self.date.strftime('%Y-%m-%d'))


class Posting:
    def __init__(self, account=None, amount=None, metadata=None):
        self.account = account
        self.amount = amount
        self.metadata = metadata if metadata is not None else {}

    def __eq__(self, other):
        return self.__dict__ == other.__dict__

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


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

    def __eq__(self, other):
        return self.__dict__ == other.__dict__

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


class Account:
    def __init__(self, name=None, amounts=None, accounts=None):
        self.name = name
        self.amounts = amounts
        self.accounts = accounts

    def __eq__(self, other):
        return self.__dict__ == other.__dict__

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