Source code for piecash.budget

from __future__ import division

import uuid

from sqlalchemy import Column, VARCHAR, INTEGER, BIGINT, ForeignKey
from sqlalchemy.orm import relation, foreign

from ._common import hybrid_property_gncnumeric, Recurrence, CallableList
from ._declbase import DeclarativeBaseGuid
from .sa_extra import DeclarativeBase


[docs]class Budget(DeclarativeBaseGuid): """ A GnuCash Budget Attributes: name (str): name of the budget description (str): description of the budget amounts (list of :class:`piecash.budget.BudgetAmount`): list of amounts per account """ __tablename__ = 'budgets' __table_args__ = {} # column definitions # keep this line as we reference it in the primaryjoin guid = Column('guid', VARCHAR(length=32), primary_key=True, nullable=False, default=lambda: uuid.uuid4().hex) name = Column('name', VARCHAR(length=2048), nullable=False) description = Column('description', VARCHAR(length=2048)) num_periods = Column('num_periods', INTEGER(), nullable=False) # # relation definitions recurrence = relation(Recurrence, primaryjoin=foreign(Recurrence.obj_guid) == guid, cascade='all, delete-orphan', uselist=False) amounts = relation('BudgetAmount', back_populates="budget", cascade='all, delete-orphan', collection_class=CallableList, ) def __str__(self): return "Budget<{}({}) for {} periods following pattern '{}' >".format(self.name, self.description, self.num_periods, self.recurrence)
[docs]class BudgetAmount(DeclarativeBase): """ A GnuCash BudgetAmount Attributes: amount (:class:`decimal.Decimal`): the budgeted amount account (:class:`piecash.core.account.Account`): the budgeted account budget (:class:`Budget`): the budget of the amount """ __tablename__ = 'budget_amounts' __table_args__ = {'sqlite_autoincrement': True} # column definitions id = Column('id', INTEGER(), primary_key=True, autoincrement=True,nullable=False) budget_guid = Column('budget_guid', VARCHAR(length=32), ForeignKey('budgets.guid'), nullable=False) account_guid = Column('account_guid', VARCHAR(length=32), ForeignKey('accounts.guid'), nullable=False) period_num = Column('period_num', INTEGER(), nullable=False) _amount_num = Column('amount_num', BIGINT(), nullable=False) _amount_denom = Column('amount_denom', BIGINT(), nullable=False) amount = hybrid_property_gncnumeric(_amount_num, _amount_denom) # relation definitions account = relation('Account', back_populates='budget_amounts') budget = relation('Budget', back_populates="amounts") def __str__(self): return "BudgetAmount<{}={}>".format(self.period_num, self.amount)