Example #1
0
async def update_db(data):
    parsed = json.loads(data)
    print(parsed['text'])

    vote, coin = is_vote(parsed["text"])
    if None in [vote, coin]:
        return

    print(f'New vote detected : {coin}')

    async with create_engine(
            user="******",
            database="deviant",
            host="127.0.0.1",
            password="******",
            port=5432,
    ) as engine:
        mgr = SQLModelManager.instance()
        mgr.database = engine

        user, created = await User.objects.get_or_create(id=int(parsed['id']))
        if created:
            user.name = parsed["user"]["name"]
            user.screen_name = parsed["user"]["screen_name"]
            user.followers_count = parsed["user"]["followers_count"]
            user.statuses_count = parsed["user"]["statuses_count"]
            await user.save()

            new_record = Tweet()
            new_record.id = parsed["id"]
            new_record.text = parsed["text"]
            new_record.created_at = tdate_to_timestamp(parsed["created_at"])
            new_record.user = user
            new_record.coin = coin.upper()
            await new_record.save(force_insert=True)
Example #2
0
    async def prepare(self):
        async with create_engine(user="******",
                                 database="deviant",
                                 host="127.0.0.1",
                                 password="******",
                                 port=5432) as engine:
            SQLModelManager.instance().database = engine
            users = await User.objects.all()
            for u in users:
                tmp_dict = {}
                tmp_dict["Name"] = u.screen_name
                tmp_dict["Tweets"] = u.statuses_count
                tmp_dict["Followers"] = u.followers_count
                tmp_dict["id"] = str(u.id)
                tmp_dict["Follow"] = u.follower

                u.tweets = await Tweet.objects.filter(user=u.id)
                if True in [i.retweet for i in u.tweets]:
                    tmp_dict["Retweet"] = True

                tmp = [i.coin for i in u.tweets if i.coin != '']
                log.debug(f'tmp :  {len(tmp)}')
                if len(tmp) == 1:
                    tmp_dict["Coin"] = tmp[0].upper()

                self.datas["data"].append(tmp_dict)
Example #3
0
async def db(event_loop):

    if DATABASE_URL.startswith("sqlite"):
        m = re.match(r"(.+)://(.+)", DATABASE_URL)
        assert m, "DATABASE_URL is an invalid format"
        schema, db = m.groups()
        params = dict(database=db)
    else:
        m = re.match(r"(.+)://(.+):(.*)@(.+):(\d+)/(.+)", DATABASE_URL)
        assert m, "DATABASE_URL is an invalid format"
        schema, user, pwd, host, port, db = m.groups()
        params = dict(host=host, port=int(port), user=user, password=pwd)

    if schema == "mysql":
        from aiomysql import connect
        from aiomysql.sa import create_engine
    elif schema == "postgres":
        from aiopg import connect
        from aiopg.sa import create_engine
    elif schema == "sqlite":
        from aiosqlite import connect

        create_engine = connect
    else:
        raise ValueError("Unsupported database schema: %s" % schema)

    if schema == "mysql":
        params["autocommit"] = True

    params["loop"] = event_loop

    if schema == "sqlite":
        if os.path.exists(db):
            os.remove(db)
    else:
        if schema == "postgres":
            params["database"] = "postgres"

        async with connect(**params) as conn:
            async with conn.cursor() as c:
                # WARNING: Not safe
                await c.execute("DROP DATABASE IF EXISTS %s;" % db)
                await c.execute("CREATE DATABASE %s;" % db)

    if schema == "mysql":
        params["db"] = db
    elif schema == "postgres":
        params["database"] = db

    async with create_engine(**params) as engine:
        mgr = SQLModelManager.instance()
        mgr.database = {"default": engine}
        yield engine
Example #4
0
async def create_db_tables():
    async with create_engine(user='******',
                             database='deviant',
                             host='127.0.0.1',
                             password='******',
                             port=5432) as engine:
        mgr = SQLModelManager.instance()
        mgr.database = engine
        mgr.create_tables()

        await User.objects.create()
        await Tweet.objects.create()
Example #5
0
    async def get_summary_report(self):
        async with create_engine(user="******",
                                 database="deviant",
                                 host="127.0.0.1",
                                 password="******",
                                 port=5432) as engine:
            SQLModelManager.instance().database = engine

            followers = await User.objects.filter(follower__is=True)
            followers_count = len(followers)
            followers_count_users_id = [i.id for i in followers]
            print(f"nb followers : {followers_count}")

            coins = await Tweet.objects.filter(coin__gt='')
            coins_count_users_id = {i.user.id for i in coins}
            coins_count = len(coins_count_users_id)
            print(f"coins count: {coins_count}")

            retweets = await Tweet.objects.filter(retweet__is=True)
            retweets_count_users_id = {i.user.id for i in retweets}
            retweets_count = len(retweets_count_users_id)
            print(f"retweets count: {retweets_count}")

            listes = [
                followers_count_users_id,
                coins_count_users_id,
                retweets_count_users_id,
            ]
            total_liste = reduce(set.intersection, [set(l_) for l_ in listes])
            log.debug(total_liste)

            summary_report = [
                {
                    "name": "Followers",
                    "nb": followers_count
                },
                {
                    "name": "Users have retweet",
                    "nb": retweets_count
                },
                {
                    "name": "Users haave coined",
                    "nb": coins_count
                },
                {
                    "name": "Users qualified",
                    "nb": len(total_liste)
                },
            ]

            self.viewer.summaryreport.summary_report_list = summary_report
Example #6
0
async def update_db():
    last_retweet_from_db = await get_last_retweet_from_db()
    retweets_from_twitter = api.retweets(TWEET_ID, count=100)
    if not last_retweet_from_db:
        new_retweets = [
            r
            for r in retweets_from_twitter
            if r.created_at > datetime(2019, 8, 31, 0, 0)
        ]
    else:
        new_retweets = [
            r
            for r in retweets_from_twitter
            if r.created_at > last_retweet_from_db.created_at
        ]
    my_logger.debug(f"{len(new_retweets)} retweets to insert in db")

    async with create_engine(
        user="******",
        database="deviant",
        host="127.0.0.1",
        password="******",
        port=5432,
    ) as engine:
        mgr = SQLModelManager.instance()
        mgr.database = engine

        for retweet in new_retweets:
            user, created = await User.objects.get_or_create(id=int(retweet.user.id))
            if created:
                my_logger.debug(f"New User created {retweet.user.screen_name}")
                user.name = retweet.user.name
                user.screen_name = retweet.user.screen_name
                user.followers_count = retweet.user.followers_count
                user.statuses_count = retweet.user.statuses_count
                await user.save()

            new_record = Tweet()
            new_record.id = retweet.id
            new_record.text = retweet.text
            new_record.created_at = retweet.created_at
            new_record.user = user
            new_record.retweet = True
            my_logger.debug(f"New retweet created {retweet.text}")
            await new_record.save(force_insert=True)
Example #7
0
    async def get(self):  # TODO Manage websockets when browser not refreshed
        viewer = Viewer(request=self.request, response=self, datas=[])

        tornado.log.gen_log.debug("I'm doing some stuff")
        tmp_list = []
        async with create_engine(user="******",
                                 database="deviant",
                                 host="127.0.0.1",
                                 password="******",
                                 port=5432) as engine:
            SQLModelManager.instance().database = engine
            coins = await Tweet.objects.all()
            coins_list = Counter([c.coin for c in coins if c.coin != ''])
            for k, v in coins_list.items():
                tmp_list.append({'coin': k.upper(), 'nb': v})
            viewer.coinsleaderboard.leaderboard_list = tmp_list

        CACHE[viewer.ref] = viewer
        self.write(viewer.render())
Example #8
0
async def get_last_retweet_from_db():
    async with create_engine(
        user="******",
        database="deviant",
        host="127.0.0.1",
        password="******",
        port=5432,
    ) as engine:
        mgr = SQLModelManager.instance()
        mgr.database = engine

        last_retweet = await Tweet.objects.filter(retweet__is=True)
    ordered = sorted(last_retweet, key=operator.attrgetter("created_at"), reverse=True)
    if not ordered:
        my_logger.debug("DB is empty")
        return None
    my_logger.debug(f"Last retweet in DB {ordered[0].created_at}")
    print()
    return ordered[0]
Example #9
0
    async def get_user_tweets(self, userid):
        tweetslist = []
        async with create_engine(user="******",
                                 database="deviant",
                                 host="127.0.0.1",
                                 password="******",
                                 port=5432) as engine:
            SQLModelManager.instance().database = engine
            tweets = await Tweet.objects.filter(user=userid)
            for t in tweets:
                try:
                    username = str(t.user.screen_name)
                except:
                    username = ''

                tweetslist.append({
                    "text": t.text,
                    "coin": str(t.coin),
                    "retweet": str(t.retweet),
                    "date": str(t.created_at),
                    "id": str(t.id),
                    "user": username
                })
            self.viewer.tweetsdetails.tweets_list = tweetslist
Example #10
0
def test_build_tables():
    # Trigger table creation
    SQLModelManager.instance().create_tables()
Example #11
0
async def get_followers_and_update_db():
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = API(auth_handler=auth, retry_count=3)

    twitter_followers = []
    if mode_production is True:
        for page in Cursor(api.followers_ids,
                           screen_name=USER_SCREEN_NAME).pages():
            twitter_followers.extend(page)
        #with open("test/followers.txt", "x") as f:
        #    for t in twitter_followers:
        #        f.write(f"{t}\n")
    else:
        with open("test/followers.txt", "r") as f:
            for l in f:
                twitter_followers.append(l[:-1])

    print(f"Followers count: {len(twitter_followers)}")

    async with create_engine(
            user="******",
            database="deviant",
            host="127.0.0.1",
            password="******",
            port=5432,
    ) as engine:
        mgr = SQLModelManager.instance()
        mgr.database = engine
        mgr.create_tables()

        users_in_db = await User.objects.filter(follower__is=True)
        ids_in_db = [i.id for i in users_in_db]
        users_to_check = [i for i in twitter_followers if i not in ids_in_db]
        print(f"Followers en twitter account: {len(twitter_followers)}")
        print(f"Followers in DB before update: {len(ids_in_db)}")
        print(f"{len(users_to_check)} to check")

        a = 0
        for i in users_to_check:
            # print(type(i))
            await gen.sleep(1)
            a += 1
            user, created = await User.objects.get_or_create(id=int(i))
            if created:
                # print(f'Create User {user.screen_name}')
                u = api.get_user(i, include_entities=False)
                user.name = u.name
                user.screen_name = u.screen_name
                user.followers_count = u.followers_count
                user.statuses_count = u.statuses_count
                user.follower = True
                print(
                    f"{a} / {len(users_to_check)} : User {user.screen_name} created"
                )
            else:
                # print('User already in db')
                user.follower = True
                print(
                    f"{a} / {len(users_to_check)} : User {user.screen_name} updated"
                )
            await user.save()