86 lines
4.0 KiB
Python
86 lines
4.0 KiB
Python
from flask import Blueprint, render_template, request, redirect, url_for, session, flash, redirect, make_response, abort
|
|
from datetime import datetime, timedelta
|
|
|
|
from app.models.user_transactions import UserTransaction
|
|
from app.util import auth
|
|
from app.extensions import db
|
|
from app.models.user import User
|
|
from app.models.groups import Group
|
|
from app.models.asset import Asset
|
|
from app.enums.TransactionType import TransactionType
|
|
|
|
TransactionsRoute = Blueprint('transactions', __name__, url_prefix='/transactions')
|
|
|
|
CategoryToEnum = {
|
|
"purchase": TransactionType.Purchase,
|
|
"sale": TransactionType.Sale,
|
|
"group-payout": TransactionType.GroupPayout,
|
|
"stipends": TransactionType.BuildersClubStipend,
|
|
}
|
|
|
|
@TransactionsRoute.route("/", methods=["GET"])
|
|
@auth.authenticated_required
|
|
def TransactionsPage():
|
|
AuthenticatedUser : User = auth.GetCurrentUser()
|
|
|
|
CategoryArg = request.args.get('category', default="purchase", type=str)
|
|
if CategoryArg not in CategoryToEnum:
|
|
Category : TransactionType = TransactionType.Purchase
|
|
else:
|
|
Category : TransactionType = CategoryToEnum[CategoryArg]
|
|
|
|
PageNumber = request.args.get('page', default=1, type=int)
|
|
if PageNumber < 1:
|
|
PageNumber = 1
|
|
|
|
TransactionQuery = UserTransaction.query.filter_by( transaction_type = Category)
|
|
CategoryQueryDict = {
|
|
TransactionType.Purchase: lambda queryObj: queryObj.filter_by(
|
|
sender_id = AuthenticatedUser.id,
|
|
sender_type = 0
|
|
),
|
|
TransactionType.Sale: lambda queryObj: queryObj.filter_by(
|
|
reciever_id = AuthenticatedUser.id,
|
|
reciever_type = 0
|
|
),
|
|
TransactionType.GroupPayout: lambda queryObj: queryObj.filter_by(
|
|
reciever_id = AuthenticatedUser.id,
|
|
reciever_type = 0
|
|
),
|
|
TransactionType.BuildersClubStipend: lambda queryObj: queryObj.filter_by(
|
|
reciever_id = AuthenticatedUser.id,
|
|
reciever_type = 0
|
|
),
|
|
}
|
|
TransactionQuery = CategoryQueryDict[Category](TransactionQuery)
|
|
TransactionQuery = TransactionQuery.order_by(UserTransaction.created_at.desc())
|
|
TransactionQuery = TransactionQuery.paginate( page=PageNumber, per_page=15, error_out=False )
|
|
|
|
FormattedTransactions = []
|
|
for Transaction in TransactionQuery.items:
|
|
Transaction : UserTransaction = Transaction
|
|
TransactionInfo = {}
|
|
TransactionInfo["source"] = {
|
|
"id": Transaction.sender_id if Transaction.sender_id != AuthenticatedUser.id or Transaction.sender_type != 0 else Transaction.reciever_id,
|
|
"type": Transaction.sender_type if Transaction.sender_id != AuthenticatedUser.id or Transaction.sender_type != 0 else Transaction.reciever_type, # VV I know this is bad but im too lazy to think of another way to do it
|
|
"name": ( User.query.filter_by(id = Transaction.sender_id).first().username if Transaction.sender_type != 1 else Group.query.filter_by( id = Transaction.sender_id ).first().name ) if Transaction.sender_id != AuthenticatedUser.id or Transaction.sender_type != 0 else ( User.query.filter_by(id = Transaction.reciever_id).first().username if Transaction.reciever_type != 1 else Group.query.filter_by( id = Transaction.reciever_id ).first().name ),
|
|
}
|
|
TransactionInfo["currency_amount"] = Transaction.currency_amount
|
|
TransactionInfo["currency_type"] = Transaction.currency_type
|
|
TransactionInfo["created_at"] = Transaction.created_at.strftime("%d/%m/%Y %H:%M:%S UTC")
|
|
TransactionInfo["custom_text"] = Transaction.custom_text
|
|
if Transaction.assetId:
|
|
TransactionInfo["asset"] = {
|
|
"id": Transaction.assetId,
|
|
"name": Asset.query.filter_by(id = Transaction.assetId).first().name,
|
|
}
|
|
else:
|
|
TransactionInfo["asset"] = None
|
|
FormattedTransactions.append(TransactionInfo)
|
|
|
|
return render_template(
|
|
"transactions/transactions.html",
|
|
PageCategory = CategoryArg,
|
|
TransactionInfo = FormattedTransactions,
|
|
Pagination = TransactionQuery
|
|
) |