def update(pid): ''''Update a post if the current user is the author.''' post = get_post(pid) if request.method == 'POST': title = request.form['title'] body = request.form['body'] error = None if not title: error = 'Title is required.' if error is not None: flash(error) else: query = 'UPDATE post SET title = ?, body = ? WHERE id = ?' dbinfo = getdbinfo() db = get_db() with dbinfo: with getsdk().trace_sql_database_request(dbinfo, query): db.execute(query, (title, body, pid)) db.commit() return redirect(url_for('blog.index')) return render_template('blog/update.html', post=post)
def get_post(pid, check_author=True): '''Get a post and its author by id. Checks that the id exists and optionally that the current user is the author. :param pid: id of post to get :param check_author: require the current user to be the author :return: the post with author information :raise 404: if a post with the given id doesn't exist :raise 403: if the current user isn't the author ''' query = 'SELECT p.id, title, body, created, author_id, username' \ ' FROM post p JOIN user u ON p.author_id = u.id' \ ' WHERE p.id = ?' dbinfo = getdbinfo() with dbinfo: with getsdk().trace_sql_database_request(dbinfo, query): post = get_db().execute(query, (pid, )).fetchone() if post is None: abort(404, "Post id {0} doesn't exist.".format(pid)) if check_author and post['author_id'] != g.user['id']: abort(403) return post
def create(): '''Create a new post for the current user.''' if request.method == "POST": title = request.form["title"] body = request.form["body"] error = None if not title: error = "Title is required." if error is not None: flash(error) else: query = "INSERT INTO post (title, body, author_id)" \ " VALUES (?, ?, ?)" dbinfo = getdbinfo() db = get_db() with dbinfo: with getsdk().trace_sql_database_request(dbinfo, query): db.execute( query, (title, body, g.user["id"]), ) db.commit() inform_editors() return redirect(url_for("blog.index")) return render_template("blog/create.html")
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 sdk = getsdk() query = 'SELECT * FROM user WHERE username = ?' dbinfo = getdbinfo() with dbinfo: with sdk.trace_sql_database_request(dbinfo, query): user = db.execute(query, (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')
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 user WHERE username = ?', (username, )).fetchone() is not None: error = 'User {0} is already registered.'.format(username) if error is None: query = 'INSERT INTO user (username, password) VALUES (?, ?)' dbinfo = getdbinfo() with dbinfo: with getsdk().trace_sql_database_request(dbinfo, query): # the name is available, store it in the database and go to # the login page db.execute(query, (username, generate_password_hash(password))) db.commit() return redirect(url_for('auth.login')) flash(error) return render_template('auth/register.html')
def delete(pid): ''' Delete a Post ''' dbinfo = getdbinfo() query = "DELETE FROM post WHERE id = ?" get_post(pid) db = get_db() with dbinfo: with getsdk().trace_sql_database_request(dbinfo, query): db.execute(query, (pid, )) db.commit() return redirect(url_for("blog.index"))
def index(): ''' Create the Post Index ''' query = "SELECT p.id, title, body, created, author_id, username" \ " FROM post p JOIN user u ON p.author_id = u.id" \ " ORDER BY created DESC" dbinfo = getdbinfo() with dbinfo: with getsdk().trace_sql_database_request(dbinfo, query): # Show all the posts, most recent first. db = get_db() posts = db.execute(query).fetchall() return render_template("blog/index.html", posts=posts)
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: sdk = getsdk() query = 'SELECT * FROM user WHERE id = ?' dbinfo = getdbinfo() with dbinfo: with sdk.trace_sql_database_request(dbinfo, query): g.user = get_db().execute(query, (user_id, )).fetchone()