def print_table(): """ Based on sorting priorities stored in the query string, lists Questions with list.html """ pairs = { 'ID': 'id', 'Question': 'title', 'Date': 'submission_time', 'Number of Views': 'view_number', 'Votes': 'vote_number' } sortingcols = request.args order = ','.join( [pairs[col] + ' ' + sortingcols[col] for col in sortingcols][::-1]) sql_query = """SELECT q.id, q.title, q.submission_time, q.view_number, q.vote_number, q.image, u.name FROM question q JOIN users u ON (q.users_id = u.id)""" if order: sql_query += '\nORDER BY q.' + order + ';' questions = data_manager.run_query(sql_query) headers = [ 'question_id', 'title', 'submission_time', 'view_number', 'vote_number', 'image', 'user_name' ] questions = data_manager.build_dict(questions, headers) url = '&'.join([key + '=' + sortingcols[key] for key in sortingcols]) return render_template('list.html', questions=questions, url=url)
def get_question(id): """ Return a single question (dict) by its ID """ question = data_manager.run_query("SELECT * FROM question WHERE id={};".format(id)) question = data_manager.build_dict( question, ["question_id", "submission_time", "view_number", "vote_number", "title", "message", "image"]) return question[0]
def read_tags(question_id): list_of_keys_of_tag = ["tag_id", "name", "question_id", "color"] query_tag = """SELECT tag.id, tag.name, question_tag.question_id, tag.color FROM tag JOIN question_tag ON tag.id = question_tag.tag_id WHERE question_tag.question_id={0} ORDER BY tag_id""".format(question_id) data = data_manager.run_query(query_tag) tags = data_manager.build_dict(data, list_of_keys_of_tag) return tags
def get_users_with_id(): """ Return the list of users with their id from database in the format of dictinoary (keywords: id, name) """ query = """SELECT id, name FROM users;""" user_list = data_manager.run_query(query) user_list = data_manager.build_dict(user_list, ["id", "name"]) return user_list
def group_by_question_with_tags(): query = """SELECT tag.name, COUNT(question_tag.tag_id), tag.color FROM tag LEFT JOIN question_tag ON tag.id=question_tag.tag_id GROUP BY tag.id ORDER BY COUNT(question_tag.tag_id) DESC;""" tags_number_of_question = data_manager.run_query(query) list_of_tag_number_key = ["name", "question_number", "color"] dict_of_tags = data_manager.build_dict(tags_number_of_question, list_of_tag_number_key) return dict_of_tags
def search_questions(term): """search for answers and questions with the given search term and display it # search for answers with search term in their message""" searchterm = term.lower() # select questions question_query = """SELECT DISTINCT id, title, message, submission_time FROM question WHERE id = ANY (SELECT question_id FROM answer WHERE LOWER(title) LIKE '%{0}%' OR LOWER(message) LIKE '%{0}%') OR LOWER(message) LIKE '%{0}%' OR LOWER(title) LIKE '%{0}%';""".format(searchterm) table = data_manager.run_query(question_query) if table: keys = ("question_id", "title", "message", "submission_time") questions = data_manager.build_dict(table, keys) fancy_questions = make_fancy(term, questions, "title") fancy_questions = make_fancy(term, questions, "message") else: return render_template('search_results.html', questions=[], answers=[]) # select related answers answer_query = """SELECT DISTINCT id, message, question_id FROM answer WHERE question_id = ANY (SELECT id FROM question WHERE LOWER(title) LIKE '%{0}%' OR LOWER(message) LIKE '%{0}%') OR LOWER(message) LIKE '%{0}%';""".format(searchterm) table = data_manager.run_query(answer_query) keys = ("answer_id", "message", "question_id") answers = data_manager.build_dict(table, keys) fancy_answers = make_fancy(term, answers, "message") return render_template('search_results.html', questions=fancy_questions, answers=fancy_answers)
def get_answers_for_question(question_id, sort_by, direction): query = """ SELECT answer.*, users.name FROM answer LEFT JOIN users ON answer.users_id = users.id WHERE question_id={0} ORDER BY {1} {2}; """.format(question_id, sort_by, direction) rows = data_manager.run_query(query) list_of_names = [ "answer_id", "submission_time", "vote_number", "question_id", "message", "image", "accepted", "user_id", "user_name" ] answers = data_manager.build_dict(rows, list_of_names) return answers
def get_comments(comment_type, question_id): if comment_type == "question": query = """SELECT * FROM comment WHERE question_id = {}; """.format(question_id) elif comment_type == "answer": query = """SELECT comment.id, comment.question_id, comment.answer_id, comment.message, comment.submission_time, comment.edited_count FROM comment LEFT JOIN answer ON answer_id = answer.id WHERE answer.question_id = {}; """.format(question_id) rows = data_manager.run_query(query) columns = ["id", "question_id", "answer_id", "message", "submission_time", "edited_count"] comments = data_manager.build_dict(rows, columns) return comments
def get_answer(id): """ Return a single answer (dict) by its ID with authors name """ print(id) answer = data_manager.run_query( """ SELECT answer.*, users.name FROM answer LEFT JOIN users ON answer.users_id = users.id WHERE answer.id={}; """.format(id)) answer = data_manager.build_dict(answer, [ "answer_id", "submission_time", "vote_number", "question_id", "message", "image", "accepted", "user_id", "user_name" ]) return answer[0]
def edit_question_route(question_id): """Find question details from id and redirect with the data to /new_question page""" title = "Modify question" action = "/modify/" + question_id query = """SELECT q.title, q.message, u.name FROM question q JOIN users u ON (q.users_id = u.id) WHERE q.id = '{}';""".format(question_id) table = data_manager.run_query(query) titles = "title", "message", "username" data = data_manager.build_dict(table, titles)[0] tags = common.show_tags_type() tag_query = """SELECT tag.name FROM tag LEFT JOIN question_tag ON tag.id=question_tag.tag_id WHERE question_id = {0};""".format(question_id) selected_tag = [i[0] for i in data_manager.run_query(tag_query)] return render_template("new-question.html", question_id=question_id, title=title, data=data, action=action, tags=tags, selected_tag=selected_tag)
def displays_a_single_question(question_id): list_of_key_of_question = [ "id", "submission_time", "view_number", "vote_number", "title", "message" ] title_of_question = [ "ID", "Submisson time", "View number", "Vote number", "Title", "Message" ] list_of_key_and_title_of_question = list( zip(list_of_key_of_question, title_of_question)) list_of_key_of_answer = [ "answer_id", "submission_time", "vote_number", "question_id", "message", "user_name" ] title_of_answer = [ "ID", "Submisson time", "Vote number", "Question id", "Message", "Author" ] list_of_key_and_title_of_answers = list( zip(list_of_key_of_answer, title_of_answer)) query = "SELECT * FROM question" rows = data_manager.run_query(query) list_of_names = [ "id", "submission_time", "view_number", "vote_number", "title", "message" ] all_question = data_manager.build_dict(rows, list_of_names) for question_ in all_question: if question_id == question_["id"]: question = question_ break query = "SELECT * FROM answer" rows = data_manager.run_query(query) list_of_names = [ "id", "submission_time", "vote_number", "question_id", "message" ] all_answers = data_manager.build_dict(rows, list_of_names) answers = [] for answer in all_answers: if question_id == answer["question_id"]: answers.append(answer) tags = common.read_tags(question_id) question_with_answers = { "tags": tags, "question_id": question_id, "question": question, "answers": answers, "list_of_key_of_question": list_of_key_of_question, "list_of_key_of_answer": list_of_key_of_answer, "title_of_question": title_of_question, "title_of_answer": title_of_answer, "list_of_key_and_title_of_question": list_of_key_and_title_of_question, "list_of_key_and_title_of_answers": list_of_key_and_title_of_answers } return question_with_answers
def show_tags_type(): list_of_keys_of_tag = ["id", "name", "color"] query_tag = "SELECT id,name,color FROM tag ORDER BY id" data = data_manager.run_query(query_tag) tags_type = data_manager.build_dict(data, list_of_keys_of_tag) return tags_type