100 lines
2.9 KiB
Python
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)
|