schmeckels/serve.py
2020-04-25 11:07:51 +02:00

100 lines
2.9 KiB
Python

#! /usr/bin/env python3
from bottle import route, run, template, redirect, request, post
from helper import get_session, format_amount
from datetime import datetime
from sqlalchemy import func
import click
from models import Transaction, Category
session = None
@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 template("index", categories=categories)
@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 template("categories", categories=categories)
@route("/graph")
def graph():
data = []
return template("graph", data=data)
@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 template("category", category=c, transactions=transactions)
@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")
@route("/transactions")
def transactions():
if request.GET.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 template("transactions", transactions=transactions, categories=childs)
@post("/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)
run(host="0.0.0.0", port=8080, reloader=True)