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 })
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 } )
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 } )