def index(): """Main page that serves as both login screen and app screen.""" # Create debug user if no users exist if not User.query.all(): new_user = User("*****@*****.**", "a", "John", "Doe", "University of Virginia", True) db.session.add(new_user) create_portfolio(new_user, 1) db.session.commit() session["user"] = 1 # Identifies which form (if any) was submitted action = request.form["action"] if request.method == "POST" else None if "user" in session: user = User.query.filter_by(id=session["user"]).first() # Handle POST requests if action == "logout": session.pop("user", None) elif action == "trade": trade(user, TradeForm(request.form)) else: flash_all() return render_template("index.html", user=user, date=pretty_print(g.today), target=get_target() * RATE if g.status == "during" else None, tradeform=TradeForm(request.form), js=generate_js(session["user"])) else: # Handle POST requests if action == "register": register(RegForm(request.form)) elif action == "login": login(LoginForm(request.form)) else: flash_all() return render_template("login.html", regform=RegForm(request.form), loginform=LoginForm(request.form), js=generate_js(-1)) return redirect(url_for("index"))
def trade_transactions(): transactions = Trades.query.filter_by(user_id=current_user.username) if transactions.count() == 0: form = TradeForm() form.trade_currency.data = current_app.fx['code'] form.trade_date.data = datetime.utcnow() return render_template("warden/empty_txs.html", title="Empty Transaction List", current_app=current_app, current_user=fx_rate(), form=form) return render_template("warden/trade_transactions.html", title="Transaction History", transactions=transactions, current_app=current_app, current_user=fx_rate())
def delalltrades(): transactions = Trades.query.filter_by( user_id=current_user.username).order_by(Trades.trade_date) if transactions.count() == 0: form = TradeForm() form.trade_currency.data = current_app.fx['code'] form.trade_date.data = datetime.utcnow() return render_template("warden/empty_txs.html", title="Empty Transaction List", current_app=current_app, current_user=fx_rate(), form=form) if request.method == "GET": Trades.query.filter_by(user_id=current_user.username).delete() current_app.db.session.commit() regenerate_nav() flash("ALL TRANSACTIONS WERE DELETED", "danger") return redirect(url_for("warden.warden_page")) else: return redirect(url_for("warden.warden_page"))
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())
def stock(symbol): stock = get_Share(symbol) if stock.data_set['Open'] == None: # flash("Couldn't find that stock. Try another symbol.") stock = None return redirect(url_for('stocks')) else: # you wrote a function for these two lines, replace here! stock = set_stock_data(Share(symbol)) write_stock_to_db(stock) ### ^^ title = stock.name loggedin_user = get_user() user, allplayers, leaders = get_leaderboard(loggedin_user) form = StockSearchForm(request.form) tradeform = TradeForm(request.form) stocks = Stock.query.order_by(desc(Stock.view_count)).limit(10).all() if user != None: portfolio = user.portfolio portfolio.prettycash = pretty_numbers(portfolio.cash) # This is to show many shares much of that particular stock a user has in his/her position. positions = portfolio.positions position = portfolio.positions.filter_by(symbol=symbol).first() if position: position.prettysharecount = pretty_ints(position.sharecount) else: portfolio = None position = None positions = None if request.method == 'POST' and tradeform.validate(): share_amount = tradeform.amount.data buy_or_sell = tradeform.buy_or_sell.data if stock.get_price() == None: # If it's POST and valid, but there's no such stock flash("Couldn't find stock matching " + symbol.upper() + ". Try another symbol.") return redirect(url_for('stocks')) else: # if it's POSTed, validated, and there is a real stock trade(stock, share_amount, buy_or_sell, user, portfolio, positions) return redirect(url_for('user')) elif request.method == 'POST' and not tradeform.validate(): flash("Invalid share amount; please try again.") return redirect(url_for('stocks')) if request.method == 'GET': start = '2015-09-30' end = '2015-10-31' prices, dates = prepare_stock_graph(symbol, start, end) script, div = build_stock_plot(symbol, dates, prices) return render_template('stock.html', form=form, tradeform=tradeform, stock=stock, stocks=stocks, leaders=leaders, title=title, user=user, loggedin_user=loggedin_user, position=position, script=script, div=div)
def stocks(): title = 'StockHawk' stock = None loggedin_user = get_user() user, allplayers, leaders = get_leaderboard(loggedin_user) form = StockSearchForm(request.form) tradeform = TradeForm(request.form) stocks = Stock.query.order_by(desc(Stock.view_count)).limit(10).all() if request.method == 'POST': if form.validate(): stock = get_Share(form.stocklookup.data) # stock = Share(clean_stock_search(form.stocklookup.data)) if stock.data_set['Open'] == None: # company lookup goes here company_results = search_company(form.stocklookup.data) stock = None if len(company_results) == 0: flash("Couldn't find symbol or company matching " + form.stocklookup.data.upper() + ". Try searching for something else.") else: flash("Didn't find that symbol, but found " + str(len(company_results)) + " matching company names:") return render_template('stocks.html', stock=stock, form=form, stocks=stocks, leaders=leaders, user=user, loggedin_user=loggedin_user, results=company_results) else: # There is a stock with this symbol, serve the dynamic page stock = set_stock_data(stock) # Some stocks appear to not have company names if stock.name != None: title = stock.symbol + " - " + stock.name else: title = stock.symbol + " - Unnamed company" write_stock_to_db(stock) return redirect(url_for('stock', symbol=stock.symbol)) elif not form.validate(): flash("Please enter a stock.") return redirect(url_for('stocks')) return render_template('stocks.html', form=form, tradeform=tradeform, stock=stock, leaders=leaders, title=title, user=user, loggedin_user=loggedin_user) elif request.method == 'GET': for s in stocks: s.prettyprice = pretty_numbers(s.price) return render_template('stocks.html', form=form, tradeform=tradeform, stock=stock, stocks=stocks, leaders=leaders, title=title, user=user, loggedin_user=loggedin_user)
def trade(): if 'loggedin' not in session: flash('Log In or Sign Up to start trading!') return redirect(url_for('login')) form = TradeForm() if form.validate_on_submit(): #Get stock symbol = form.symbol.data.upper() quantity = form.quantity.data try: stock = yf.Ticker(symbol) ask = stock.info['ask'] trade_amount = ask * quantity if form.buy.data: #Get cash cursor.execute("SELECT * FROM Users WHERE id=%s", session['id']) for row in cursor: cash = row[4] if trade_amount <= cash: #Subtract ask from cash, insert stock cursor.execute("UPDATE Users SET cash=cash-%s WHERE id=%s", (trade_amount, session['id'])) #Increment quantity if owned, otherwise add cursor.execute( "SELECT * FROM Stocks WHERE id=%s AND symbol=%s", (session['id'], symbol)) if cursor.fetchone(): cursor.execute( "UPDATE Stocks SET quantity=quantity+%s, date=%s WHERE id=%s", (quantity, datetime.now().date(), session['id'])) else: cursor.execute( "INSERT INTO Stocks VALUES (%s, %s, %s, %s)", (session['id'], symbol, quantity, datetime.now().date())) db.commit() flash('Transaction completed!') else: flash('Insufficient funds.') return render_template('trade.html', form=form) elif form.sell.data: #Check quantity cursor.execute( "SELECT quantity FROM Stocks WHERE id=%s AND symbol=%s", (session['id'], symbol)) owned = cursor.fetchone()[0] if owned: if quantity > owned: flash('You can\'t sell more stock than you own!') return render_template('trade.html', form=form) elif quantity == owned: cursor.execute( "DELETE FROM Stocks WHERE id=%s AND symbol=%s", (session['id'], symbol)) else: cursor.execute( "UPDATE Stocks SET quantity=quantity-%s, date=%s WHERE id=%s AND symbol=%s", (quantity, datetime.now().date(), session['id'], symbol)) #Increment cash cursor.execute("UPDATE Users SET cash=cash+%s WHERE id=%s", (trade_amount, session['id'])) db.commit() flash('Transaction completed!') else: flash('You can\'t sell a stock you don\'t own!') return render_template('trade.html', form=form) except: flash('An error occurred.') return redirect(url_for('trade')) return render_template('trade.html', form=form)