def index(): """Show portfolio of stocks""" # request necessary data data = get_portfolio("symbol", "asc") return render_template("index.html", rows = data[1], totals = data[0])
def sort_table(): if request.method == "POST": sort_by = request.form.get("sortBy") sort_order = request.form.get("sortOrder") table_type = request.form.get("tableType") filter_by = request.form.get("filterBy") if not table_type: return redirect(url_for("index")) elif table_type == "portfolio": data = get_portfolio(sort_by, sort_order) return render_template("portfolio_table.html", rows = data[1], totals = data[0]) elif table_type == "history": data = get_history(sort_by, sort_order, filter_by) return render_template("history_table.html", history = data)
def sell(): portfolio = get_portfolio(db, session["user_id"]) if len(portfolio) == 0: return apology("You don't have stocks to sell") else: symbols = list(map(lambda stock: stock["symbol"].upper(), portfolio)) if request.method == "GET": return render_template("sell.html", symbols=symbols) else: symbol = request.form.get("symbol") shares = request.form.get("shares") if symbol == "": return apology("You have to select a stock") elif shares == "": return apology("Must specify number of shares") elif symbol not in symbols: return apology("You do not own that stock") elif int(shares) < 0: return apology("Input must be positive") elif int(shares) == 0: return apology("You need to sell at least 1") elif int(shares) > list(filter(lambda y: y['symbol'].upper() == symbol, portfolio))[0]['sum']: return apology(f"You don't have enough { symbol } shares") stock = lookup(symbol) total_price = int(shares) * stock["price"] cash = get_cash(db, session["user_id"]) update_cash(db, cash, total_price, session["user_id"]) insert_transaction_cmd = """INSERT INTO transactions (user_id, symbol, shares, price, id) VALUES (:user_id, :symbol, :shares, :price, nextval('id_transactions'))""" db.engine.execute(text(insert_transaction_cmd), user_id=session["user_id"], symbol=symbol.lower(), shares=(0 - int(shares)), price=stock["price"]) return redirect("/")
def index(): """Show portfolio of stocks""" user_id = session["user_id"] cash = db.execute("SELECT cash FROM users WHERE id=:user_id", user_id=user_id) total = [] total_buy_price = 0 total_value = 0 total_shares = 0 portfolio = get_portfolio(db, user_id) if portfolio: for element in portfolio: current_price = get_price(element['symbol']) value = element['shares'] * current_price total_buy_price += element['share_value'] total_value += value total_shares += element['shares'] element.update({'price': current_price}) element.update({'value': value}) element.update({'diff': value - element['share_value']}) element.update({ 'diff_percent': ((value - element['share_value']) / (element['share_value'] * 100)) if element['share_value'] else 0 }) total.append({ 'total_shares': total_shares, 'total_buy_price': total_buy_price, 'total_value': total_value, 'total_diff': total_value - total_buy_price, 'total_diff_percent': (total_value - total_buy_price) / total_buy_price * 100 }) session["value"] = total_value return render_template("index.html", portfolio=portfolio, cash=cash, total=total)
def index(): cash = get_cash(db, session["user_id"]) portfolio = get_portfolio(db, session["user_id"]) if len(portfolio) > 0: # cash = round(portfolio[0]["cash"], 2) stocks_value = 0 for stock in portfolio: updated_stock = lookup(stock["symbol"]) stock["name"] = updated_stock["name"] stock["price"] = round(decimal.Decimal(updated_stock["price"]), 2) stocks_value += (stock["price"] * stock["sum"]) empty = False else: stocks_value = 0 empty = True return render_template("index.html", portfolio=portfolio, cash=round(cash, 2), empty=empty, stocks_value=stocks_value)
def sell(): """Sell shares of stock""" user_id = session["user_id"] if request.method == "GET": portfolio = get_portfolio(db, user_id) return render_template("/sell.html", portfolio=portfolio) else: stock = json.loads(request.form.get("symbol")) shares = int(request.form.get("shares")) cash_before = get_cash(db, user_id) sell = lookup(stock['symbol']) # TODO refactor buy in sell in own function db.execute( "INSERT INTO transactions (user_id, symbol, shares, price, method, time_stamp) values (:user_id, :symbol, :shares, :price, :method, :time)", user_id=user_id, symbol=stock['symbol'], shares=-shares, price=sell['price'], method="sell", time=datetime.now()) cash_after = cash_before + (sell['price'] * shares) update_cash(db, user_id, cash_after) return redirect("/")