def get(self): user_data = models.UserData.current() question_key = self.request.get("question_key") question = db.get(question_key) if question: video = question.video() dict_votes = models_discussion.FeedbackVote.get_dict_for_user_data_and_video( user_data, video) answers = models_discussion.Feedback.gql( "WHERE types = :1 AND targets = :2 AND deleted = :3 AND is_hidden_by_flags = :4", models_discussion.FeedbackType.Answer, question.key(), False, False).fetch(1000) answers = voting.VotingSortOrder.sort(answers) for answer in answers: voting.add_vote_expando_properties(answer, dict_votes) template_values = { "answers": answers, "is_mod": util_discussion.is_current_user_moderator() } html = self.render_jinja2_template_to_string( 'discussion/question_answers_only.html', template_values) self.render_json({"html": html}) return
def post(self): user = util.get_current_user() if not user: return key = self.request.get("entity_key") playlist_key = self.request.get("playlist_key") text = self.request.get("question_text") or self.request.get("answer_text") if key and text: feedback = db.get(key) if feedback: if is_current_user_moderator() or feedback.author == user: feedback.content = text db.put(feedback) # Redirect to appropriate list of entities depending on type of # feedback entity being edited. if feedback.is_type(models_discussion.FeedbackType.Question): page = self.request.get("page") video = feedback.first_target() self.redirect("/discussion/pagequestions?video_key=%s&playlist_key=%s&page=%s&qa_expand_id=%s" % (video.key(), playlist_key, page, feedback.key().id())) elif feedback.is_type(models_discussion.FeedbackType.Answer): question = feedback.parent() self.redirect("/discussion/answers?question_key=%s" % question.key())
def signature(target=None, verb=None): return { "target": target, "verb": verb, "is_mod": is_current_user_moderator(), "is_author": target and target.author == util.get_current_user() }
def video_comments_context(video, playlist, page=0, comments_hidden=True): if page > 0: comments_hidden = False # Never hide questions if specifying specific page else: page = 1 limit_per_page = 10 limit_initially_visible = 3 if comments_hidden else limit_per_page comments_query = models_discussion.Feedback.gql("WHERE types = :1 AND targets = :2 AND deleted = :3 ORDER BY date DESC", models_discussion.FeedbackType.Comment, video.key(), False) count_total = comments_query.count() comments = comments_query.fetch(limit_per_page, (page - 1) * limit_per_page) count_page = len(comments) pages_total = max(1, ((count_total - 1) / limit_per_page) + 1) return { "user": util.get_current_user(), "is_mod": is_current_user_moderator(), "video": video, "playlist": playlist, "comments": comments, "count_total": count_total, "comments_hidden": count_page > limit_initially_visible, "limit_initially_visible": limit_initially_visible, "pages": range(1, pages_total + 1), "pages_total": pages_total, "prev_page_1_based": page - 1, "current_page_1_based": page, "next_page_1_based": page + 1, "show_page_controls": pages_total > 1, "login_url": util.create_login_url("/video?v=%s" % video.youtube_id) }
def post(self): user_data = models.UserData.current() if not user_data: return key = self.request.get("entity_key") playlist_key = self.request.get("playlist_key") text = self.request.get("question_text") or self.request.get("answer_text") if key and text: feedback = db.get(key) if feedback: if feedback.authored_by(user_data) or util_discussion.is_current_user_moderator(): feedback.content = text feedback.put() # Redirect to appropriate list of entities depending on type of # feedback entity being edited. if feedback.is_type(models_discussion.FeedbackType.Question): page = self.request.get("page") video = feedback.video() self.redirect("/discussion/pagequestions?video_key=%s&playlist_key=%s&page=%s&qa_expand_key=%s" % (video.key(), playlist_key, page, feedback.key())) elif feedback.is_type(models_discussion.FeedbackType.Answer): question = feedback.question() self.redirect("/discussion/answers?question_key=%s" % question.key())
def video_qa_context(video, playlist=None, page=0, qa_expand_id=None): limit_per_page = 5 if qa_expand_id: # If we're showing an initially expanded question, # make sure we're on the correct page question = models_discussion.Feedback.get_by_id(qa_expand_id) if question: question_preceding_query = models_discussion.Feedback.gql("WHERE types = :1 AND targets = :2 AND deleted = :3 AND date > :4 ORDER BY date DESC", models_discussion.FeedbackType.Question, video.key(), False, question.date) count_preceding = question_preceding_query.count() page = 1 + (count_preceding / limit_per_page) if page <= 0: page = 1 question_query = models_discussion.Feedback.gql("WHERE types = :1 AND targets = :2 AND deleted = :3 ORDER BY date DESC", models_discussion.FeedbackType.Question, video.key(), False) answer_query = models_discussion.Feedback.gql("WHERE types = :1 AND targets = :2 AND deleted = :3 ORDER BY date", models_discussion.FeedbackType.Answer, video.key(), False) count_total = question_query.count() questions = question_query.fetch(limit_per_page, (page - 1) * limit_per_page) dict_questions = {} # Store each question in this page in a dict for answer population for question in questions: dict_questions[question.key()] = question # Just grab all answers for this video and cache in page's questions for answer in answer_query: # Grab the key only for each answer, don't run a full gql query on the ReferenceProperty question_key = answer.parent_key() if (dict_questions.has_key(question_key)): question = dict_questions[question_key] question.children_cache.append(answer) count_page = len(questions) pages_total = max(1, ((count_total - 1) / limit_per_page) + 1) return { "user": util.get_current_user(), "is_mod": is_current_user_moderator(), "video": video, "playlist": playlist, "questions": questions, "count_total": count_total, "pages": range(1, pages_total + 1), "pages_total": pages_total, "prev_page_1_based": page - 1, "current_page_1_based": page, "next_page_1_based": page + 1, "show_page_controls": pages_total > 1, "qa_expand_id": qa_expand_id, "issue_labels": ('Component-Videos,Video-%s' % video.youtube_id), "login_url": util.create_login_url("/video?v=%s" % video.youtube_id) }
def post(self): if not util_discussion.is_current_user_moderator(): return key = self.request.get("entity_key") if key: entity = db.get(key) if entity: entity.clear_flags() entity.put() self.redirect("/discussion/flaggedfeedback")
def post(self): # Must be a moderator to change types of anything if not is_current_user_moderator(): return key = self.request.get("entity_key") target_type = self.request.get("target_type") if key and models_discussion.FeedbackType.is_valid(target_type): entity = db.get(key) if entity: entity.types = [target_type] db.put(entity)
def post(self): user = util.get_current_user() if not user: return key = self.request.get("entity_key") if key: entity = db.get(key) if entity: # Must be a moderator or author of entity to delete if is_current_user_moderator() or entity.author == user: entity.deleted = True db.put(entity)
def post(self): user_data = models.UserData.current() if not user_data: return key = self.request.get("entity_key") if key: entity = db.get(key) if entity: # Must be a moderator or author of entity to delete if entity.authored_by(user_data) or util_discussion.is_current_user_moderator(): entity.deleted = True entity.put() self.redirect("/discussion/flaggedfeedback")
def get(self): question_key = self.request.get("question_key") question = db.get(question_key) if question: answer_query = models_discussion.Feedback.gql("WHERE types = :1 AND targets = :2 AND deleted = :3 ORDER BY date", models_discussion.FeedbackType.Answer, question.key(), False) template_values = { "answers": answer_query, "is_mod": is_current_user_moderator() } path = os.path.join(os.path.dirname(__file__), 'question_answers.html') html = render_block_to_string(path, 'answers', template_values) json = simplejson.dumps({"html": html}, ensure_ascii=False) self.response.out.write(json) return
def post(self): user_data = models.UserData.current() if not user_data: return key = self.request.get("entity_key") if key: entity = db.get(key) if entity: # Must be a moderator or author of entity to delete if entity.authored_by( user_data ) or util_discussion.is_current_user_moderator(): entity.deleted = True entity.put() self.redirect("/discussion/flaggedfeedback")
def video_comments_context( video, playlist, page=0, comments_hidden=True, sort_order=voting.VotingSortOrder.HighestPointsFirst): user_data = models.UserData.current() if page > 0: comments_hidden = False # Never hide questions if specifying specific page else: page = 1 limit_per_page = 10 limit_initially_visible = 2 if comments_hidden else limit_per_page comments = util_discussion.get_feedback_by_type_for_video( video, models_discussion.FeedbackType.Comment, user_data) comments = voting.VotingSortOrder.sort(comments, sort_order=sort_order) count_total = len(comments) comments = comments[((page - 1) * limit_per_page):(page * limit_per_page)] dict_votes = models_discussion.FeedbackVote.get_dict_for_user_data_and_video( user_data, video) for comment in comments: voting.add_vote_expando_properties(comment, dict_votes) count_page = len(comments) pages_total = max(1, ((count_total - 1) / limit_per_page) + 1) return { "is_mod": util_discussion.is_current_user_moderator(), "video": video, "playlist": playlist, "comments": comments, "count_total": count_total, "comments_hidden": count_page > limit_initially_visible, "limit_initially_visible": limit_initially_visible, "pages": range(1, pages_total + 1), "pages_total": pages_total, "prev_page_1_based": page - 1, "current_page_1_based": page, "next_page_1_based": page + 1, "show_page_controls": pages_total > 1, }
def post(self): # Must be a moderator to change types of anything if not util_discussion.is_current_user_moderator(): return key = self.request.get("entity_key") target_type = self.request.get("target_type") if key and models_discussion.FeedbackType.is_valid(target_type): entity = db.get(key) if entity: entity.types = [target_type] if self.request_bool("clear_flags", default=False): entity.clear_flags() entity.put() self.redirect("/discussion/flaggedfeedback")
def video_comments_context( video, playlist, page=0, comments_hidden=True, sort_order=voting.VotingSortOrder.HighestPointsFirst ): user_data = models.UserData.current() if page > 0: comments_hidden = False # Never hide questions if specifying specific page else: page = 1 limit_per_page = 10 limit_initially_visible = 2 if comments_hidden else limit_per_page comments = util_discussion.get_feedback_by_type_for_video(video, models_discussion.FeedbackType.Comment, user_data) comments = voting.VotingSortOrder.sort(comments, sort_order=sort_order) count_total = len(comments) comments = comments[((page - 1) * limit_per_page) : (page * limit_per_page)] dict_votes = models_discussion.FeedbackVote.get_dict_for_user_data_and_video(user_data, video) for comment in comments: voting.add_vote_expando_properties(comment, dict_votes) count_page = len(comments) pages_total = max(1, ((count_total - 1) / limit_per_page) + 1) return { "is_mod": util_discussion.is_current_user_moderator(), "video": video, "playlist": playlist, "comments": comments, "count_total": count_total, "comments_hidden": count_page > limit_initially_visible, "limit_initially_visible": limit_initially_visible, "pages": range(1, pages_total + 1), "pages_total": pages_total, "prev_page_1_based": page - 1, "current_page_1_based": page, "next_page_1_based": page + 1, "show_page_controls": pages_total > 1, }
def get(self): if not util_discussion.is_current_user_moderator(): self.redirect(users.create_login_url(self.request.uri)) return # Show all non-deleted feedback flagged for moderator attention feedback_query = models_discussion.Feedback.all().filter("is_flagged = ", True).filter("deleted = ", False) feedback_count = feedback_query.count() feedbacks = feedback_query.fetch(50) template_content = { "feedbacks": feedbacks, "feedback_count": feedback_count, "has_more": len(feedbacks) < feedback_count, "feedback_type_question": models_discussion.FeedbackType.Question, "feedback_type_comment": models_discussion.FeedbackType.Comment, } self.render_jinja2_template("discussion/flagged_feedback.html", template_content)
def post(self): user_data = models.UserData.current() if not user_data: return key = self.request.get("entity_key") playlist_key = self.request.get("playlist_key") text = self.request.get("question_text") or self.request.get( "answer_text") if key and text: feedback = db.get(key) if feedback: if feedback.authored_by( user_data ) or util_discussion.is_current_user_moderator(): feedback.content = text feedback.put() # Redirect to appropriate list of entities depending on type of # feedback entity being edited. if feedback.is_type( models_discussion.FeedbackType.Question): page = self.request.get("page") video = feedback.video() self.redirect( "/discussion/pagequestions?video_key=%s&playlist_key=%s&page=%s&qa_expand_key=%s" % (video.key(), playlist_key, page, feedback.key())) elif feedback.is_type( models_discussion.FeedbackType.Answer): question = feedback.question() self.redirect("/discussion/answers?question_key=%s" % question.key())
def get(self): if not util_discussion.is_current_user_moderator(): self.redirect(users.create_login_url(self.request.uri)) return # Show all non-deleted feedback flagged for moderator attention feedback_query = models_discussion.Feedback.all().filter( "is_flagged = ", True).filter("deleted = ", False) feedback_count = feedback_query.count() feedbacks = feedback_query.fetch(50) template_content = { "feedbacks": feedbacks, "feedback_count": feedback_count, "has_more": len(feedbacks) < feedback_count, "feedback_type_question": models_discussion.FeedbackType.Question, "feedback_type_comment": models_discussion.FeedbackType.Comment, } self.render_jinja2_template("discussion/flagged_feedback.html", template_content)
def get(self): user_data = models.UserData.current() question_key = self.request.get("question_key") question = db.get(question_key) if question: video = question.video() dict_votes = models_discussion.FeedbackVote.get_dict_for_user_data_and_video(user_data, video) answers = models_discussion.Feedback.gql("WHERE types = :1 AND targets = :2 AND deleted = :3 AND is_hidden_by_flags = :4", models_discussion.FeedbackType.Answer, question.key(), False, False).fetch(1000) answers = voting.VotingSortOrder.sort(answers) for answer in answers: voting.add_vote_expando_properties(answer, dict_votes) template_values = { "answers": answers, "is_mod": util_discussion.is_current_user_moderator() } html = self.render_jinja2_template_to_string('discussion/question_answers_only.html', template_values) self.render_json({"html": html}) return
def video_qa_context(user_data, video, playlist=None, page=0, qa_expand_key=None, sort_override=-1): limit_per_page = 5 if page <= 0: page = 1 sort_order = voting.VotingSortOrder.HighestPointsFirst if user_data: sort_order = user_data.question_sort_order if sort_override >= 0: sort_order = sort_override questions = util_discussion.get_feedback_by_type_for_video(video, models_discussion.FeedbackType.Question, user_data) questions = voting.VotingSortOrder.sort(questions, sort_order=sort_order) if qa_expand_key: # If we're showing an initially expanded question, # make sure we're on the correct page question = models_discussion.Feedback.get(qa_expand_key) if question: count_preceding = 0 for question_test in questions: if question_test.key() == question.key(): break count_preceding += 1 page = 1 + (count_preceding / limit_per_page) answers = util_discussion.get_feedback_by_type_for_video(video, models_discussion.FeedbackType.Answer, user_data) answers.reverse() # Answers are initially in date descending -- we want ascending before the points sort answers = voting.VotingSortOrder.sort(answers) dict_votes = models_discussion.FeedbackVote.get_dict_for_user_data_and_video(user_data, video) count_total = len(questions) questions = questions[((page - 1) * limit_per_page):(page * limit_per_page)] dict_questions = {} # Store each question in this page in a dict for answer population for question in questions: voting.add_vote_expando_properties(question, dict_votes) dict_questions[question.key()] = question # Just grab all answers for this video and cache in page's questions for answer in answers: # Grab the key only for each answer, don't run a full gql query on the ReferenceProperty question_key = answer.question_key() if (dict_questions.has_key(question_key)): question = dict_questions[question_key] voting.add_vote_expando_properties(answer, dict_votes) question.children_cache.append(answer) count_page = len(questions) pages_total = max(1, ((count_total - 1) / limit_per_page) + 1) return { "is_mod": util_discussion.is_current_user_moderator(), "video": video, "playlist": playlist, "questions": questions, "count_total": count_total, "pages": range(1, pages_total + 1), "pages_total": pages_total, "prev_page_1_based": page - 1, "current_page_1_based": page, "next_page_1_based": page + 1, "show_page_controls": pages_total > 1, "qa_expand_key": qa_expand_key, "sort_order": sort_order, }
def video_qa_context(user_data, video, playlist=None, page=0, qa_expand_key=None, sort_override=-1): limit_per_page = 5 if page <= 0: page = 1 sort_order = voting.VotingSortOrder.HighestPointsFirst if user_data: sort_order = user_data.question_sort_order if sort_override >= 0: sort_order = sort_override questions = util_discussion.get_feedback_by_type_for_video( video, models_discussion.FeedbackType.Question, user_data) questions = voting.VotingSortOrder.sort(questions, sort_order=sort_order) if qa_expand_key: # If we're showing an initially expanded question, # make sure we're on the correct page question = models_discussion.Feedback.get(qa_expand_key) if question: count_preceding = 0 for question_test in questions: if question_test.key() == question.key(): break count_preceding += 1 page = 1 + (count_preceding / limit_per_page) answers = util_discussion.get_feedback_by_type_for_video( video, models_discussion.FeedbackType.Answer, user_data) answers.reverse( ) # Answers are initially in date descending -- we want ascending before the points sort answers = voting.VotingSortOrder.sort(answers) dict_votes = models_discussion.FeedbackVote.get_dict_for_user_data_and_video( user_data, video) count_total = len(questions) questions = questions[((page - 1) * limit_per_page):(page * limit_per_page)] dict_questions = {} # Store each question in this page in a dict for answer population for question in questions: voting.add_vote_expando_properties(question, dict_votes) dict_questions[question.key()] = question # Just grab all answers for this video and cache in page's questions for answer in answers: # Grab the key only for each answer, don't run a full gql query on the ReferenceProperty question_key = answer.question_key() if (dict_questions.has_key(question_key)): question = dict_questions[question_key] voting.add_vote_expando_properties(answer, dict_votes) question.children_cache.append(answer) count_page = len(questions) pages_total = max(1, ((count_total - 1) / limit_per_page) + 1) return { "is_mod": util_discussion.is_current_user_moderator(), "video": video, "playlist": playlist, "questions": questions, "count_total": count_total, "pages": range(1, pages_total + 1), "pages_total": pages_total, "prev_page_1_based": page - 1, "current_page_1_based": page, "next_page_1_based": page + 1, "show_page_controls": pages_total > 1, "qa_expand_key": qa_expand_key, "sort_order": sort_order, }