Purpose of Sell: to make sure the shares bought can be sold by selecting it through a dropdown list displaying symbols of share bought. I am trying to replicate the cs50 finance default page.
I have 3 tables in my SQL database: - user (default), portfolio, history
Below is my sell function from application.py. I am using for-loop to make sure that bought shares in portfolio can be selected in sell.html (like in index.html)
# SELL
@app.route("/sell", methods=["GET", "POST"])
@login_required
def sell():
"""Sell shares of stock"""
if request.method == "POST":
# ensure proper symbol
stock = lookup(request.form.get("symbol"))
if not stock:
return apology("Missing Symbol")
# ensure password was submitted
elif not request.form.get("shares"):
return apology("Missing shares")
else:
shares = request.form.get("shares")
# query database for user's cash
cash = db.execute("SELECT cash FROM users WHERE id = :id", id = session["user_id"])
cash = cash[0]["cash"]
# select the symbol shares of that user
user_shares = db.execute("SELECT shares FROM portfolio WHERE id = :id AND symbol=:symbol", \
id=session["user_id"], symbol=stock["symbol"])
stocks = db.execute("SELECT shares, symbol FROM portfolio WHERE id=:id", id=session["user_id"])
# check if enough shares to sell
if user_shares[0]["shares"] < shares:
return apology("Too many shares")
# update of a sell
db.execute("INSERT INTO history (symbol, shares, price, id) \
VALUES(:symbol, :shares, :price, :id)", \
symbol=stock["symbol"], shares=-shares, \
price=usd(stock["price"]), id=session["user_id"])
# update user cash (increase)
db.execute("UPDATE users SET cash = cash + :cash_after WHERE id = :id", \
id=session["user_id"], \
cash_after=stock["price"] * float(shares))
# decrement the shares count
shares_total = user_shares[0]["shares"] - shares
# if after decrement is zero, delete shares from portfolio
if shares_total == 0:
db.execute("DELETE FROM portfolio \
WHERE id=:id AND symbol=:symbol", \
id=session["user_id"], \
symbol=stock["symbol"])
# otherwise, update portfolio shares count
else:
db.execute("UPDATE portfolio SET shares=:shares \
WHERE id=:id AND symbol=:symbol", \
shares=shares_total, id=session["user_id"], \
symbol=stock["symbol"])
# flash bought alert
flash('Sold!')
# Redirect user to home page
return redirect("/")
else:
# If request method GET
return render_template("sell.html", stocks=stocks)
............................................................................
I want to use the backend python code above with my frontend sell.html code which is as follows:
{% extends "layout.html" %}
{% block title %}
Sell
{% endblock %}
{% block main %}
<form action="/sell" method="post">
<div class="form-group">
<select class="form-control" name="symbol" placeholder="Symbol">
{% for stock in stocks %}
<option value ="{{stock.symbol}}" > {{ stock.symbol}} </option>
{% endfor %}
</select>
</div>
<div class="form-group">
<input autocomplete="off" class="form-control" min="0" name="shares" placeholder="Shares" type="number">
</div>
<button class="btn btn-primary" type="submit">Sell</button>
</form>
{% endblock %}
Issue: Unable to get the output or the dropdown list of bought share in my portfolio. I get a stack trace.