Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- from cs50 import SQL
- from flask import Flask, flash, redirect, render_template, request, session
- from flask_session import Session
- from tempfile import mkdtemp
- from werkzeug.exceptions import default_exceptions
- from werkzeug.security import check_password_hash, generate_password_hash
- from helpers import apology, login_required, lookup, usd
- # Configure application
- app = Flask(__name__)
- # Ensure templates are auto-reloaded
- app.config["TEMPLATES_AUTO_RELOAD"] = True
- # Ensure responses aren't cached
- @app.after_request
- def after_request(response):
- response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
- response.headers["Expires"] = 0
- response.headers["Pragma"] = "no-cache"
- return response
- # Custom filter
- app.jinja_env.filters["usd"] = usd
- # Configure session to use filesystem (instead of signed cookies)
- app.config["SESSION_FILE_DIR"] = mkdtemp()
- app.config["SESSION_PERMANENT"] = False
- app.config["SESSION_TYPE"] = "filesystem"
- Session(app)
- # Configure CS50 Library to use SQLite database
- db = SQL("sqlite:///finance.db")
- @app.route("/")
- @login_required
- def index():
- userRows = db.execute("SELECT * FROM portfolio WHERE id = :uniqueid",
- unique=session["user_id"])
- seenStocks = {}
- stockPrices = {}
- for row in userRows:
- if row not in seenStocks:
- seenStocks[row["symbol"]] = row["shares"]
- else:
- seenStocks[row["symbol"]] = seenStocks[row["symbol"]] + row["shares"]
- for key, value in seenStocks:
- price = lookup(request.form.get("symbol"))["price"]
- stockPrices[key] = price
- seenStocksList = []
- stockPricesList = []
- seenStockShares = []
- totalPriceList = []
- for key, value in seenStocks:
- seenStocksList.append(key)
- seenStockShares.append(value)
- for price, shares in stockPricesList, seenStockShares:
- totalPriceList.append(price * shares)
- for value in stockPricesList:
- stockPricesList.append(value)
- return render_template("buy.html", names=seenStocksList, shares=seenStockShares, stockPrices=stockPricesList, totalPrices=totalPriceList)
- """Show portfolio of stocks"""
- @app.route("/buy", methods=["GET", "POST"])
- @login_required
- def buy():
- """Buy shares of stock"""
- # User reached route via POST (as by submitting a form via POST)
- if request.method == "POST":
- # Ensure symbol was entered
- if not request.form.get("symbol"):
- return apology("must provide symbol", 403)
- # Ensure password was submitted
- elif not request.form.get("numOfShares"):
- return apology("must provide number", 403)
- # Query database for username
- cashAmount = db.execute("SELECT users FROM users WHERE id=session[user_id]")
- stock = lookup(request.form.get("symbol"))
- if stock == None:
- return apology("invalid symbol", 403)
- totalPrice = stock["price"] * request.form.get("numOfShares")
- if stock["price"] * request.form.get("numOfShares") > cashAmount:
- return apology("invalid amount of cash", 403)
- else:
- result = db.execute("INSERT INTO portfolio (id, symbol, shares, price) VALUES(id, :symbol, :shares, :price)",
- id=session["user_id"], symbol=stock["symbol"], shares=request.form.get("numOfShares"), price=stock["price"])
- secondResult = db.execute("UPDATE users SET cash = cash - totalPrice where id = session[user_id]")
- return redirect("/")
- # User reached route via GET (as by clicking a link or via redirect)
- else:
- return render_template("buy.html")
- @app.route("/history")
- @login_required
- def history():
- """Show history of transactions"""
- return apology("TODO")
- @app.route("/login", methods=["GET", "POST"])
- def login():
- """Log user in"""
- # Forget any user_id
- session.clear()
- # User reached route via POST (as by submitting a form via POST)
- if request.method == "POST":
- # Ensure username was submitted
- if not request.form.get("username"):
- return apology("must provide username", 403)
- # Ensure password was submitted
- elif not request.form.get("password"):
- return apology("must provide password", 403)
- # Query database for username
- rows = db.execute("SELECT * FROM users WHERE username = :username",
- username=request.form.get("username"))
- # Ensure username exists and password is correct
- if len(rows) != 1 or not check_password_hash(rows[0]["hash"], request.form.get("password")):
- return apology("invalid username and/or password", 403)
- # Remember which user has logged in
- session["user_id"] = rows[0]["id"]
- return render_template("index.html")
- # User reached route via GET (as by clicking a link or via redirect)
- else:
- return render_template("login.html")
- @app.route("/logout")
- def logout():
- """Log user out"""
- # Forget any user_id
- session.clear()
- # Redirect user to login form
- return redirect("/")
- @app.route("/quote", methods=["GET", "POST"])
- @login_required
- def quote():
- """Get stock quote."""
- if request.method == "POST":
- quote = lookup(request.form.get("stock"))
- if quote != None:
- return render_template("stock.html", stock=quote["name"], price=quote["price"], symbol=quote["symbol"])
- else:
- return apology("Invalid Stock Name", 403)
- else:
- return render_template("quote.html")
- @app.route("/register", methods=["GET", "POST"])
- def register():
- """Register user"""
- if request.method == "POST":
- # Ensure username was submitted
- if not request.form.get("username"):
- return apology("Must Provide Username", 403)
- # Ensure password was submitted
- elif not request.form.get("password"):
- return apology("Must Provide Password", 403)
- elif not request.form.get("password-confirmation"):
- return apology("Must Provide Password Confirmation", 403)
- elif request.form.get("password-confirmation") != request.form.get("password"):
- return apology("Password & Password Confimation Must Match!")
- hashedPassword = generate_password_hash(request.form.get("password"))
- result = db.execute("INSERT INTO users (username, hash) VALUES(:username, :hash)", username=request.form.get("username"), hash=hashedPassword)
- if not result:
- return apology("Username already exists!")
- rows = db.execute("SELECT * FROM users WHERE username = :username",
- username=request.form.get("username"))
- session["user_id"] = rows[0]["id"]
- return render_template("register.html")
- else:
- return render_template("register.html")
- @app.route("/sell", methods=["GET", "POST"])
- @login_required
- def sell():
- """Sell shares of stock"""
- return apology("TODO")
- def errorhandler(e):
- """Handle error"""
- return apology(e.name, e.code)
- # listen for errors
- for code in default_exceptions:
- app.errorhandler(code)(errorhandler)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement