summaryrefslogtreecommitdiff
path: root/app/model.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/model.py')
-rw-r--r--app/model.py25
1 files changed, 21 insertions, 4 deletions
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 '<Category "%s">' % 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 '<MonthExpense (user: %s) of "%s": %s>' % (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)