· 9 years ago · Nov 26, 2016, 11:12 PM
1import sqlite3
2from flask import Flask, flash, redirect, render_template, request, session, url_for
3from flask_session import Session
4from passlib.apps import custom_app_context as pwd_context
5from tempfile import gettempdir
6from sqlalchemy import *
7
8from helpers import *
9
10from cs50 import SQL
11
12# configure application
13app = Flask(__name__)
14
15# set up SQLAlchemy
16# app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///signme.db'
17# db = SQLAlchemy(app)
18
19# configure CS50 Library to use SQLite database
20# db = SQL("sqlite:///signme.db")
21
22db = create_engine('sqlite:///signme.db', echo=True)
23metadata = MetaData(bind=db)
24users = Table('users', metadata, autoload=True)
25events = Table('events', metadata, autoload=True)
26registrants = Table('registrants', metadata, autoload=True)
27
28# ensure responses aren't cached
29if app.config["DEBUG"]:
30 @app.after_request
31 def after_request(response):
32 response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
33 response.headers["Expires"] = 0
34 response.headers["Pragma"] = "no-cache"
35 return response
36
37# configure session to use filesystem (instead of signed cookies)
38app.config["SESSION_FILE_DIR"] = gettempdir()
39app.config["SESSION_PERMANENT"] = False
40app.config["SESSION_TYPE"] = "filesystem"
41Session(app)
42
43# connect to database
44# conn = sqlite3.connect('signme.db', check_same_thread=False)
45# db = conn.cursor()
46
47
48@app.route("/")
49def home():
50 return render_template("home.html")
51
52@app.route("/profile")
53@login_required
54def profile():
55 """User profile page"""
56 # select row from users table corresponding to the user
57 user = db.execute("SELECT * FROM users WHERE id = :id", id=session["user_id"])
58
59 # select events from events table corresponding to the user
60 myevents = db.execute("SELECT title FROM events WHERE host = :host", host=session["user_id"])
61
62 # select events from registrants table corresponding to the user
63 #registeredevents = db.execute("SELECT title from ")
64
65 return render_template("profile.html", user=user, myevents=myevents)
66
67@app.route("/newevent", methods=["GET", "POST"])
68@login_required
69def newevent():
70 """Create new event."""
71
72 # if user reached route via POST
73 if request.method == "POST":
74
75 # update events table
76 event = db.execute("INSERT INTO events (title, host) VALUES (:title, :host)", title=request.form.get("title"),
77 host=session["user_id"])
78
79 return redirect(url_for("myevent") + event.id)
80
81 # else if user reached route via GET
82 else:
83 return render_template("newevent.html")
84
85@app.route("/myevent/<int:event_id>")
86@login_required
87def myevent(event_id):
88 """Show information related to the event."""
89
90 registrants = db.execute("SELECT * FROM registrants JOIN users ON users.id = registrants.user_id WHERE event_id=:eventid",
91 eventid=event_id)
92
93 return render_template("newevent.html", registrants=registrants)
94
95
96@app.route("/login", methods=["GET", "POST"])
97def login():
98 """Log user in."""
99
100 # forget any user_id
101 session.clear()
102
103 # if user reached route via POST (as by submitting a form via POST)
104 if request.method == "POST":
105
106 # ensure username was submitted
107 if not request.form.get("email"):
108 return render_template("error.html", message = "Must provide email")
109
110 # ensure password was submitted
111 elif not request.form.get("password"):
112 return render_template("error.html", message = "Must provide password")
113
114 # query database for username
115 row = db.execute("SELECT * FROM users WHERE email = :email", email=request.form.get("email"))
116
117 user = row.fetchone()
118 print(row)
119
120 # ensure username exists and password is correct
121 if user == [] or not pwd_context.verify(request.form.get("password"), user.password):
122 return render_template("error.html", message = "Invalid username and/or password")
123
124 # remember which user has logged in
125 session["user_id"] = user.id
126
127 # redirect user to home page
128 return redirect(url_for("home"))
129
130 # else if user reached route via GET (as by clicking a link or via redirect)
131 else:
132 return render_template("login.html")
133
134@app.route("/logout")
135def logout():
136 """Log user out."""
137
138 # forget any user_id
139 session.clear()
140
141 # redirect user to login form
142 return redirect(url_for("login"))
143
144
145@app.route("/register", methods=["GET", "POST"])
146def register():
147 """Register user."""
148
149 # if user reached route via POST
150 if request.method == "POST":
151
152 # ensure email is not blank
153 if not request.form.get("email"):
154 return render_template("error.html", message="Must provide email")
155
156 # ensure email isn't already taken
157 # s = users.select()
158 # rs = s.execute()
159 s = users.select(users.c.email == request.form.get("email"))
160 email = s.execute()
161 #email = db.execute("SELECT * FROM users WHERE email = :email", email=request.form.get("email"))
162 if email != []:
163 return render_template("error.html", message="Sorry, this email is taken :(")
164
165 # ensure password is not blank
166 elif not request.form.get("password"):
167 return render_template("error.html", message="Must provide password")
168
169 # ensure same password entered again
170 elif request.form.get("password") != request.form.get("passwordconfirm"):
171 return render_template("error.html", message="Passwords must match")
172
173 # hash password
174 hash=pwd_context.encrypt(request.form.get("password"))
175
176 # enter new user into users
177 user = db.execute("INSERT INTO users (email, password, first_name, last_name, birthdate, phone, school, major, grad_year,\
178 address, zipcode, city, state) VALUES (:email, :password, :first_name, :last_name, :birthdate, :phone, :school, :major, \
179 :grad_year, :address, :zipcode, :city, :state)", email=request.form.get("email"), password=hash,
180 first_name=request.form.get("first_name"), last_name=request.form.get("last_name"), birthdate=request.form.get("birthdate"),
181 phone=request.form.get("phone"), school=request.form.get("school"), major=request.form.get("major"),
182 grad_year=request.form.get("grad_year"), address=request.form.get("address"), zipcode=request.form.get("zipcode"),
183 city=request.form.get("city"), state=request.form.get("state"))
184
185 # with engine.begin() as connection:
186 # user = connection.execute(users.insert(), email=request.form.get("email"), password=hash,
187 # first_name=request.form.get("first_name"), last_name=request.form.get("last_name"), birthdate=request.form.get("birthdate"),
188 # phone=request.form.get("phone"), school=request.form.get("school"), major=request.form.get("major"),
189 # grad_year=request.form.get("grad_year"), address=request.form.get("address"), zipcode=request.form.get("zipcode"),
190 # city=request.form.get("city"), state=request.form.get("state"))
191
192 #i = users.insert()
193 # user = users.insert().execute(email=request.form.get("email"), password=hash,
194 # first_name=request.form.get("first_name"), last_name=request.form.get("last_name"), birthdate=request.form.get("birthdate"),
195 # phone=request.form.get("phone"), school=request.form.get("school"), major=request.form.get("major"),
196 # grad_year=request.form.get("grad_year"), address=request.form.get("address"), zipcode=request.form.get("zipcode"),
197 # city=request.form.get("city"), state=request.form.get("state"))
198
199
200 # a connectionless way to Insert a user
201# ins = users_table.insert()
202# result = engine.execute(ins, name="Shinji", age=15, password="nihongo")
203
204# # another connectionless Insert
205# result = users_table.insert().execute(name="Martha", age=45, password="dingbat")
206
207
208 # remember the user who has just registered
209 session["user_id"] = user
210
211 # redirect user to home page
212 return redirect(url_for("home"))
213
214 # else if user reached route via GET
215 else:
216 return render_template("register.html")