Advertisement
Guest User

Untitled

a guest
Sep 26th, 2018
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.29 KB | None | 0 0
  1. import os
  2.  
  3. from cs50 import SQL
  4. from flask import Flask, flash, redirect, render_template, request, session
  5. from flask_session import Session
  6. from tempfile import mkdtemp
  7. from werkzeug.exceptions import default_exceptions
  8. from werkzeug.security import check_password_hash, generate_password_hash
  9.  
  10. from helpers import apology, login_required, lookup, usd
  11.  
  12. # Configure application
  13. app = Flask(__name__)
  14.  
  15. # Ensure templates are auto-reloaded
  16. app.config["TEMPLATES_AUTO_RELOAD"] = True
  17.  
  18. # Ensure responses aren't cached
  19. @app.after_request
  20. def after_request(response):
  21. response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
  22. response.headers["Expires"] = 0
  23. response.headers["Pragma"] = "no-cache"
  24. return response
  25.  
  26. # Custom filter
  27. app.jinja_env.filters["usd"] = usd
  28.  
  29. # Configure session to use filesystem (instead of signed cookies)
  30. app.config["SESSION_FILE_DIR"] = mkdtemp()
  31. app.config["SESSION_PERMANENT"] = False
  32. app.config["SESSION_TYPE"] = "filesystem"
  33. Session(app)
  34.  
  35. # Configure CS50 Library to use SQLite database
  36. db = SQL("sqlite:///finance.db")
  37.  
  38.  
  39. @app.route("/")
  40. @login_required
  41. def index():
  42. userRows = db.execute("SELECT * FROM portfolio WHERE id = :uniqueid",
  43. unique=session["user_id"])
  44.  
  45. seenStocks = {}
  46. stockPrices = {}
  47. for row in userRows:
  48. if row not in seenStocks:
  49. seenStocks[row["symbol"]] = row["shares"]
  50. else:
  51. seenStocks[row["symbol"]] = seenStocks[row["symbol"]] + row["shares"]
  52.  
  53. for key, value in seenStocks:
  54. price = lookup(request.form.get("symbol"))["price"]
  55. stockPrices[key] = price
  56.  
  57. seenStocksList = []
  58. stockPricesList = []
  59. seenStockShares = []
  60. totalPriceList = []
  61. for key, value in seenStocks:
  62. seenStocksList.append(key)
  63. seenStockShares.append(value)
  64.  
  65. for price, shares in stockPricesList, seenStockShares:
  66. totalPriceList.append(price * shares)
  67.  
  68. for value in stockPricesList:
  69. stockPricesList.append(value)
  70.  
  71. return render_template("buy.html", names=seenStocksList, shares=seenStockShares, stockPrices=stockPricesList, totalPrices=totalPriceList)
  72. """Show portfolio of stocks"""
  73.  
  74.  
  75.  
  76. @app.route("/buy", methods=["GET", "POST"])
  77. @login_required
  78. def buy():
  79. """Buy shares of stock"""
  80. # User reached route via POST (as by submitting a form via POST)
  81. if request.method == "POST":
  82.  
  83. # Ensure symbol was entered
  84. if not request.form.get("symbol"):
  85. return apology("must provide symbol", 403)
  86.  
  87. # Ensure password was submitted
  88. elif not request.form.get("numOfShares"):
  89. return apology("must provide number", 403)
  90.  
  91. # Query database for username
  92. cashAmount = db.execute("SELECT users FROM users WHERE id=session[user_id]")
  93.  
  94. stock = lookup(request.form.get("symbol"))
  95.  
  96. if stock == None:
  97. return apology("invalid symbol", 403)
  98.  
  99. totalPrice = stock["price"] * request.form.get("numOfShares")
  100.  
  101. if stock["price"] * request.form.get("numOfShares") > cashAmount:
  102. return apology("invalid amount of cash", 403)
  103. else:
  104. result = db.execute("INSERT INTO portfolio (id, symbol, shares, price) VALUES(id, :symbol, :shares, :price)",
  105. id=session["user_id"], symbol=stock["symbol"], shares=request.form.get("numOfShares"), price=stock["price"])
  106. secondResult = db.execute("UPDATE users SET cash = cash - totalPrice where id = session[user_id]")
  107.  
  108.  
  109. return redirect("/")
  110.  
  111. # User reached route via GET (as by clicking a link or via redirect)
  112. else:
  113. return render_template("buy.html")
  114.  
  115.  
  116. @app.route("/history")
  117. @login_required
  118. def history():
  119. """Show history of transactions"""
  120. return apology("TODO")
  121.  
  122.  
  123. @app.route("/login", methods=["GET", "POST"])
  124. def login():
  125. """Log user in"""
  126.  
  127. # Forget any user_id
  128. session.clear()
  129.  
  130. # User reached route via POST (as by submitting a form via POST)
  131. if request.method == "POST":
  132.  
  133. # Ensure username was submitted
  134. if not request.form.get("username"):
  135. return apology("must provide username", 403)
  136.  
  137. # Ensure password was submitted
  138. elif not request.form.get("password"):
  139. return apology("must provide password", 403)
  140.  
  141. # Query database for username
  142. rows = db.execute("SELECT * FROM users WHERE username = :username",
  143. username=request.form.get("username"))
  144.  
  145. # Ensure username exists and password is correct
  146. if len(rows) != 1 or not check_password_hash(rows[0]["hash"], request.form.get("password")):
  147. return apology("invalid username and/or password", 403)
  148.  
  149. # Remember which user has logged in
  150. session["user_id"] = rows[0]["id"]
  151.  
  152. return render_template("index.html")
  153.  
  154. # User reached route via GET (as by clicking a link or via redirect)
  155. else:
  156. return render_template("login.html")
  157.  
  158.  
  159. @app.route("/logout")
  160. def logout():
  161. """Log user out"""
  162.  
  163. # Forget any user_id
  164. session.clear()
  165.  
  166. # Redirect user to login form
  167. return redirect("/")
  168.  
  169.  
  170. @app.route("/quote", methods=["GET", "POST"])
  171. @login_required
  172. def quote():
  173. """Get stock quote."""
  174. if request.method == "POST":
  175.  
  176. quote = lookup(request.form.get("stock"))
  177.  
  178. if quote != None:
  179. return render_template("stock.html", stock=quote["name"], price=quote["price"], symbol=quote["symbol"])
  180. else:
  181. return apology("Invalid Stock Name", 403)
  182. else:
  183. return render_template("quote.html")
  184.  
  185.  
  186.  
  187. @app.route("/register", methods=["GET", "POST"])
  188. def register():
  189. """Register user"""
  190. if request.method == "POST":
  191.  
  192. # Ensure username was submitted
  193. if not request.form.get("username"):
  194. return apology("Must Provide Username", 403)
  195.  
  196. # Ensure password was submitted
  197. elif not request.form.get("password"):
  198. return apology("Must Provide Password", 403)
  199.  
  200. elif not request.form.get("password-confirmation"):
  201. return apology("Must Provide Password Confirmation", 403)
  202.  
  203. elif request.form.get("password-confirmation") != request.form.get("password"):
  204. return apology("Password & Password Confimation Must Match!")
  205.  
  206. hashedPassword = generate_password_hash(request.form.get("password"))
  207.  
  208. result = db.execute("INSERT INTO users (username, hash) VALUES(:username, :hash)", username=request.form.get("username"), hash=hashedPassword)
  209.  
  210. if not result:
  211. return apology("Username already exists!")
  212.  
  213. rows = db.execute("SELECT * FROM users WHERE username = :username",
  214. username=request.form.get("username"))
  215.  
  216. session["user_id"] = rows[0]["id"]
  217.  
  218. return render_template("register.html")
  219.  
  220. else:
  221. return render_template("register.html")
  222.  
  223. @app.route("/sell", methods=["GET", "POST"])
  224. @login_required
  225. def sell():
  226. """Sell shares of stock"""
  227. return apology("TODO")
  228.  
  229.  
  230. def errorhandler(e):
  231. """Handle error"""
  232. return apology(e.name, e.code)
  233.  
  234.  
  235. # listen for errors
  236. for code in default_exceptions:
  237. app.errorhandler(code)(errorhandler)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement