def index(): """Show all the props, most recent first.""" db = get_db() props = db.execute('SELECT p.id, ppin, body, created, author_id, username' ' FROM tprops p JOIN tuser u ON p.author_id = u.id' ' ORDER BY created DESC').fetchall() return render_template('props/index.html', props=props)
def register(): """Register a new user. Validates that the username is not already taken. Hashes the password for security. """ if request.method == 'POST': username = request.form['username'] password = request.form['password'] db = get_db() error = None if not username: error = 'Username is required.' elif not password: error = 'Password is required.' elif db.execute('SELECT id FROM tuser WHERE username = ?', (username, )).fetchone() is not None: error = 'User {0} is already registered.'.format(username) if error is None: # the name is available, store it in the database and go to # the login page db.execute('INSERT INTO tuser (username, password) VALUES (?, ?)', (username, generate_password_hash(password))) db.commit() return redirect(url_for('auth.login')) flash(error) return render_template('auth/register.html')
def load_logged_in_user(): """If a user id is stored in the session, load the user object from the database into ``g.user``.""" user_id = session.get('user_id') if user_id is None: g.user = None else: g.user = get_db().execute('SELECT * FROM tuser WHERE id = ?', (user_id, )).fetchone()
def delete(id): """Delete a prop. Ensures that the prop exists and that the logged in user is the author of the prop. """ get_prop(id) db = get_db() db.execute('DELETE FROM tprops WHERE id = ?', (id, )) db.commit() return redirect(url_for('props.index'))
def create(): """Create a new prop for the current user.""" if request.method == 'POST': ppin = request.form['ppin'] body = request.form['body'] error = None if not ppin: error = 'PIN is required.' if error is not None: flash(error) else: db = get_db() db.execute( 'INSERT INTO tprops (ppin, body, author_id)' ' VALUES (?, ?, ?)', (ppin, body, g.user['id'])) db.commit() return redirect(url_for('props.index')) return render_template('props/create.html')
def update(id): """Update a prop if the current user is the author.""" prop = get_prop(id) if request.method == 'POST': ppin = request.form['ppin'] body = request.form['body'] error = None if not ppin: error = 'PIN is required.' if error is not None: flash(error) else: db = get_db() db.execute('UPDATE tprops SET ppin = ?, body = ? WHERE id = ?', (ppin, body, id)) db.commit() return redirect(url_for('props.index')) return render_template('props/update.html', prop=prop)
def get_prop(id, check_author=True): """Get a prop and its author by id. Checks that the id exists and optionally that the current user is the author. :param id: id of prop to get :param check_author: require the current user to be the author :return: the prop with author information :raise 404: if a prop with the given id doesn't exist :raise 403: if the current user isn't the author """ prop = get_db().execute( 'SELECT p.id, ppin, body, created, author_id, username' ' FROM tprops p JOIN tuser u ON p.author_id = u.id' ' WHERE p.id = ?', (id, )).fetchone() if prop is None: abort(404, "Prop id {0} doesn't exist.".format(id)) if check_author and prop['author_id'] != g.user['id']: abort(403) return prop
def login(): """Log in a registered user by adding the user id to the session.""" if request.method == 'POST': username = request.form['username'] password = request.form['password'] db = get_db() error = None user = db.execute('SELECT * FROM tuser WHERE username = ?', (username, )).fetchone() if user is None: error = 'Incorrect username.' elif not check_password_hash(user['password'], password): error = 'Incorrect password.' if error is None: # store the user id in a new session and return to the index session.clear() session['user_id'] = user['id'] return redirect(url_for('index')) flash(error) return render_template('auth/login.html')