示例#1
0
    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
示例#2
0
文件: qa.py 项目: di445/khanacademy
    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())
示例#3
0
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()
            }
示例#4
0
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()
    }
示例#5
0
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)
           }
示例#6
0
    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())
示例#7
0
文件: qa.py 项目: di445/khanacademy
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)
           }
示例#8
0
    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")
示例#9
0
    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")
示例#10
0
文件: qa.py 项目: di445/khanacademy
    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)
示例#11
0
文件: qa.py 项目: di445/khanacademy
    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)
示例#12
0
    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")
示例#13
0
文件: qa.py 项目: di445/khanacademy
    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
示例#14
0
    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")
示例#15
0
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,
    }
示例#16
0
    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")
示例#17
0
    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")
示例#18
0
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,
    }
示例#19
0
    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)
示例#20
0
    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())
示例#21
0
    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)
示例#22
0
    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
示例#23
0
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,
           }
示例#24
0
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,
    }