diff options
Diffstat (limited to '')
-rw-r--r-- | app/model.py (renamed from model.py) | 104 |
1 files changed, 48 insertions, 56 deletions
@@ -1,68 +1,63 @@ -from sqlalchemy import types as T -from sqlalchemy import sql, Index, Column, ForeignKey, create_engine -from sqlalchemy.orm import relationship, backref, scoped_session, sessionmaker,\ - column_property -from sqlalchemy.ext.declarative import declarative_base, declared_attr -from sqlalchemy.ext.hybrid import hybrid_property +from flask.ext.sqlalchemy import SQLAlchemy +from sqlalchemy import sql +from sqlalchemy.ext.declarative import declared_attr import datetime import decimal from functools import partial from collections import namedtuple -__all__ = ["Category", "SingleExpense", "ConstExpense", "CatExpense", "MonthExpense", - "Session"] +from . import app -# -# DB Setup -# +db = SQLAlchemy(app) -engine = create_engine("sqlite:///test.sqlite") -engine.echo = True +__all__ = ["db", "Category", "SingleExpense", "ConstExpense", "CatExpense", "MonthExpense"] -Session = scoped_session(sessionmaker(bind=engine)) +ReqColumn = partial(db.Column, nullable = False) +ExpNum = db.Numeric(scale = 2, precision = 10) + +def to_exp(d): + """Converts decimal into expense""" + return d.quantize(decimal.Decimal('.01'), rounding = decimal.ROUND_UP) # -# Global definitions -# +# Database Entities +class Model (db.Model): + __abstract__ = True + + id = db.Column(db.Integer, primary_key=True) -class Base(object): @declared_attr def __tablename__ (cls): return cls.__name__.lower() - id = Column(T.Integer, primary_key=True) - - query = Session.query_property() - @classmethod def get_by (cls, *args, **kwargs): return cls.query.filter_by(*args, **kwargs).first() @classmethod + def get_by_or_404 (cls, *args, **kwargs): + return cls.query.filter_by(*args, **kwargs).first_or_404() + + @classmethod def get (cls, *args, **kwargs): return cls.query.get(*args, **kwargs) + @classmethod + def get_or_404 (cls, *args, **kwargs): + return cls.query.get_or_404(*args, **kwargs) -Base = declarative_base(cls=Base) - -ReqColumn = partial(Column, nullable = False) -ExpNum = T.Numeric(scale = 2, precision = 10) - -def to_exp(d): - """Converts decimal into expense""" - return d.quantize(decimal.Decimal('.01'), rounding = decimal.ROUND_UP) - -# -# Database Entities -# +class Category (Model): + name = ReqColumn(db.Unicode(50), unique = True) + parent_id = db.Column(db.Integer, db.ForeignKey('category.id')) -class Category (Base): - name = ReqColumn(T.Unicode(50), unique = True) - parent_id = Column(T.Integer, ForeignKey('category.id')) + children = db.relationship('Category', + backref=db.backref('parent', remote_side="Category.id")) - children = relationship('Category', - backref=backref('parent', remote_side="Category.id")) + def __init__ (self, name, parent_id = None): + Model.__init__(self) + self.name = name + self.parent_id = parent_id def __repr__ (self): if self.parent: @@ -70,24 +65,24 @@ class Category (Base): else: return '<Category "%s">' % self.name -class Expense (Base): +class Expense (Model): __abstract__ = True - description = Column(T.Unicode(50)) + description = db.Column(db.Unicode(50)) expense = ReqColumn(ExpNum) @declared_attr def category_id(cls): - return ReqColumn(T.Integer, ForeignKey(Category.id)) + return ReqColumn(db.Integer, db.ForeignKey(Category.id)) @declared_attr def category(cls): - return relationship(Category, innerjoin = True) + return db.relationship(Category, innerjoin = True) class SingleExpense (Expense): - year = ReqColumn(T.Integer) - month = ReqColumn(T.SmallInteger) - day = ReqColumn(T.SmallInteger) + year = ReqColumn(db.Integer) + month = ReqColumn(db.SmallInteger) + day = ReqColumn(db.SmallInteger) @classmethod def of_month (cls, month, year): @@ -108,13 +103,13 @@ class SingleExpense (Expense): self.day = d.day class ConstExpense (Expense): - months = ReqColumn(T.SmallInteger) - start = ReqColumn(T.Date, index = True) - end = ReqColumn(T.Date, index = True) - prev_id = Column(T.Integer, ForeignKey('constexpense.id')) + months = ReqColumn(db.SmallInteger) + start = ReqColumn(db.Date, index = True) + end = ReqColumn(db.Date, index = True) + prev_id = db.Column(db.Integer, db.ForeignKey('constexpense.id')) - prev = relationship('ConstExpense', remote_side = "ConstExpense.id", uselist = False, - backref=backref('next', uselist = False)) + prev = db.relationship('ConstExpense', remote_side = "ConstExpense.id", uselist = False, + backref=db.backref('next', uselist = False)) @property def monthly(self): @@ -168,8 +163,5 @@ class MonthExpense (namedtuple('MonthExpense', 'date catexps')): # Extra indizes have to be here # -Index('idx_single_date', SingleExpense.year, SingleExpense.month) -Index('idx_start_end', ConstExpense.start, ConstExpense.end) - -if __name__ == "__main__": - Base.metadata.create_all(engine) +db.Index('idx_single_date', SingleExpense.year, SingleExpense.month) +db.Index('idx_start_end', ConstExpense.start, ConstExpense.end) |