· 9 years ago · Dec 03, 2016, 04:50 AM
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# configure CS50 Library to use SQLite database
16# db = SQL("sqlite:///signme.db")
17
18# configure sqlite3 database
19conn = sqlite3.connect('music.sqlite3')
20db = conn.cursor()
21
22# engine = create_engine('sqlite:///signme.db', echo=True)
23# metadata = MetaData(bind=engine)
24# users_table = Table('users', metadata, autoload=True)
25# events = Table('events', metadata, autoload=True)
26# registrants = 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 if session==[]:
51 """User profile page"""
52 # select row from users table corresponding to the user
53 user = db.execute("SELECT * FROM users WHERE id = :id", id=session["user_id"])
54
55 # select events from events table corresponding to the user
56 myevents = db.execute("SELECT title FROM events WHERE host = :host", host=session["user_id"])
57
58 # select events from registrants table corresponding to the user
59 registeredevents = db.execute("SELECT title FROM registrants JOIN events ON events.id = registrants.event_id WHERE user_id=:userid",
60 userid=session["user_id"])
61
62 return render_template("profile.html", user=user, myevents=myevents, registeredevents=registeredevents)
63 else:
64 return render_template("home.html")
65
66
67
68@app.route("/newevent", methods=["GET", "POST"])
69@login_required
70def newevent():
71 """Create new event."""
72
73 # if user reached route via POST
74 if request.method == "POST":
75
76 # update events table
77 event = db.execute("INSERT INTO events (title, host) VALUES (:title, :host)", title=request.form.get("title"),
78 host=session["user_id"])
79
80 return redirect(url_for("myevent") + event.id)
81
82 # else if user reached route via GET
83 else:
84 return render_template("newevent.html")
85
86@app.route("/myevent/<int:event_id>")
87@login_required
88def myevent(event_id):
89 """Show information related to the event."""
90
91 registrants = db.execute("SELECT * FROM registrants JOIN users ON users.id = registrants.user_id WHERE event_id=:eventid",
92 eventid=event_id)
93
94 event = db.execute("SELECT * FROM events WHERE event_id=:eventid", eventid=event_id)
95
96 number = len(registrants)
97
98 return render_template("myevent.html", registrants=registrants, event=event, number=number)
99
100
101@app.route("/login", methods=["GET", "POST"])
102def login():
103 """Log user in."""
104
105 # forget any user_id
106 session.clear()
107
108 # if user reached route via POST (as by submitting a form via POST)
109 if request.method == "POST":
110
111 # ensure username was submitted
112 if not request.form.get("email"):
113 return render_template("error.html", message = "Must provide email")
114
115 # ensure password was submitted
116 elif not request.form.get("password"):
117 return render_template("error.html", message = "Must provide password")
118
119 # query database for username
120 user = db.execute("SELECT * FROM users WHERE email=:email", email=request.form.get("email"))
121
122 # ensure username exists and password is correct
123 if user == [] or not pwd_context.verify(request.form.get("password"), user.password):
124 return render_template("error.html", message = "Invalid username and/or password")
125
126 # remember which user has logged in
127 session["user_id"] = user.id
128
129 # redirect user to home page
130 return redirect(url_for("home"))
131
132 # else if user reached route via GET (as by clicking a link or via redirect)
133 else:
134 return render_template("login.html")
135
136@app.route("/logout")
137def logout():
138 """Log user out."""
139
140 # forget any user_id
141 session.clear()
142
143 # redirect user to login form
144 return redirect(url_for("login"))
145
146
147@app.route("/register", methods=["GET", "POST"])
148def register():
149 """Register user."""
150
151 # if user reached route via POST
152 if request.method == "POST":
153
154 # ensure email is not blank
155 if not request.form.get("email"):
156 return render_template("error.html", message="Must provide email")
157
158 # ensure email isn't already taken
159 email = db.execute("SELECT * FROM users WHERE email = :email", email=request.form.get("email"))
160 if email != []:
161 return render_template("error.html", message="Sorry, this email is taken :(")
162
163 # ensure password is not blank
164 elif not request.form.get("password"):
165 return render_template("error.html", message="Must provide password")
166
167 # ensure same password entered again
168 elif request.form.get("password") != request.form.get("passwordconfirm"):
169 return render_template("error.html", message="Passwords must match")
170
171 # hash password
172 hash = pwd_context.encrypt(request.form.get("password"))
173
174
175 # enter new user into users
176 # user = db.execute("INSERT INTO users (email, password, first_name, last_name, birthdate, phone, school, major, grad_year,\
177 # house) VALUES (:email, :password, :first_name, :last_name, :birthdate, :phone, :school, :major, \
178 # :grad_year, :house)", email=request.form.get("email"), password=hash,
179 # first_name=request.form.get("first_name"), last_name=request.form.get("last_name"), birthdate=request.form.get("birthdate"),
180 # phone=request.form.get("phone"), school=request.form.get("school"), major=request.form.get("major"),
181 # grad_year=request.form.get("grad_year"), house=request.form.get("house"))
182
183 user = db.execute("INSERT INTO users (email, password, first_name, last_name, birthdate, phone, school, major, grad_year,\
184 house) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", request.form.get("email"), hash,
185 request.form.get("first_name"), request.form.get("last_name"), request.form.get("birthdate"),
186 request.form.get("phone"), request.form.get("school"), request.form.get("major"),
187 request.form.get("grad_year"), request.form.get("house"))
188
189 conn.commit()
190
191 # with engine.begin() as connection:
192 # user = connection.execute(users.insert(), email=request.form.get("email"), password=hash,
193 # first_name=request.form.get("first_name"), last_name=request.form.get("last_name"), birthdate=request.form.get("birthdate"),
194 # phone=request.form.get("phone"), school=request.form.get("school"), major=request.form.get("major"),
195 # grad_year=request.form.get("grad_year"), address=request.form.get("address"), zipcode=request.form.get("zipcode"),
196 # city=request.form.get("city"), state=request.form.get("state"))
197
198 #i = users.insert()
199 # user = users.insert().execute(email=request.form.get("email"), password=hash,
200 # first_name=request.form.get("first_name"), last_name=request.form.get("last_name"), birthdate=request.form.get("birthdate"),
201 # phone=request.form.get("phone"), school=request.form.get("school"), major=request.form.get("major"),
202 # grad_year=request.form.get("grad_year"), address=request.form.get("address"), zipcode=request.form.get("zipcode"),
203 # city=request.form.get("city"), state=request.form.get("state"))
204
205
206 # a connectionless way to Insert a user
207# ins = users_table.insert()
208# result = engine.execute(ins, name="Shinji", age=15, password="nihongo")
209
210# # another connectionless Insert
211# result = users_table.insert().execute(name="Martha", age=45, password="dingbat")
212
213
214 # remember the user who has just registered
215 session["user_id"] = user
216
217 # redirect user to home page
218 return redirect(url_for("home"))
219
220 # else if user reached route via GET
221 else:
222 return render_template("register.html")