schmeckels/serve.py
Felix Breidenstein 78a0d1a1f7 WIP
2020-10-18 15:14:52 +02:00

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)