From 2bbf3bf2d37b319f06bc9e3a1c6d9097aa287bfa Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Fri, 1 Nov 2013 22:57:17 +0100 Subject: Fixes and cleanup and documentation --- app/model.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'app/model.py') diff --git a/app/model.py b/app/model.py index aa9b666..ec555d3 100644 --- a/app/model.py +++ b/app/model.py @@ -25,7 +25,12 @@ def to_exp(d): # # Database Entities +# class Model (db.Model): + """Abstract base class for all models. + Adds an id PK and several convenience accessors. + """ + __abstract__ = True id = Column(db.Integer, primary_key=True) @@ -50,13 +55,18 @@ class Model (db.Model): def get_or_404 (cls, *args, **kwargs): return cls.query.get_or_404(*args, **kwargs) + class User (Model): + # NB: This is abstract, the flesh is added in login.py + __abstract__ = True name = ReqColumn(db.Unicode(50), unique = True) pwd = ReqColumn(db.Unicode(255)) description = Column(db.Unicode(100)) + class UserModel (Model): + """Abstract base class for tables that have a user column.""" __abstract__ = True @declared_attr @@ -71,6 +81,7 @@ class UserModel (Model): def of (cls, user): return cls.query.filter_by(user = user) + class Category (UserModel): name = ReqColumn(db.Unicode(50)) parent_id = Column(db.Integer, db.ForeignKey('category.id')) @@ -90,7 +101,11 @@ class Category (UserModel): else: return '' % self.name + class Expense (UserModel): + """Abstract base class for expenses: Adds the common fields + and establishes the connection to `Category`. + """ __abstract__ = True description = Column(db.Unicode(50)) @@ -104,6 +119,7 @@ class Expense (UserModel): def category(cls): return db.relationship(Category, innerjoin = True) + class SingleExpense (Expense): year = ReqColumn(db.Integer) month = ReqColumn(db.SmallInteger) @@ -123,6 +139,7 @@ class SingleExpense (Expense): self.month = d.month self.day = d.day + class ConstExpense (Expense): months = ReqColumn(db.SmallInteger) start = ReqColumn(db.Date, index = True) @@ -144,7 +161,7 @@ class ConstExpense (Expense): # # Work entities (not stored in DB) # -class CatExpense (namedtuple('CatExpense', 'cat expense exps')): +class CatExpense (namedtuple('CatExpense', 'cat sum exps')): __slots__ = () @property @@ -152,7 +169,7 @@ class CatExpense (namedtuple('CatExpense', 'cat expense exps')): return self.exps.order_by(SingleExpense.day).all() class MonthExpense (namedtuple('MonthExpense', 'user date catexps')): - + def __init__ (self, *args, **kwargs): self._consts = None super(MonthExpense, self).__init__(*args, **kwargs) @@ -171,7 +188,7 @@ class MonthExpense (namedtuple('MonthExpense', 'user date catexps')): @property def sum (self): - return self.constsum + sum(x.expense for x in self.catexps) + return self.constsum + sum(x.sum for x in self.catexps) @property def all (self): @@ -181,7 +198,7 @@ class MonthExpense (namedtuple('MonthExpense', 'user date catexps')): return '' % (self.user.name, self.date, self.sum) # -# Extra indizes have to be here +# Extra indices have to be here # db.Index('idx_single_date', SingleExpense.user_id, SingleExpense.year, SingleExpense.month) -- cgit v1.2.3-54-g00ecf