summary history files

web/penny/resources/tags/controllers.py
from penny import models, util
from penny.resources.tags.forms import FormTag
from flask import Blueprint, render_template, url_for, g, redirect, flash, request
from flask_security.decorators import auth_required
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.exc import IntegrityError
from sqlalchemy.sql import func


tags = Blueprint("tags", __name__)


@tags.route("/tags")
@auth_required()
def _tags():
    return render_template("tags.html", data_url=url_for("data_tags.tags"))


@tags.route(
    "/tags/<int:id>",
    methods=["GET", "POST"],
)
@auth_required()
def tag(id):
    try:
        tag = (
            models.db.session.query(models.Tag)
            .filter_by(id=id, user_id=g.user.id)
            .one()
        )
    except NoResultFound:
        return url_for("accounts._accounts")

    form = FormTag(obj=tag)

    if form.validate_on_submit():
        tag.name = form.name.data
        tag.desc = form.desc.data

        regex: models.TagMatchFilterRegex

        if form.regex.data:
            regex = models.TagMatchFilterRegex.query.filter_by(
                regex=form.regex.data, tag=tag
            ).first()
            if regex is None:
                regex = models.TagMatchFilterRegex(regex=form.regex.data, tag=tag)
                models.db.session.add(regex)
                models.db.session.commit()

        for i in (
            models.db.session.query(models.TagMatchFilterRegex)
            .filter(
                models.TagMatchFilterRegex.tag == tag,
                models.TagMatchFilterRegex.regex != form.regex.data,
            )
            .all()
        ):
            if not request.form.get(f"regex_{i.id}"):
                models.db.session.delete(i)
                models.db.session.commit()

        form.regex.data = ""

        models.db.session.add(tag)
        models.db.session.commit()

    transactions_amount = 0
    for transaction in tag.transactions:
        amount = 0
        if transaction.credit:
            amount = transaction.credit
        if transaction.debit:
            amount += transaction.debit
        transactions_amount += amount

    return render_template(
        "tag.html",
        form=form,
        tag=tag,
        transactions_amount=util.convert_to_float(int(transactions_amount)),
    )


@tags.route("/tags/add", methods=["GET", "POST"])
@auth_required()
def add():
    form = FormTag()
    tag = None

    if form.validate_on_submit():
        tag = models.Tag(user_id=g.user.id, name=form.name.data, desc=form.desc.data)
        models.db.session.add(tag)
        try:
            models.db.session.commit()
        except IntegrityError:
            models.db.session.rollback()
            # NOTE(rene): this flash is showing twice when it should only show once.
            flash("Failed adding tag.", "error")
            return redirect(url_for("tags.add"))

        return redirect(url_for("tags.tag", id=tag.id))

    return render_template("tag.html", form=form, tag=tag)