#! /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/") 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//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)