def parse_data(self, data): # Process replies logging.info("parse_data: %s" % str(data)) current_question = Question.get_current_question() # Avoid race condition triggered by first question post if current_question == None: return # Retweeted poll if "event" in data and data["event"] == "quoted_tweet": target_id = str(data["target_object"]["quoted_status_id"]) screen_name = data["source"]["screen_name"] profile_image_url = data["source"] \ ["profile_image_url_https"] \ .replace("_normal", "_bigger") self.process_retweet_from_screename(current_question, target_id, screen_name, profile_image_url) # Replied to status if "in_reply_to_status_id" in data: reply_status_id = str(data["in_reply_to_status_id"]) # Only acknowledge replies to current question if reply_status_id == current_question.twitterid: screen_name = data["user"]["screen_name"] vote_text = data["text"] profile_image_url = data["user"] \ ["profile_image_url_https"] \ .replace("_normal", "_bigger") state_abbreviation = self.get_state_from_string(data["text"]) party = self.get_party_from_string_using_question( data["text"], current_question) sway_points = self.get_sway_from_string(data["text"]) user = User.query_by_userid(screen_name).get() # Cap sway points if user != None: if user.sway_points < sway_points: sway_points = user.sway_points elif sway_points > User.get_starting_sway_points(): sway_points = User.get_starting_sway_points() # Only add vote for question if user vote was valid if self.add_vote_for_screenname(current_question, str(data["id"]), vote_text, state_abbreviation, party, sway_points, screen_name, profile_image_url): # Add vote for question if vote was valid self.add_vote_for_question(party, sway_points, state_abbreviation, current_question)
def add_vote_for_screenname(self, question, vote_text, replyid, state_abbreviation, party, sway_points, screen_name, profile_image_url): # Require valid state and party to vote if state_abbreviation == None or party == None: return False # Require new user or user never voted on this question user = User.query_by_userid(screen_name).get() if user == None or \ user.votes[-1].question.get().key.id() != question.key.id(): # Add vote for user User.add_user_vote(user, screen_name, profile_image_url, Vote( question = question.key, vote_text = vote_text, replyid = replyid, state_abbreviation = state_abbreviation, party = party, sway_points = sway_points )) return True else: return False
def process_retweet_from_screename(self, current_question, target_id, screen_name, profile_image_url): # Has to retweet active poll if current_question.twitterid == target_id: user = User.query_by_userid(screen_name).get() # Add user if they don't exist if user == None: user = User(userid=screen_name, profile_image_url=profile_image_url) user.put() # Users can cheat by deleting and retweeting if user.last_retweet_id != current_question.twitterid: # Attribute sway points user.last_retweet_id = str(current_question.twitterid) user.sway_points += sway_points["rewteet_poll"]
def process_retweet_from_screename(self, current_question, target_id, screen_name, profile_image_url): # Has to retweet active poll if current_question.twitterid == target_id: user = User.query_by_userid(screen_name).get() # Add user if they don't exist if user == None: user = User( userid = screen_name, profile_image_url = profile_image_url ) user.put() # Users can cheat by deleting and retweeting if user.last_retweet_id != current_question.twitterid: # Attribute sway points user.last_retweet_id = str(current_question.twitterid) user.sway_points += sway_points["rewteet_poll"]
def add_vote_for_screenname(self, question, vote_text, replyid, state_abbreviation, party, sway_points, screen_name, profile_image_url): # Require valid state and party to vote if state_abbreviation == None or party == None: return False # Require new user or user never voted on this question user = User.query_by_userid(screen_name).get() if user == None or \ user.votes[-1].question.get().key.id() != question.key.id(): # Add vote for user User.add_user_vote( user, screen_name, profile_image_url, Vote(question=question.key, vote_text=vote_text, replyid=replyid, state_abbreviation=state_abbreviation, party=party, sway_points=sway_points)) return True else: return False
def test_model_user(self): # Load fixtures load_fixture('tests/states.json', kind={'State': State}) load_fixture('tests/questions.json', kind={ 'Question': Question, 'State': State }) current_question_entity = Question.get_current_question() User.add_user_vote( None, "jrgrafton_test", "https://pbs.twimg.com//profile_images//440698495// \ 9929_128442162134_504357134_2556732_5649977_n_\ bigger.jpg", Vote(question=current_question_entity.key, replyid="692368266292023296", state_abbreviation="CA", party=0, sway_points=40)) # Ensure user was created user_entity = User.query_by_userid("jrgrafton_test").fetch() assert len(user_entity) == 1 assert user_entity[0].sway_points == User.get_starting_sway_points() - \ 40 assert user_entity[0].userid == "jrgrafton_test" assert "https" in user_entity[0].profile_image_url assert user_entity[0].votes[0].question == current_question_entity.key assert user_entity[0].votes[0].replyid == "692368266292023296" assert user_entity[0].votes[0].state_abbreviation == "CA" assert user_entity[0].votes[0].party == 0 # Ensure a reply to a different question is tallied next_question_entity = Question.get_current_question() User.add_user_vote( user_entity[0], "jrgrafton_test", "https://pbs.twimg.com//profile_images//440698495// \ 9929_128442162134_504357134_2556732_5649977_n_\ bigger.jpg", Vote(question=next_question_entity.key, replyid="692368266292023297", state_abbreviation="WA", party=1, sway_points=10)) # Ensure new vote was collated under existing user user_entity = User.query_by_userid("jrgrafton_test").fetch() assert len(user_entity) == 1 assert len(user_entity[0].votes) == 2 assert user_entity[0].sway_points == User.get_starting_sway_points() - \ (40 + 10) # Verify integrity of new vote assert user_entity[0].votes[1].question == next_question_entity.key assert user_entity[0].votes[1].replyid == "692368266292023297" assert user_entity[0].votes[1].state_abbreviation == "WA" assert user_entity[0].votes[1].party == 1 # Verify integrity of old vote assert user_entity[0].userid == "jrgrafton_test" assert "https" in user_entity[0].profile_image_url assert user_entity[0].votes[0].question == current_question_entity.key assert user_entity[0].votes[0].replyid == "692368266292023296" assert user_entity[0].votes[0].state_abbreviation == "CA" assert user_entity[0].votes[0].party == 0
def test_view_tasks_twitter_stream_listener_add_vote_for_screenname(self): load_fixture('tests/states.json', kind={'State': State}) load_fixture('tests/questions.json', kind={'Question': Question,'State': State}) twitter_stream_listener = TwitterStreamListener() current_question = Question.get_current_question() result = twitter_stream_listener.\ add_vote_for_screenname(current_question, "Vote text #yes", "123", None, # Invalid state 1, 0, "jrgrafton", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg") assert result == False result = twitter_stream_listener.\ add_vote_for_screenname(current_question, "Vote text #CA", "123", "CA", None, # Invalid party 0, "jrgrafton", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg") assert result == False # First valid user result = twitter_stream_listener.\ add_vote_for_screenname(current_question, "Vote text #CA #yes", "123", "CA", 0, 100, "jrgrafton", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg") assert result == True user = User.query_by_userid("jrgrafton").get() assert user != None assert len(user.votes) == 1 assert user.votes[0].question.get().key == current_question.key assert user.votes[0].vote_text == "Vote text #CA #yes" assert user.votes[0].replyid == "123" assert user.votes[0].state_abbreviation == "CA" assert user.votes[0].party == 0 assert user.votes[0].sway_points == 100 # Second vote for user on same question result = twitter_stream_listener.\ add_vote_for_screenname(current_question, "Vote text #WA #no", "123", "WA", 1, 0, "jrgrafton", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg") assert result == False # Second valid user result = twitter_stream_listener.\ add_vote_for_screenname(current_question, "Vote text for user 2 #WA #no", "123", "WA", 1, 50, "jrgrafton_test", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg") assert result == True users = User.get_all() assert len(users) == 2 user = users[1] assert len(user.votes) == 1 assert user.votes[0].question.get().key == current_question.key assert user.votes[0].vote_text == "Vote text for user 2 #WA #no" assert user.votes[0].replyid == "123" assert user.votes[0].state_abbreviation == "WA" assert user.votes[0].party == 1 assert user.votes[0].sway_points == 50 # Go to new question and test valid votes reponse = self.app.get('/tasks/twitter_post_status' \ '?question_cadence_minutes=1') current_question = Question.get_current_question() # Second vote for new question should work result = twitter_stream_listener.\ add_vote_for_screenname(current_question, "Vote second question text #WA #no", "124", "WA", 1, 10, "jrgrafton", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg") assert result == True user = User.query_by_userid("jrgrafton").get() assert user != None assert len(user.votes) == 2 assert user.votes[1].vote_text == "Vote second question text #WA #no" assert user.votes[1].question.get().key == current_question.key assert user.votes[1].replyid == "124" assert user.votes[1].state_abbreviation == "WA" assert user.votes[1].party == 1 assert user.votes[1].sway_points == 10
def test_model_user(self): # Load fixtures load_fixture('tests/states.json', kind={'State': State}) load_fixture('tests/questions.json', kind={'Question': Question,'State': State}) current_question_entity = Question.get_current_question() User.add_user_vote(None, "jrgrafton_test", "https://pbs.twimg.com//profile_images//440698495// \ 9929_128442162134_504357134_2556732_5649977_n_\ bigger.jpg", Vote( question = current_question_entity.key, replyid = "692368266292023296", state_abbreviation = "CA", party = 0, sway_points = 40 )) # Ensure user was created user_entity = User.query_by_userid("jrgrafton_test").fetch() assert len(user_entity) == 1 assert user_entity[0].sway_points == User.get_starting_sway_points() - \ 40 assert user_entity[0].userid == "jrgrafton_test" assert "https" in user_entity[0].profile_image_url assert user_entity[0].votes[0].question == current_question_entity.key assert user_entity[0].votes[0].replyid == "692368266292023296" assert user_entity[0].votes[0].state_abbreviation == "CA" assert user_entity[0].votes[0].party == 0 # Ensure a reply to a different question is tallied next_question_entity = Question.get_current_question() User.add_user_vote(user_entity[0], "jrgrafton_test", "https://pbs.twimg.com//profile_images//440698495// \ 9929_128442162134_504357134_2556732_5649977_n_\ bigger.jpg", Vote( question = next_question_entity.key, replyid = "692368266292023297", state_abbreviation = "WA", party = 1, sway_points = 10 )) # Ensure new vote was collated under existing user user_entity = User.query_by_userid("jrgrafton_test").fetch() assert len(user_entity) == 1 assert len(user_entity[0].votes) == 2 assert user_entity[0].sway_points == User.get_starting_sway_points() - \ (40 + 10) # Verify integrity of new vote assert user_entity[0].votes[1].question == next_question_entity.key assert user_entity[0].votes[1].replyid == "692368266292023297" assert user_entity[0].votes[1].state_abbreviation == "WA" assert user_entity[0].votes[1].party == 1 # Verify integrity of old vote assert user_entity[0].userid == "jrgrafton_test" assert "https" in user_entity[0].profile_image_url assert user_entity[0].votes[0].question == current_question_entity.key assert user_entity[0].votes[0].replyid == "692368266292023296" assert user_entity[0].votes[0].state_abbreviation == "CA" assert user_entity[0].votes[0].party == 0
def test_view_tasks_twitter_stream_listener_add_vote_for_screenname(self): load_fixture("tests/states.json", kind={"State": State}) load_fixture("tests/questions.json", kind={"Question": Question, "State": State}) twitter_stream_listener = TwitterStreamListener() current_question = Question.get_current_question() result = twitter_stream_listener.add_vote_for_screenname( current_question, "Vote text #yes", "123", None, # Invalid state 1, 0, "jrgrafton", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg", ) assert result == False result = twitter_stream_listener.add_vote_for_screenname( current_question, "Vote text #CA", "123", "CA", None, # Invalid party 0, "jrgrafton", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg", ) assert result == False # First valid user result = twitter_stream_listener.add_vote_for_screenname( current_question, "Vote text #CA #yes", "123", "CA", 0, 100, "jrgrafton", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg", ) assert result == True user = User.query_by_userid("jrgrafton").get() assert user != None assert len(user.votes) == 1 assert user.votes[0].question.get().key == current_question.key assert user.votes[0].vote_text == "Vote text #CA #yes" assert user.votes[0].replyid == "123" assert user.votes[0].state_abbreviation == "CA" assert user.votes[0].party == 0 assert user.votes[0].sway_points == 100 # Second vote for user on same question result = twitter_stream_listener.add_vote_for_screenname( current_question, "Vote text #WA #no", "123", "WA", 1, 0, "jrgrafton", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg", ) assert result == False # Second valid user result = twitter_stream_listener.add_vote_for_screenname( current_question, "Vote text for user 2 #WA #no", "123", "WA", 1, 50, "jrgrafton_test", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg", ) assert result == True users = User.get_all() assert len(users) == 2 user = users[1] assert len(user.votes) == 1 assert user.votes[0].question.get().key == current_question.key assert user.votes[0].vote_text == "Vote text for user 2 #WA #no" assert user.votes[0].replyid == "123" assert user.votes[0].state_abbreviation == "WA" assert user.votes[0].party == 1 assert user.votes[0].sway_points == 50 # Go to new question and test valid votes reponse = self.app.get("/tasks/twitter_post_status" "?question_cadence_minutes=1") current_question = Question.get_current_question() # Second vote for new question should work result = twitter_stream_listener.add_vote_for_screenname( current_question, "Vote second question text #WA #no", "124", "WA", 1, 10, "jrgrafton", "https://pbs.twimg.com// \ profile_images//440698495// \ 9929_128442162134_504357134_ \ 2556732_5649977_n_bigger.jpg", ) assert result == True user = User.query_by_userid("jrgrafton").get() assert user != None assert len(user.votes) == 2 assert user.votes[1].vote_text == "Vote second question text #WA #no" assert user.votes[1].question.get().key == current_question.key assert user.votes[1].replyid == "124" assert user.votes[1].state_abbreviation == "WA" assert user.votes[1].party == 1 assert user.votes[1].sway_points == 10