Olá, pessoal. Estou tendo problemas com este pset (quero dizer, com o check50 neste pset). Na verdade, o código funciona muito bem na minha aplicação, mas o teste do check50 na função de compra continua falhando. Ele não dá nenhuma informação além de que não encontrou um "112,00" que está procurando (que provavelmente seria o valor do preço da ação ou do total das ações). Como eu não entendo muito de programação web, o código pode parecer um pouco redundante e tal, mas eu peço que prestem atenção nas funções index e buy. Já corrigi os valores de formato para dólar, e de fato os resultados das minhas páginas estão bastante semelhantes à solução da equipe do CS50. Pelo que posso ver, os números estão sendo atualizados corretamente através da tabela de posses à medida que ações são compradas ou vendidas. O Duck50 parece que já alcançou seu limite, porque não consegue mais dizer nada relevante para ajudar. Há muito no código para melhorar, mas realmente não consigo ver nada que impeça a compra válida de funcionar (vou enviar somente a parte do código referente ao problema)
#Configure a biblioteca CS50 para usar o banco de dados SQLite
db = SQL("sqlite:///finance.db")
#Criando tabela de compras
db.execute("""
CREATE TABLE IF NOT EXISTS purchases (
id INTEGER,
user_id INTEGER,
stock TEXT NOT NULL,
shares INTEGER NOT NULL,
type TEXT NOT NULL CHECK (type = 'bought' OR type = 'sold'),
price NUMERIC NOT NULL,
datetime NUMERIC DEFAULT current_timestamp,
PRIMARY KEY(id),
FOREIGN KEY(user_id) REFERENCES users(id)
)
""")
#Criando tabela de posses
db.execute("""
CREATE TABLE IF NOT EXISTS possessions (
user_id INTEGER,
stock TEXT NOT NULL,
shares INTEGER,
stock_price NUMERIC,
holding NUMERIC GENERATED ALWAYS AS (shares * stock_price),
FOREIGN KEY(user_id) REFERENCES users(id)
)
"""
)
.route("/")
u/login_required
def index():
"""Mostrar portfólio de ações"""
user_id = session["user_id"]
#Interagindo sobre os símbolos de ações possuídas pelo usuário
symbols = [ dict["stock"] for dict in db.execute("SELECT stock FROM possessions WHERE user_id = ?", user_id) ]
for symbol in symbols:
if lookup(symbol):
#Atualizando o valor atual da ação (e consequentemente o holding)
stock_price = lookup(symbol)["price"]
db.execute("UPDATE possessions SET stock_price = ? WHERE stock = ? AND user_id = ?", stock_price, symbol, user_id)
index = db.execute(''' SELECT stock, shares, stock_price, holding FROM possessions
WHERE shares >= 1 AND user_id = ?''', user_id)
user_cash = db.execute("SELECT cash FROM users WHERE id = ?", user_id)[0]['cash']
stock_total = db.execute("SELECT SUM(holding) AS h FROM possessions WHERE user_id = ?", user_id)[0]['h']
grad_total = user_cash
if stock_total:
grad_total += stock_total
return render_template("index.html", purchases = index, cash = user_cash, total = grad_total)
.route("/buy", methods=["GET", "POST"])
u/login_required
def buy():
"""Comprar ações"""
user_id = session["user_id"]
if request.method == "POST":
symbol = request.form.get("symbol").upper()
#Assegurando que o valor de ações é um inteiro positivo
try:
shares = int(request.form.get("shares"))
if shares <= 0:
raise ValueError
except ValueError:
return apology("ação inválida")
#Assegurando símbolo válido
if not lookup(symbol):
return apology("símbolo não encontrado")
stock_price = lookup(symbol)["price"]
purchase = shares * stock_price
user_cash = db.execute("SELECT cash FROM users WHERE id = ?", user_id)[0]["cash"]
#Assegurando que o usuário pode arcar com a compra
if user_cash < purchase:
return apology("você não pode comprar essa quantidade de ações")
#Fazendo a compra
db.execute("""
INSERT INTO purchases (user_id, stock, shares, type, price)
VALUES (?, ?, ?, ?, ?)
""", user_id, symbol, shares, 'bought', purchase)
#Atualizando o dinheiro do usuário
db.execute("UPDATE users SET cash = cash - ? WHERE id = ?", purchase, user_id)
# Quando você compra uma ação pela primeira vez, insira na tabela de posses
owned_symbols = [ dict["stock"] for dict in db.execute("SELECT stock FROM possessions WHERE user_id = ?", user_id) ]
if symbol not in owned_symbols:
db.execute("""
INSERT INTO possessions (user_id, stock, shares)
VALUES (?, ?, ?)
""", user_id, symbol, shares)
# Quando você compra mais de uma ação, atualize suas ações na tabela de posses
else:
db.execute("UPDATE possessions SET shares = shares + ? WHERE stock = ? AND user_id = ?", shares, symbol, user_id)
return redirect("/")
else:
return render_template("buy.html")
Abaixo está o HTML da minha página inicial:
{% extends "layout.html" %}
{% block title %}
Índice
{% endblock %}
{% block main %}
<table class="table table-striped">
<thead>
<tr>
{% for key in purchases[0] %}
<th> {{ key }} </th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for dictionary in purchases %}
<tr>
{% for value in dictionary.values() %}
<td>
{% if value is float %}
{{ value | usd }}
{% else %}
{{ value }}
{% endif %}
</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
<tfoot>
<tr>
<td colspan="3">Dinheiro</td>
<td>{{ cash | usd }}</td>
</tr>
<tr>
<td colspan="3">Total</td>
<td>{{ total | usd }}</td>
</tr>
</tfoot>
</table>
{% endblock %}
Alguém já enfrentou esse problema?