You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

109 lines
3.7 KiB

from flask import Blueprint, render_template, redirect, url_for, request
from app import db
from app.models import Account, Transaction
from app.forms import AccountForm, TransactionForm
from flask_table import Table, Col
bp = Blueprint('main', __name__)
@bp.route('/')
def index():
accounts = Account.query.all()
return render_template('index.html', accounts=accounts)
@bp.route('/add_account', methods=['GET', 'POST'])
def add_account():
form = AccountForm()
if form.validate_on_submit():
account = Account(name=form.name.data, account_type=form.account_type.data, balance=form.balance.data)
db.session.add(account)
db.session.commit()
return redirect(url_for('main.index'))
return render_template('add_account.html', form=form)
@bp.route('/add_transaction', methods=['GET', 'POST'])
def add_transaction():
form = TransactionForm()
if form.validate_on_submit():
transaction = Transaction(
amount=form.amount.data,
type=form.type.data,
source_account_id=form.source_account.data,
destination_account_id=form.destination_account.data,
concept=form.concept.data
)
source_account = Account.query.get(form.source_account.data)
destination_account = Account.query.get(form.destination_account.data)
source_account.balance -= transaction.amount
destination_account.balance += transaction.amount
db.session.add(transaction)
db.session.commit()
return redirect(url_for('main.index'))
return render_template('add_transaction.html', form=form)
@bp.route('/accounts', methods=['GET'])
def accounts():
search = request.args.get('search')
sort_by = request.args.get('sort_by', 'name')
sort_order = request.args.get('sort_order', 'asc')
query = Account.query
if search:
query = query.filter(Account.name.like(f'%{search}%'))
if sort_order == 'asc':
query = query.order_by(sort_by)
else:
query = query.order_by(db.desc(sort_by))
accounts = query.all()
table = AccountsTable(accounts)
return render_template('accounts_list.html', table=table, search=search, sort_by=sort_by, sort_order=sort_order)
class AccountsTable(Table):
date = Col('Name')
amount = Col('Account Type')
type = Col('Amount')
def sort_url(self, col_id, reverse=False):
if reverse:
return url_for('main.accounts', sort_by=col_id, sort_order='desc')
else:
return url_for('main.accounts', sort_by=col_id, sort_order='asc')
@bp.route('/transactions', methods=['GET'])
def transactions():
search = request.args.get('search')
sort_by = request.args.get('sort_by', 'date')
sort_order = request.args.get('sort_order', 'asc')
query = Transaction.query
if search:
query = query.filter(Transaction.concept.like(f'%{search}%'))
if sort_order == 'asc':
query = query.order_by(sort_by)
else:
query = query.order_by(db.desc(sort_by))
transactions = query.all()
table = TransactionTable(transactions)
return render_template('transaction_list.html', table=table, search=search, sort_by=sort_by, sort_order=sort_order)
class TransactionTable(Table):
date = Col('Date')
amount = Col('Amount')
type = Col('Type')
source_account = Col('Source Account')
destination_account = Col('Destination Account')
concept = Col('Concept')
def sort_url(self, col_id, reverse=False):
if reverse:
return url_for('main.transactions', sort_by=col_id, sort_order='desc')
else:
return url_for('main.transactions', sort_by=col_id, sort_order='asc')