Ejemplo n.º 1
0
    def post(self):
        user_data = UserData.current()
        if not user_data:
            return

        if user_data.is_child_account():
            self.render_json({"error": "You cannot vote yet."})
            return

        vote_type = self.request_int(
            "vote_type", default=discussion_models.FeedbackVote.ABSTAIN)

        if (vote_type == discussion_models.FeedbackVote.UP
                and not Privileges.can_up_vote(user_data)):
            self.render_json({
                "error":
                Privileges.need_points_desc(Privileges.UP_VOTE_THRESHOLD,
                                            "up vote")
            })
            return
        elif (vote_type == discussion_models.FeedbackVote.DOWN
              and not Privileges.can_down_vote(user_data)):
            self.render_json({
                "error":
                Privileges.need_points_desc(Privileges.DOWN_VOTE_THRESHOLD,
                                            "down vote")
            })
            return

        entity_key = self.request_string("entity_key", default="")
        if entity_key:
            entity = db.get(entity_key)
            if entity and entity.authored_by(user_data):
                self.render_json(
                    {"error": "You cannot vote for your own posts."})
                return

        if vote_type != discussion_models.FeedbackVote.ABSTAIN:
            limiter = VoteRateLimiter(user_data)
            if not limiter.increment():
                self.render_json({"error": limiter.denied_desc()})
                return

        # We kick off a taskqueue item to perform the actual vote insertion
        # so we don't have to worry about fast writes to the entity group
        # causing contention problems for the HR datastore, because
        # the taskqueue will just retry w/ exponential backoff.
        # TODO(marcia): user_data.email may change. user_id is preferred
        taskqueue.add(url='/admin/discussion/finishvoteentity',
                      queue_name='voting-queue',
                      params={
                          "email":
                          user_data.email,
                          "vote_type":
                          self.request_int(
                              "vote_type",
                              default=discussion_models.FeedbackVote.ABSTAIN),
                          "entity_key":
                          entity_key
                      })
Ejemplo n.º 2
0
    def post(self):
        user_data = UserData.current()
        if not user_data:
            return

        if user_data.is_child_account():
            self.render_json({"error": "Je kan nog niet stemmen."})
            return

        vote_type = self.request_int(
            "vote_type", default=discussion_models.FeedbackVote.ABSTAIN)

        if (vote_type == discussion_models.FeedbackVote.UP and
            not Privileges.can_up_vote(user_data)):
            self.render_json({
                "error": Privileges.need_points_desc(
                    Privileges.UP_VOTE_THRESHOLD, "up vote")
            })
            return
        elif (vote_type == discussion_models.FeedbackVote.DOWN and
              not Privileges.can_down_vote(user_data)):
            self.render_json({
                "error": Privileges.need_points_desc(
                    Privileges.DOWN_VOTE_THRESHOLD, "down vote")
            })
            return

        entity_key = self.request_string("entity_key", default="")
        if entity_key:
            entity = db.get(entity_key)
            if entity and entity.authored_by(user_data):
                self.render_json({
                    "error": "Je kan niet op je eigen opmerking stemmen."
                })
                return

        if vote_type != discussion_models.FeedbackVote.ABSTAIN:
            limiter = VoteRateLimiter(user_data)
            if not limiter.increment():
                self.render_json({"error": limiter.denied_desc()})
                return

        # We kick off a taskqueue item to perform the actual vote insertion
        # so we don't have to worry about fast writes to the entity group
        # causing contention problems for the HR datastore, because
        # the taskqueue will just retry w/ exponential backoff.
        # TODO(marcia): user_data.email may change. user_id is preferred
        taskqueue.add(
            url='/admin/discussion/finishvoteentity',
            queue_name='voting-queue',
            params={
                "email": user_data.email,
                "vote_type": self.request_int(
                    "vote_type",
                    default=discussion_models.FeedbackVote.ABSTAIN),
                "entity_key": entity_key
            }
        )
Ejemplo n.º 3
0
    def post(self):
        # You have to be logged in to vote
        user_data = UserData.current()
        if not user_data:
            return

        vote_type = self.request_int("vote_type", default=FeedbackVote.ABSTAIN)

        if vote_type == FeedbackVote.UP and not Privileges.can_up_vote(user_data):
            self.render_json({"error": Privileges.need_points_desc(Privileges.UP_VOTE_THRESHOLD, "up vote")})
            return
        elif vote_type == FeedbackVote.DOWN and not Privileges.can_down_vote(user_data):
            self.render_json({"error": Privileges.need_points_desc(Privileges.DOWN_VOTE_THRESHOLD, "down vote")})
            return

        entity_key = self.request_string("entity_key", default="")
        if entity_key:
            entity = db.get(entity_key)
            if entity and entity.authored_by(user_data):
                self.render_json({"error": "You cannot vote for your own posts."})
                return

        if vote_type != FeedbackVote.ABSTAIN:
            limiter = VoteRateLimiter(user_data)
            if not limiter.increment():
                self.render_json({"error": limiter.denied_desc()})
                return

        # We kick off a taskqueue item to perform the actual vote insertion
        # so we don't have to worry about fast writes to the entity group 
        # causing contention problems for the HR datastore, because
        # the taskqueue will just retry w/ exponential backoff.
        taskqueue.add(url='/admin/discussion/finishvoteentity', queue_name='voting-queue', 
                params={
                    "email": user_data.email,
                    "vote_type": self.request_int("vote_type", default=FeedbackVote.ABSTAIN),
                    "entity_key": entity_key
                }
        )