コード例 #1
0
ファイル: backend.py プロジェクト: jrgrafton/tweet-debate
    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)
コード例 #2
0
ファイル: backend.py プロジェクト: jrgrafton/tweet-debate
    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
コード例 #3
0
    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)
コード例 #4
0
    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"]
コード例 #5
0
ファイル: backend.py プロジェクト: jrgrafton/tweet-debate
    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"]
コード例 #6
0
    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
コード例 #7
0
    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
コード例 #8
0
ファイル: test_view.py プロジェクト: jrgrafton/tweet-debate
    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
コード例 #9
0
ファイル: test_model.py プロジェクト: jrgrafton/tweet-debate
    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
コード例 #10
0
ファイル: test_view.py プロジェクト: jrgrafton/tweet-debate
    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