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