Example #1
0
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"))
Example #2
0
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())
Example #3
0
def trade(request, pk):
    if request.user.is_authenticated():
        stock = Stock.objects.get(pk=pk)
        can_sell = request.user.userprofile.can_sell(stock)
        price = stock.price()
        userprofile = request.user.userprofile
        if request.method == 'POST':
            form = TradeForm(request.POST, can_sell=can_sell)
            form.validate_max_shares(stock, userprofile, price)
            if form.is_valid():
                form.save(commit=False).save_with_attrs(form, stock, userprofile, price)
                return HttpResponseRedirect('/stocks/')
        else:
            form = TradeForm(can_sell=can_sell)
        return render_to_response('stocks/trade.html',
               { 'form': form, 'stock': stock, 'can_sell': can_sell, 'price': price },
               context_instance=RequestContext(request))
    else:
        return render_to_response('stocks/trade.html')
Example #4
0
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"))
Example #5
0
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,
    )
Example #6
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())
Example #7
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())
Example #8
0
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)
Example #9
0
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)
Example #10
0
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)