summaryrefslogtreecommitdiff
path: root/app/views/expenses.py
blob: 57a777a76aacc815eca05eeb4173c9fbc69fb897 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
from ..flask_extend import Blueprint
from flask import request

import datetime, decimal
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 expense_form(obj=None):
    form = ExpenseForm(obj=obj)
    form.category.query = Category.query.order_by(Category.name)
    return form

def calc_month_exp(year, month):
    ssum = func.sum(SingleExpense.expense)
    query = SingleExpense.of_month(month, year)

    result = query.group_by(SingleExpense.category_id).\
             values(SingleExpense.category_id, ssum)

    exps = [CatExpense(Category.query.get(c), s, query.filter(SingleExpense.category_id == c)) for c,s in result]

    return MonthExpense(datetime.date(year, month, 1), exps)

@mod.app_template_filter()
def prev_date(exp):
    if exp.date.month == 1:
        return exp.date.replace(year = exp.date.year - 1, month = 12)
    else:
        return exp.date.replace(month = exp.date.month - 1)

@mod.app_template_filter()
def next_date(exp):
    if exp.date.month == 12:
        return exp.date.replace(year = exp.date.year + 1, month = 1)
    else:
        return exp.date.replace(month = exp.date.month + 1)

@mod.app_template_test("last_date")
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 { 'exps' : [c] }

mod.add_url_rule("/<path:p>", endpoint = "show_date_str", build_only = True)

@mod.route("/")
@templated()
def show():
    d = datetime.date.today()
            
    first = calc_month_exp(d.year, d.month)
    if d.month == 1:
        second = calc_month_exp(d.year - 1, 12)
    else:
        second = calc_month_exp(d.year, d.month - 1)

    return { 'exps' : [first, second] }

@mod.route("/edit/<int:id>", methods=("GET", "POST"))
@templated()
def edit(id):
    exp = SingleExpense.get(id)
    form = expense_form(exp)

    if request.method == "POST":
        if "deleteB" in request.form:
            db.session.delete(exp)

        elif form.validate(): # change
            form.populate_obj(exp)

        else:
            return { 'form': form }

        db.session.commit()
        return redirect("index")

    return { 'form': form }

@mod.route("/add/", methods=("GET", "POST"))
@templated()
def add():
    form = expense_form()

    if form.validate_on_submit():
        exp = SingleExpense()

        form.populate_obj(exp)

        db.session.add(exp)
        db.session.commit()

        return redirect(".add")

    return { 'form': form }