Ejemplo n.º 1
0
def register():
    form = RegistrationForm()
    if current_user.is_authenticated:
        return redirect(url_for('home'))
    if form.validate_on_submit():
        hashed_password = bcrypt.generate_password_hash(
            form.password.data).decode('utf-8')
        user = User(username=form.username.data,
                    email=form.email.data,
                    password=hashed_password)
        db.session.add(user)
        db.session.commit()
        flash(f'Account created for { form.username.data }!', 'success')
        return redirect(url_for('login'))
    return render_template('register.html', title='Register', form=form)
Ejemplo n.º 2
0
def addUser(request):
    if request.method == 'POST':
        form = addForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            email = form.cleaned_data['email']
            passwd = form.cleaned_data['passwd']
            p1 = User(userName=username, nikename=email, passwd=passwd)
            p1.save()

    form1 = loginForm()
    form2 = addForm()

    return render_to_response('mainpage.html', {
        'form1': form1,
        'form2': form2
    },
                              context_instance=RequestContext(request))
Ejemplo n.º 3
0
def create_user(screen_name=None):
    screen_name = request.form["user"]
    twitter_user = twitter_api_client.get_user(screen_name)
    statuses = twitter_api_client.user_timeline(screen_name,
                                                tweet_mode="extended",
                                                count=150,
                                                exclude_replies=True,
                                                include_rts=False)
    print("STATUSES COUNT:", len(statuses))

    # get existing user from the db or initialize a new one:
    db_user = User.query.get(twitter_user.id) or User(id=twitter_user.id)
    db_user.screen_name = twitter_user.screen_name
    db_user.name = twitter_user.name
    db_user.location = twitter_user.location
    db_user.followers_count = twitter_user.followers_count
    db.session.add(db_user)
    db.session.commit()

    all_tweet_texts = [status.full_text for status in statuses]
    embeddings = list(
        basilica_api_client.embed_sentences(all_tweet_texts, model="twitter"))
    print("NUMBER OF EMBEDDINGS", len(embeddings))

    # TODO: explore using the zip() function maybe...
    counter = 0
    for status in statuses:
        print(status.full_text)
        print("----")

        # get existing tweet from the db or initialize a new one:
        db_tweet = Tweet.query.get(status.id) or Tweet(id=status.id)
        db_tweet.user_id = status.author.id
        db_tweet.full_text = status.full_text
        embedding = embeddings[counter]
        print(len(embedding))
        db_tweet.embedding = embedding
        db.session.add(db_tweet)
        counter += 1
    db.session.commit()

    return render_template("user.html", user=db_user, tweets=statuses)
Ejemplo n.º 4
0
def insert_tweet(session, twitter_api, tweet):
    """Insert a tweet (status using the old API terminology) into the backing datastore.

  This means inserting the original poster, inserting the service, inserting the post and inserting
  the post distribution.

  WARNING: this function does NOT recursively insert replied to tweets, or quoted tweets. It's
  expected that some other system handles walking the tree of tweets to deal with all that. This is,
  ultimately, to work around the garbage Twitter rate limits.

  """

    _tw = insert_twitter(session)
    try:
        poster = tweet.user
        if not isinstance(poster, User):
            poster = User.NewFromJsonDict(poster)
        poster = insert_user(session, poster)
        assert isinstance(poster, Account)
    except AssertionError as e:
        print("Encountered exception", repr(e), traceback.format_exc(),
              "Processing tweet", tweet)
        return None

    dupe = session.query(Post)\
                  .filter_by(external_id=twitter_external_tweet_id(tweet.id))\
                  .first()
    # There's a dummy record in place, flesh it out. We're in a monoid here.
    if dupe:
        dupe.poster = poster
        dupe.when = aget(
            datetime.strptime(tweet.created_at, _tw_datetime_pattern))
        dupe.text = _get_tweet_text(tweet)
        dupe.more = tweet.AsDict()
        session.add(dupe)
        session.commit()
        return dupe

    # We're inserting a new tweet here...
    else:
        post = Post(service=_tw,
                    text=_get_tweet_text(tweet),
                    external_id=twitter_external_tweet_id(tweet.id_str),
                    poster=poster,
                    when=aget(
                        datetime.strptime(tweet.created_at,
                                          _tw_datetime_pattern)),
                    more=tweet.AsDict())
        session.add(post)

        for user in tweet.user_mentions:
            get_or_create(session,
                          PostDistribution,
                          post=post,
                          recipient=insert_user(session, User(id=user.id)),
                          rel="to")

        if tweet.in_reply_to_status_id:
            get_or_create(session,
                          PostRelationship,
                          left=post,
                          right=_tweet_or_dummy(session,
                                                tweet.in_reply_to_status_id),
                          rel="reply-to")

        if tweet.quoted_status_id:
            get_or_create(session,
                          PostRelationship,
                          left=post,
                          right=_tweet_or_dummy(session,
                                                tweet.quoted_status_id),
                          rel="quotes")

        session.commit()

        return post
Ejemplo n.º 5
0
from twitter.models import Status, User

MENTIONED_TWEETS = [
    Status(id_str="0001_1", user=User(screen_name="user0001")),
    Status(id_str="0001_2", user=User(screen_name="user0001")),
    Status(id_str="0002_1", user=User(screen_name="user0002")),
    Status(id_str="0003_1", user=User(screen_name="user0003")),
    Status(id_str="0004_1", user=User(screen_name="user0004")),
]

SELF_TWEETS = [
    Status(id_str="9999_1"),
    Status(id_str="9999_2"),
    Status(id_str="9999_3", in_reply_to_status_id="0003_1"),
    Status(id_str="9999_4")
]
Ejemplo n.º 6
0
class TestModel(unittest.TestCase):
    dao = None
    USER_IDS = (12345678901, 12345678902, 12345678903, 12345678904,
                12345678905)
    SCREEN_NAMES = ('user_1', 'user_2', 'user_3', 'user_4', 'user_5')
    NAMES = ('name 1', '五毛外宣部副部长\U0001f1e8\U0001f1f3', 'name 3', 'name 4',
             'name 5')
    DESCRIPTIONS = (
        '予人玫瑰 手有餘香', '北京摄影老顽童\U0001f1e8\U0001f1f3',
        'spread positive energy, let the world understand China! \n再艰难,爱不会离开!',
        '', '')
    CREATED_ATS = ('Tue Mar 29 08:11:25 +0000 2011',
                   'Tue Mar 29 08:11:25 +0000 2020',
                   'Tue Mar 29 08:11:25 +0000 2020',
                   'Tue Mar 29 08:11:25 +0000 2011',
                   'Tue Mar 29 08:11:25 +0000 2011')
    FOLLOWER_COUNTS = (1, 56, 878264, 223, 872)
    FRIEND_COUNTS = (3215, 0, 782, 3295, 3)
    METHODS = ('get_following_paged', 'get_followers_paged')
    CURSORS = (1656974570956055733, 1656809280611943888)
    USERS = [
        User(id=user_id,
             screen_name=screen_name,
             name=name,
             description=desc,
             created_at=dt,
             followers_count=follower_count,
             friends_count=friend_count)
        for user_id, screen_name, name, desc, dt, follower_count, friend_count
        in zip(USER_IDS, SCREEN_NAMES, NAMES, DESCRIPTIONS, CREATED_ATS,
               FOLLOWER_COUNTS, FRIEND_COUNTS)
    ]

    @classmethod
    def setUpClass(cls) -> None:
        print('setUpClass started')
        cls.dao = Dao()
        cls.dao.reset_db()
        print('setUpClass ended')

    @classmethod
    def tearDownClass(cls) -> None:
        print('tearDownClass started')
        cls.dao.reset_db()
        print('tearDownClass ended')

    def setUp(self):
        """save to DB, get variables of table instances:
        5 tweeters, 2 tracks, 2 old wumaos, 2 new wumao
        instance variables:
          * tweeters
          * tracks
          * old_wumao_tweeter_ids
          * new_wumao_tweeter_ids
          * old_wumaos
          * new_wumaos

        :return:
        """
        print('setUp started')

        self.dao.bulk_save_tweeter(self.USERS)
        tweeter_ids = self.dao.all_tweeter_id(self.USER_IDS)
        tracks_ = [
            Track(tweeter_id, method,
                  cursor) for tweeter_id, method, cursor in zip(
                      tweeter_ids, self.METHODS, self.CURSORS)
        ]
        self.dao.bulk_save(tracks_)

        self.tweeters = [self.dao.lookup_tweeter(i) for i in tweeter_ids]
        self.tracks = [
            self.dao.lookup_track(track.tweeter_id) for track in tracks_
        ]

        self.old_wumao_tweeter_ids = [u.id for u in self.tweeters][:2]
        self.new_wumao_tweeter_ids = [u.id for u in self.tweeters][2:4]
        self.dao.bulk_save_wumao(self.old_wumao_tweeter_ids, new=False)
        self.dao.bulk_save_wumao(self.new_wumao_tweeter_ids, new=True)
        wumaos = [self.dao.lookup_wumao(i) for i in self.dao.all_wumao_id()]

        self.old_wumaos = [w for w in wumaos if w.is_new == 0]
        self.new_wumaos = [w for w in wumaos if w.is_new == 1]
        print('setUp ended')

    def tearDown(self):
        print('tearDown started')
        self.dao.reset_db()
        print('tearDown ended')

    def test_bulk_save(self):
        """bulk save

        methods:
          * dao.bulk_save
          * dao.bulk_save_tweeter
        :return:
        """
        self.assertEqual(set(), self.dao.bulk_save_tweeter(self.USERS))
        self.assertEqual(set(),
                         self.dao.bulk_save_wumao(self.old_wumao_tweeter_ids))

    def test_tweeter(self):
        """checks DAO methods on table 'tweeter'

        methods:
          * dao.lookup_tweeter_id
          * dao.all_tweeter_user_id

        :return:
        """
        set_1 = set(
            self.dao.lookup_tweeter(tweeter.id).id
            for tweeter in self.tweeters)
        set_2 = self.dao.all_tweeter_id(TestModel.USER_IDS)
        self.assertEqual(set_1, set_2)

    def test_friendship(self):
        """checks many-to-many junction table 'friendship' and its 'on-delete'
        constrain

        friendship: 1 follows 2, 3, 4; 5 follows 1
        methods:
          * dao.follow
          * dao.bulk_follow
          * dao.bulk_attract
          * dao.friend_count
          * dao.follower_count
          * dao.delete_tweeter

        :return:
        """
        tweeter_id_1, tweeter_id_2, tweeter_id_3, tweeter_id_4, tweeter_id_5 = (
            u.id for u in self.tweeters)
        self.dao.follow(tweeter_id_5, tweeter_id_1)
        self.dao.bulk_follow(tweeter_id_1, [tweeter_id_2, tweeter_id_3])
        self.dao.bulk_attract(tweeter_id_4, [tweeter_id_1])
        self.assertEqual(True, self.dao.is_following(tweeter_id_1,
                                                     tweeter_id_2))
        self.assertEqual(True, self.dao.is_following(tweeter_id_1,
                                                     tweeter_id_3))
        self.assertEqual(True, self.dao.is_following(tweeter_id_1,
                                                     tweeter_id_4))
        self.assertEqual(False,
                         self.dao.is_following(tweeter_id_1, tweeter_id_5))
        self.assertEqual(True, self.dao.is_following(tweeter_id_5,
                                                     tweeter_id_1))
        self.assertEqual(3, self.dao.friend_count(tweeter_id_1))
        self.assertEqual(
            2, self.dao.friend_count(tweeter_id_1,
                                     [tweeter_id_2, tweeter_id_4]))
        self.assertEqual(1, self.dao.follower_count(tweeter_id_1))
        self.assertEqual(0,
                         self.dao.follower_count(tweeter_id_1, [tweeter_id_1]))
        self.assertEqual(0, self.dao.follower_count(999))
        # on-delete constrain
        self.dao.delete_tweeter(tweeter_id_3)
        self.assertEqual([tweeter_id_2, tweeter_id_4],
                         self.dao.friends_id(tweeter_id_1))
        self.assertEqual([tweeter_id_5], self.dao.followers_id(tweeter_id_1))

    def test_wumao(self):
        """checks DAO methods of table 'wumao' and its 'on-delete' constrain

        methods
          * dao.all_wumao_id
          * dao.all_wumao_tweeter_id
          * dao.delete_tweeter

        :return:
        """
        tweeter_id_1, tweeter_id_2, tweeter_id_3, tweeter_id_4, tweeter_id_5 = (
            u.id for u in self.tweeters)
        old_wumao_1, old_wumao_2 = self.old_wumaos
        new_wumao_1, new_wumao_2 = self.new_wumaos
        self.assertEqual(set(self.old_wumao_tweeter_ids),
                         {old_wumao_1.tweeter_id, old_wumao_2.tweeter_id})
        self.assertEqual(set(self.new_wumao_tweeter_ids),
                         {new_wumao_1.tweeter_id, new_wumao_2.tweeter_id})
        # on-delete constrain
        self.dao.delete_tweeter(tweeter_id_3)
        self.assertEqual({new_wumao_2.id, old_wumao_1.id, old_wumao_2.id},
                         self.dao.all_wumao_id())
        self.assertEqual(
            {
                new_wumao_2.tweeter_id, old_wumao_1.tweeter_id,
                old_wumao_2.tweeter_id
            }, self.dao.all_wumao_tweeter_id())
        # update
        self.dao.upsert_wumao(new_wumao_2.tweeter_id, False)
        self.assertEqual(None, self.dao.any_wumao(True))
        self.dao.upsert_wumao(old_wumao_1.tweeter_id, True)
        self.assertEqual(True, self.dao.lookup_wumao(old_wumao_1.id).is_new)
        self.assertEqual(False, self.dao.lookup_wumao(new_wumao_2.id).is_new)

    def test_track(self):
        """checks DAO methods of table 'track'

        methods:
          * dao.lookup_track
          * dao.delete_track
          * dao.update_track

        :return:
        """
        # initialize & preparation
        track_1, track_2 = self.tracks
        # delete
        self.assertEqual(set(TestModel.CURSORS),
                         {track_1.cursor, track_2.cursor})
        self.dao.delete_track(track_1.tweeter_id)
        self.assertEqual(None, self.dao.lookup_track(track_1.tweeter_id))
        self.assertEqual(track_2, self.dao.any_track())
        self.dao.delete_track(track_2.tweeter_id)
        self.assertEqual(None, self.dao.lookup_track(track_2.tweeter_id))
        self.assertEqual(None, self.dao.any_track())
        # multiple tracks update
        # overwrite track_1 with track_2's method & cursor
        self.dao.upsert_track(track_1.tweeter_id, track_1.method,
                              track_1.cursor)
        self.dao.upsert_track(track_1.tweeter_id, track_2.method,
                              track_2.cursor)
        self.dao.upsert_track(track_2.tweeter_id, track_2.method,
                              track_2.cursor)
        self.dao.upsert_track(track_2.tweeter_id, track_2.method,
                              track_2.cursor)
        self.assertEqual(track_2.cursor,
                         self.dao.lookup_track(track_1.tweeter_id).cursor)
        self.assertEqual(track_2.method,
                         self.dao.lookup_track(track_1.tweeter_id).method)
        self.assertEqual(track_2.cursor,
                         self.dao.lookup_track(track_2.tweeter_id).cursor)
Ejemplo n.º 7
0
	def _fake_users(*_, screen_name=None):
		# id is the wrong type here, but we just need unique objects
		return [User(id=n, screen_name=n) for n in screen_name]
Ejemplo n.º 8
0
    'statuses_count': [None, 0, 1, 100, 1500],
    'created_at': [
        None, "Wed May 02 00:47:05 +0000 2012",
        "Wed May 02 00:47:05 +0000 2016", "Wed May 02 00:47:05 +0000 2018",
        "Mon Sep 03 00:47:05 +0000 2018"
    ],
    'profile.status.created_at': [
        None, "Wed May 02 00:47:05 +0000 2012",
        "Wed May 02 00:47:05 +0000 2016", "Wed May 02 00:47:05 +0000 2018",
        "Mon Sep 03 00:47:05 +0000 2018"
    ]
}

profiles = []
for i in range(5):
    np = User()
    np.id = 'user%s' % i
    np.screen_name = 'username%s' % i
    for c in confs:
        if c == 'description':
            np.description = confs[c][i]
        elif c == 'followers_count':
            np.followers_count = confs[c][i]
        elif c == 'location':
            np.location = confs[c][i]
        elif c == 'statuses_count':
            np.statuses_count = confs[c][i]
        elif c == 'created_at':
            np.created_at = confs[c][i]
        elif c == 'profile.status.created_at':
            ns = Status()