101 lines
3 KiB
Python
101 lines
3 KiB
Python
#! /usr/bin/env python3
|
|
from flask import Flask, render_template, request
|
|
from helper import get_session, format_amount
|
|
from datetime import datetime
|
|
from sqlalchemy import func
|
|
import click
|
|
from models import Transaction, Tag
|
|
|
|
session = None
|
|
app = Flask(__name__)
|
|
|
|
|
|
@app.route("/")
|
|
def index():
|
|
fom = datetime.today().replace(day=1)
|
|
sum_of_categories = (
|
|
session.query(Transaction.category_id, func.sum(Transaction.amount).label("total"))
|
|
.filter(Transaction.date > fom)
|
|
.group_by(Transaction.category_id)
|
|
.all()
|
|
)
|
|
categories = []
|
|
for s in sum_of_categories:
|
|
if s.category_id:
|
|
categories.append(
|
|
{"name": session.query(Category).get(s.category_id).full_name(), "amount": format_amount(s.total)}
|
|
)
|
|
else:
|
|
categories.append({"name": "Unsorted", "amount": format_amount(s.total)})
|
|
|
|
categories = sorted(categories, key=lambda i: i["name"])
|
|
return render_template("index.html", categories=categories)
|
|
|
|
|
|
@app.route("/categories")
|
|
def categories():
|
|
categories = session.query(Category).all()
|
|
categories = [c for c in categories if c.is_child()]
|
|
categories = sorted(categories, key=lambda i: i.full_name())
|
|
return render_template("categories.html", categories=categories)
|
|
|
|
|
|
@app.route("/graph")
|
|
def graph():
|
|
data = []
|
|
return render_template("graph.html", data=data)
|
|
|
|
|
|
@app.route("/category/<name>")
|
|
def category(name):
|
|
c = session.query(Category).filter(Category.name == name).first()
|
|
if c:
|
|
transactions = session.query(Transaction).filter(Transaction.category_id == c.id).all()
|
|
else:
|
|
transactions = []
|
|
|
|
return render_template("category.html", category=c, transactions=transactions)
|
|
|
|
|
|
@app.route("/category/<name>/delete")
|
|
def delete_category(name):
|
|
c = session.query(Category).filter(Category.name == name).first()
|
|
if c:
|
|
session.delete(c)
|
|
session.commit()
|
|
|
|
return redirect("/categories")
|
|
|
|
|
|
@app.route("/transactions")
|
|
def transactions():
|
|
if request.args.get("unsorted", None):
|
|
print("Unsorted")
|
|
transactions = session.query(Transaction).filter(Transaction.category_id == None).all()
|
|
else:
|
|
print("all")
|
|
transactions = session.query(Transaction).all()
|
|
categories = session.query(Category).all()
|
|
childs = [c for c in categories if c.is_child()]
|
|
return render_template("transactions.html", transactions=transactions, categories=childs)
|
|
|
|
|
|
@app.route("/bulksort")
|
|
def buksort():
|
|
cid = request.forms.get("category")
|
|
transaction_ids = request.forms.getall("transaction")
|
|
for id in transaction_ids:
|
|
t = session.query(Transaction).get(id)
|
|
t.category__id = cid
|
|
session.add(t)
|
|
print(f"Sorted {len(transaction_ids)} transactions into category {cid}")
|
|
session.commit()
|
|
return redirect("/transactions")
|
|
|
|
|
|
@click.command(name="serve")
|
|
@click.option("--profile", "-p")
|
|
def command(profile):
|
|
global session
|
|
session = get_session(profile)
|
|
app.run(host="0.0.0.0", port=8080)
|