def edittransaction(): form = TradeForm() reference_id = request.args.get("reference_id") id = request.args.get("id") if reference_id: trade = Trades.query.filter_by( user_id=current_user.username).filter_by( trade_reference_id=reference_id).first() if trade.count() == 0: abort(404, "Transaction not found") id = trade.id trade = Trades.query.filter_by(user_id=current_user.username).filter_by( id=id).first() if trade is None: abort(404) if trade.user_id != current_user.username: abort(403) acclist = AccountInfo.query.filter_by(user_id=current_user.username) accounts = [] for item in acclist: accounts.append((item.account_longname, item.account_longname)) form.trade_account.choices = accounts form.submit.label.text = 'Edit Trade' if request.method == "POST": if form.validate_on_submit(): # Write changes to database if form.trade_operation.data in ("B", "D"): qop = 1 elif form.trade_operation.data in ("S", "W"): qop = -1 else: qop = 0 # Calculate Trade's cash value cvfail = False try: p = float(clean_float(form.trade_price.data)) q = float(clean_float(form.trade_quantity.data)) f = float(clean_float(form.trade_fees.data)) cv = qop * (q * p) + f except ValueError: flash( "Error on calculating cash amount \ for transaction - TRADE NOT edited. Try Again.", "danger", ) cvfail = True cv = 0 trade.trade_date = form.trade_date.data trade.trade_asset_ticker = form.trade_asset_ticker.data trade.trade_currency = form.trade_currency.data trade.trade_operation = form.trade_operation.data trade.trade_quantity = float(form.trade_quantity.data) * qop trade.trade_price = float(clean_float(form.trade_price.data)) trade.trade_fees = float(clean_float(form.trade_fees.data)) trade.trade_account = form.trade_account.data trade.trade_notes = form.trade_notes.data trade.cash_value = cv if not cvfail: current_app.db.session.commit() regenerate_nav() flash("Trade edit successful", "success") return redirect(url_for("warden.warden_page")) flash("Trade edit failed. Something went wrong. Try Again.", "danger") # Pre-populate the form form.trade_date.data = trade.trade_date form.trade_currency.data = trade.trade_currency form.trade_asset_ticker.data = trade.trade_asset_ticker form.trade_operation.data = trade.trade_operation form.trade_quantity.data = abs(float(trade.trade_quantity)) form.trade_price.data = trade.trade_price form.trade_fees.data = trade.trade_fees form.trade_account.data = trade.trade_account form.trade_notes.data = trade.trade_notes return render_template("warden/edittransaction.html", title="Edit Transaction", form=form, trade=trade, id=id, current_app=current_app, current_user=fx_rate())
def newtrade(): form = TradeForm() acclist = AccountInfo.query.filter_by(user_id=current_user.username) accounts = [] for item in acclist: accounts.append((item.account_longname, item.account_longname)) form.trade_account.choices = accounts if request.method == "POST": if form.validate_on_submit(): # Need to include two sides of trade: if form.trade_operation.data in ("B"): qop = 1 elif form.trade_operation.data in ("S"): qop = -1 else: qop = 0 flash( "Trade Operation Error. Should be B for buy or S for sell.", "warning") # Calculate Trade's cash value cvfail = False try: p = float(clean_float(form.trade_price.data)) q = float(clean_float(form.trade_quantity.data)) f = float(clean_float(form.trade_fees.data)) cv = qop * (q * p) + f except ValueError: flash( "Error on calculating fiat amount \ for transaction - TRADE NOT included", "danger", ) cvfail = True cv = 0 # Check what type of trade this is # Cash and/or Asset try: tquantity = float(form.trade_quantity.data) * qop except ValueError: tquantity = 0 try: tprice = float(form.trade_price.data) except ValueError: tprice = 0 trade = Trades( user_id=current_user.username, trade_date=form.trade_date.data, trade_account=form.trade_account.data, trade_currency=form.trade_currency.data, trade_asset_ticker=form.trade_asset_ticker.data, trade_quantity=tquantity, trade_operation=form.trade_operation.data, trade_price=tprice, trade_fees=form.trade_fees.data, trade_notes=form.trade_notes.data, cash_value=cv, ) if not cvfail: current_app.db.session.add(trade) current_app.db.session.commit() regenerate_nav() flash("Trade included", "success") return redirect(url_for("warden.warden_page")) else: flash("Trade Input failed. Something went wrong. Try Again.", "danger") form.trade_currency.data = current_app.fx['code'] form.trade_date.data = datetime.utcnow() return render_template("warden/newtrade.html", form=form, title="New Trade", current_app=current_app, current_user=fx_rate())