Exemplo n.º 1
0
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())
Exemplo n.º 2
0
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())