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')