web/penny/resources/accounts/controllers.py
from penny import models, util
from penny.common import forms
from flask import Blueprint, g, render_template, url_for, redirect
from flask_security.decorators import auth_required
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.sql import func
from penny.resources.accounts.forms import FormAccount
accounts = Blueprint("accounts", __name__)
@accounts.route("/accounts")
@auth_required()
def _accounts():
return render_template("accounts.html", data_url=url_for("data_accounts.accounts"))
@accounts.route(
"/accounts/<int:id>",
defaults={"start_date": None, "end_date": None},
methods=["GET", "POST"],
)
@accounts.route(
"/accounts/<int:id>/<string:start_date>/<string:end_date>", methods=["GET", "POST"]
)
@auth_required()
def account(id, start_date, end_date):
try:
account = (
models.db.session.query(models.Account).filter_by(id=id, user=g.user).one()
)
except NoResultFound:
return url_for("accounts._accounts")
form = FormAccount(obj=account)
form.accounttype.choices = forms.get_accounttype_as_choices()
form.entity.choices = forms.get_entities_as_choices()
if form.validate_on_submit():
account.name = form.name.data
account.desc = form.desc.data
if form.accounttype.data:
account.accounttype_id = form.accounttype.data
if form.entity.data:
account.entity_id = form.entity.data
models.db.session.add(account)
models.db.session.commit()
form.set_defaults(account)
transactions = models.db.session.query(
func.sum(models.Transaction.credit).label("credit"),
func.sum(models.Transaction.debit).label("debit"),
).filter(
models.Transaction.is_deleted == False, # noqa[W0612]
models.Transaction.is_archived == False,
models.Transaction.account_id == account.id,
models.Transaction.user_id == g.user.id,
)
transactions_amount = 0
for transaction in transactions.all():
amount = 0
if transaction.credit:
amount = transaction.credit
if transaction.debit:
amount += transaction.debit
transactions_amount += amount
return render_template(
"account.html",
form=form,
account=account,
transactions_amount=util.convert_to_float(int(transactions_amount)),
)
@accounts.route("/accounts/add", methods=["GET", "POST"])
@auth_required()
def add():
form = FormAccount()
form.accounttype.choices = forms.get_accounttype_as_choices()
form.entity.choices = forms.get_entities_as_choices()
account = None
if form.validate_on_submit():
account = models.Account(user_id=g.user.id)
account.name = form.name.data
account.desc = form.desc.data
if form.accounttype.data:
account.accounttype_id = form.accounttype.data
if form.entity.data:
account.entity_id = form.entity.data
models.db.session.add(account)
models.db.session.commit()
return redirect(url_for("accounts.account", id=account.id))
return render_template("account.html", form=form, account=account)