summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.net>2013-04-15 23:56:53 +0200
committerRené 'Necoro' Neumann <necoro@necoro.net>2013-04-15 23:56:53 +0200
commit02172e39c15272f9567bd39a28ec24d0270ea70f (patch)
treefb0fb3f42ccf41d4406135802b2c7a40c5867266 /app
parent527937a9f6de546fa47270d64f9009ebdbe6fc45 (diff)
downloadkosten-02172e39c15272f9567bd39a28ec24d0270ea70f.tar.gz
kosten-02172e39c15272f9567bd39a28ec24d0270ea70f.tar.bz2
kosten-02172e39c15272f9567bd39a28ec24d0270ea70f.zip
'templated' and wrapped 'redirect'
Diffstat (limited to 'app')
-rw-r--r--app/utils.py29
-rw-r--r--app/views/categories.py11
-rw-r--r--app/views/consts.py31
-rw-r--r--app/views/expenses.py26
4 files changed, 64 insertions, 33 deletions
diff --git a/app/utils.py b/app/utils.py
new file mode 100644
index 0000000..caacea7
--- /dev/null
+++ b/app/utils.py
@@ -0,0 +1,29 @@
+from functools import wraps
+from flask import request, render_template, url_for
+from flask import redirect as _redirect
+
+def templated(template=None):
+ def decorator(f):
+ @wraps(f)
+ def decorated_function(*args, **kwargs):
+ template_name = template
+ if template_name is None:
+ template_name = request.endpoint \
+ .replace('.', '/') + '.jinja'
+ ctx = f(*args, **kwargs)
+ if ctx is None:
+ ctx = {}
+ elif not isinstance(ctx, dict):
+ return ctx
+ return render_template(template_name, **ctx)
+ return decorated_function
+ return decorator
+
+def redirect (target, **kwargs):
+ code = kwargs.pop("_code", None)
+ url = url_for(target, **kwargs)
+
+ if code is None:
+ return _redirect(url)
+ else:
+ return _redirect(url, code)
diff --git a/app/views/categories.py b/app/views/categories.py
index c7346d3..3491998 100644
--- a/app/views/categories.py
+++ b/app/views/categories.py
@@ -1,20 +1,19 @@
from ..flask_extend import Blueprint
-from flask import render_template, request, url_for, redirect
+from flask import request
+from ..utils import templated, redirect
from ..model import db, Category
mod = Blueprint('categories', __name__)
-def T(tpl):
- return "categories/%s.jinja" % tpl
-
@mod.route("/", methods=("GET", "POST"))
+@templated()
def manage ():
if request.method == "GET":
categories = Category.query.order_by(Category.name).all()
- return render_template(T("manage"), cats = categories)
+ return { 'cats' : categories }
else:
for id, name in request.form.iteritems():
if id.startswith("n-"):
@@ -24,4 +23,4 @@ def manage ():
db.session.commit()
- return redirect(url_for(".manage"))
+ return redirect(".manage")
diff --git a/app/views/consts.py b/app/views/consts.py
index 1879c15..441137d 100644
--- a/app/views/consts.py
+++ b/app/views/consts.py
@@ -1,17 +1,15 @@
from ..flask_extend import Blueprint
-from flask import render_template, request, url_for, redirect
+from flask import request
import datetime
from sqlalchemy import sql
from ..model import db, Category, ConstExpense
from ..forms import ConstForm, today
+from ..utils import templated, redirect
mod = Blueprint('consts', __name__)
-def T(tpl):
- return "consts/%s.jinja" % tpl
-
def const_form(cur=None, obj=None):
obj = cur if obj is None else obj
form = ConstForm(obj=obj)
@@ -31,6 +29,7 @@ def const_form(cur=None, obj=None):
return form
@mod.route("/")
+@templated()
def list ():
d = today()
@@ -49,13 +48,15 @@ def list ():
else:
future.append(e)
- return render_template(T("list"), current = current, old = old, future = future)
+ return { 'current': current, 'old': old, 'future': future }
@mod.route("/<int:id>")
+@templated()
def show(id):
- return render_template(T("show"), exp = ConstExpense.get(id))
+ return { 'exp': ConstExpense.get(id) }
@mod.route("/edit/<int:id>", methods=("GET", "POST"))
+@templated()
def edit(id):
exp = ConstExpense.get(id)
form = const_form(exp)
@@ -64,16 +65,17 @@ def edit(id):
if "deleteB" in request.form:
db.session.delete(exp)
db.session.commit()
- return redirect(url_for(".list"))
+ return redirect(".list")
elif form.validate(): # change
form.populate_obj(exp)
db.session.commit()
- return redirect(url_for(".show", id = exp.id))
+ return redirect(".show")
- return render_template(T("edit"), form=form)
+ return { 'form': form }
@mod.route("/add/from/<int:other>")
+@templated("add")
def add_from(other):
exp = ConstExpense() # needed to initialize 'CE.next'
@@ -88,18 +90,19 @@ def add_from(other):
form.end.data = start.replace(year = start.year + 1)
if not other.next: form.prev.data = other
- return add(form)
+ return { 'form': form }
@mod.route("/add/", methods=("GET", "POST"))
-def add (form=None):
+@templated()
+def add ():
exp = ConstExpense()
- form = const_form() if form is None else form
+ form = const_form()
if form.validate_on_submit():
form.populate_obj(exp)
db.session.add(exp)
db.session.commit()
- return redirect(url_for(".show", id = exp.id))
+ return redirect(".show", id = exp.id)
- return render_template(T("add"), form = form)
+ return { 'form': form }
diff --git a/app/views/expenses.py b/app/views/expenses.py
index 583ac79..c0d9c65 100644
--- a/app/views/expenses.py
+++ b/app/views/expenses.py
@@ -1,5 +1,5 @@
from ..flask_extend import Blueprint
-from flask import render_template, request, url_for, redirect
+from flask import request
import datetime, decimal
from sqlalchemy import sql, func
@@ -7,12 +7,10 @@ from sqlalchemy import sql, func
from ..model import db, Category, SingleExpense, CatExpense, MonthExpense
from ..forms import ExpenseForm
+from ..utils import templated, redirect
mod = Blueprint('expenses', __name__)
-def T(tpl):
- return "expenses/%s.jinja" % tpl
-
def expense_form(obj=None):
form = ExpenseForm(obj=obj)
form.category.query = Category.query.order_by(Category.name)
@@ -48,13 +46,15 @@ def is_last(exp):
return exp.date >= datetime.date.today().replace(day = 1)
@mod.route("/<int(fixed_digits=4):year>/<int(fixed_digits=2):month>")
+@templated("show")
def show_date(year, month):
c = calc_month_exp(year, month)
- return render_template(T("show"), exps = [c])
+ return { 'exps' : [c] }
mod.add_url_rule("/<path:p>", endpoint = "show_date_str", build_only = True)
@mod.route("/")
+@templated()
def show():
d = datetime.date.today()
@@ -64,15 +64,14 @@ def show():
else:
second = calc_month_exp(d.year, d.month - 1)
- return render_template(T("show"), exps = [first, second])
+ return { 'exps' : [first, second] }
@mod.route("/edit/<int:id>", methods=("GET", "POST"))
+@templated()
def edit(id):
exp = SingleExpense.get(id)
form = expense_form(exp)
- ret = lambda: render_template(T("edit"), form=form)
-
if request.method == "POST":
if "deleteB" in request.form:
db.session.delete(exp)
@@ -81,14 +80,15 @@ def edit(id):
form.populate_obj(exp)
else:
- return ret()
+ return { 'form': form }
db.session.commit()
- return redirect(url_for("index"))
+ return redirect("index")
- return ret()
+ return { 'form': form }
@mod.route("/add/", methods=("GET", "POST"))
+@templated()
def add():
form = expense_form()
@@ -100,6 +100,6 @@ def add():
db.session.add(exp)
db.session.commit()
- return redirect(url_for(".add"))
+ return redirect(".add")
- return render_template(T("add"), form=form)
+ return { 'form': form }