示例#1
0
    def test_top_from_grade_users(self):
        con = self.connection_db
        count_top = 1000
        with con:
            target_param = dict(test_target_user)
            id_vk_target = target_param.pop("id_vk")
            target_id = target_param.get("id")
            db_engine.insert_update_user_vk(con, "target_users_vk",
                                            id_vk_target, **target_param)

            user_param1 = dict(test_user1)
            id_vk1 = user_param1.pop("id_vk")
            user_param1.pop("id")

            dict_test = dict(test_grade1)
            dict_test.pop("target_users_id")
            dict_test.pop("users_id")
            dict_test.pop("id")
            points_auto = dict_test.pop("points_auto")

            for num in range(1, count_top + 1):
                user_param1.update({"id": num})
                dict_test.update(points_auto=points_auto + num)
                db_engine.insert_update_user_vk(con, "users_vk", id_vk1 + num,
                                                **user_param1)
                db_engine.insert_update_grade_users(con, target_id, num,
                                                    **dict_test)

        result = db_engine.top_from_grade_users(con, count_top, target_id)
        for num, grade in enumerate(result):
            self.assertEqual(grade[3], points_auto + count_top - num)
示例#2
0
    def test_black_list(self):
        con = self.connection_db
        count_users = 10
        with con:
            target_param = dict(test_target_user)
            id_vk_target = target_param.pop("id_vk")
            target_id = target_param.get("id")
            db_engine.insert_update_user_vk(con, "target_users_vk",
                                            id_vk_target, **target_param)

            user_param1 = dict(test_user1)
            id_vk1 = user_param1.pop("id_vk")
            user_param1.pop("id")

            dict_test = dict(test_grade1)
            dict_test.pop("target_users_id")
            dict_test.pop("users_id")
            dict_test.pop("id")

            for num in range(1, count_users + 1):
                user_param1.update({"id": num})
                dict_test.update(points_user=(-1 if (num % 2) == 0 else num))
                db_engine.insert_update_user_vk(con, "users_vk", id_vk1 + num,
                                                **user_param1)
                db_engine.insert_update_grade_users(con, target_id, num,
                                                    **dict_test)

        with patch("db_engine.input", side_effect=["нет"]):
            result = db_engine.black_list(con, target_id)
        self.assertIsInstance(result, list)
        self.assertEqual(len(result), count_users // 2)
示例#3
0
    def test_get_grade_users(self):
        with self.connection_db as con:
            target_param = dict(test_target_user)
            id_vk_target = target_param.pop("id_vk")
            db_engine.insert_update_user_vk(con, "target_users_vk",
                                            id_vk_target, **target_param)

            user_param1 = dict(test_user1)
            id_vk1 = user_param1.pop("id_vk")
            db_engine.insert_update_user_vk(con, "users_vk", id_vk1,
                                            **user_param1)

            dict_test = dict(test_grade1)
            target_id = dict_test.pop("target_users_id")
            users_id = dict_test.pop("users_id")
            db_engine.insert_update_grade_users(con, target_id, users_id,
                                                **dict_test)

        result = db_engine.get_grade_users(con, target_id, id_vk1, False)
        self.assertEqual(
            result,
            (
                test_grade1.get("users_id"),
                test_grade1.get("num_common_groups"),
                test_grade1.get("points_auto"),
            ),
        )
        result = db_engine.get_grade_users(self.connection_db, target_id,
                                           users_id, True)
        self.assertIsNone(result)
示例#4
0
def top_10_to_file_for_user(connection_db, vk_api, current_target_user):
    if True:
        dict_top10 = dict()
        current_top10 = top_from_grade_users(
            connection_db, 10, current_target_user.user_bd_id, False
        )
        users_id_bd_list = []
        status_bar_top10 = StatusBar(len(current_top10))
        print("Ищем самые лучшие фотографии пользователей")
        for item in current_top10:
            status_bar_top10.plus()
            users_id_bd_list.append(item[2])
            vk_id = get_user_of_id_vk(connection_db, "users_vk", item[2], bd=True)[1]
            url_user = f"https://vk.com/id{vk_id}"
            list_best_photo = get_best_photo(vk_api, vk_id)
            dict_top10.update({vk_id: {"url": url_user, "photos": list_best_photo}})
        filename = f'{current_target_user.user_vk_id}_{dt.now().strftime("%y%m%d_%H%M%S")}.json'
        with open(filename, "w", encoding="utf-8") as file:
            json.dump(dict_top10, file)
        with connection_db:
            for user_id_bd in users_id_bd_list:
                insert_update_grade_users(
                    connection_db,
                    current_target_user.user_bd_id,
                    user_id_bd,
                    export_state=True,
                )
    return filename
示例#5
0
def calc_top_for_user(connection_db, vk_api, current_target_user):
    if vk_api and True:
        # определяем топ 99 пользователей
        top_100 = top_from_grade_users(
            connection_db, 99, current_target_user.user_bd_id
        )
        # первый пользователь - целевой
        top_100_ids_vk = [current_target_user.user_vk_id]
        for item in top_100:
            top_100_ids_vk.append(
                get_user_of_id_vk(connection_db, "users_vk", item[2], True)[1]
            )
        # забираем для них и текущего пользователя группы
        groups_top_100 = find_group_all_users_list_25(top_100_ids_vk, vk_api)
        groups_target_user = groups_top_100[0].get(current_target_user.user_vk_id)
        for num_user, user_groups in enumerate(groups_top_100[1:]):

            for user, groups_user in user_groups.items():
                common_groups = calc_common_param(groups_target_user, groups_user)
                if common_groups:
                    grade_in = get_grade_users(
                        connection_db, current_target_user.user_bd_id, user
                    )
                    if grade_in and not grade_in[1]:
                        points_group = calc_points(common_groups, {1: 20, 2: 25, 3: 30})
                        points_auto = grade_in[2] + points_group
                        insert_update_grade_users(
                            connection_db,
                            current_target_user.user_bd_id,
                            grade_in[0],
                            points_auto=points_auto,
                            num_common_groups=common_groups,
                        )
示例#6
0
    def test_insert_update_grade_users(self):
        dict_test = dict(test_grade1)
        target_id = dict_test.pop("target_users_id")
        users_id = dict_test.pop("users_id")
        with self.connection_db as con:
            with con.cursor() as curs:
                curs.execute(
                    f"select * from grade_users where target_users_id = {target_id}"
                    f"and users_id = {users_id}")
                curs.fetchall()

                target_param = dict(test_target_user)
                id_vk_target = target_param.pop("id_vk")
                db_engine.insert_update_user_vk(con, "target_users_vk",
                                                id_vk_target, **target_param)

                user_param1 = dict(test_user1)
                id_vk1 = user_param1.pop("id_vk")
                db_engine.insert_update_user_vk(con, "users_vk", id_vk1,
                                                **user_param1)

        with self.connection_db as con:
            result = db_engine.insert_update_grade_users(
                con, target_id, users_id, **dict_test)

        self.assertEqual(
            result,
            (
                test_grade1.get("id"),
                test_grade1.get("target_users_id"),
                test_grade1.get("users_id"),
                test_grade1.get("points_auto"),
                test_grade1.get("points_user"),
                test_grade1.get("num_common_friends"),
                test_grade1.get("num_common_groups"),
                test_grade1.get("export_state"),
            ),
        )
示例#7
0
def search_users_of_parametr(connection, vk_api, search_p, current_target_user):
    all_users_id_search = []
    count_all_iteration = len(search_p.status) * (
        search_p.age_to - search_p.age_from + 1
    )
    print("Поиск подходящих пользователей")
    status_bar_find = StatusBar(count_all_iteration)
    for current_status in search_p.status:
        count_errors = 0
        for current_age in range(search_p.age_from, search_p.age_to + 1):
            status_bar_find.plus(1)
            dict_search = dict(
                q=search_p.q,
                city=search_p.city,
                age_from=current_age,
                age_to=current_age,
                count=search_p.count,
                sex=search_p.sex,
                has_photo=search_p.has_photo,
                status=current_status,
                sort=random.choice((0, 1)),
                fields=[
                    "bdate",
                    "relation",
                    "city",
                    "common_count",
                    "sex",
                    "activities",
                    "interests",
                    "music",
                    "movies",
                    "books",
                    "quotes",
                    "about",
                    "home_town",
                ],
            )
            users_search = api_reuest(vk_api, "users.search", **dict_search)
            # счетчик ошибок, если на одном пользователе нет ответа, то выходим из цикла досрочно
            if not users_search:
                count_errors += 1
                if count_errors == 10:
                    break
                continue

            with connection:
                for user in users_search.get("items"):
                    # print(user)
                    try:
                        user_current_search = insert_update_user_vk(
                            connection,
                            "users_vk",
                            user.get("id"),
                            first_name=user.get("first_name"),
                            last_name=user.get("last_name"),
                            age=current_age,
                            city=search_p.city,
                            sex=user.get("sex"),
                            relation=current_status,
                            activities=list_from_string(user.get("activities")),
                            interests=list_from_string(user.get("interests")),
                            movies=list_from_string(user.get("movies")),
                            music=list_from_string(user.get("music")),
                            books=list_from_string(user.get("books")),
                            quotes=list_from_string(user.get("quotes")),
                            about=list_from_string(user.get("about")),
                            home_town=list_from_string(user.get("home_town")),
                        )
                        user_id_bd = user_current_search[0]
                        # print('user', user_current_search)
                        all_users_id_search.append(user_id_bd)
                        # if user_current_search[7]:
                        #     common_activities = set(current_target_user.activities) & set(user_current_search[7])
                        #     print(f'common_activities:{common_activities}')
                        common_activities = calc_common_param(
                            current_target_user.activities, user_current_search[7]
                        )
                        common_interests = calc_common_param(
                            current_target_user.interests, user_current_search[8]
                        )
                        common_movies = calc_common_param(
                            current_target_user.movies, user_current_search[9]
                        )
                        common_music = calc_common_param(
                            current_target_user.music, user_current_search[10]
                        )
                        common_books = calc_common_param(
                            current_target_user.books, user_current_search[11]
                        )
                        common_quotes = calc_common_param(
                            current_target_user.quotes, user_current_search[12]
                        )
                        common_about = calc_common_param(
                            current_target_user.about, user_current_search[13]
                        )
                        common_home_town = calc_common_param(
                            current_target_user.home_town, user_current_search[14]
                        )

                        points_relation = calc_points(current_status, {1: 5, 6: 15})
                        points_age = calc_points(
                            int(math.fabs(current_target_user.age - current_age)),
                            {0: 20, 1: 17, 2: 15, 3: 12, 4: 10, 5: 5},
                        )
                        points_activities = calc_points(
                            common_activities, {1: 10, 2: 20, 3: 30}
                        )
                        points_interests = calc_points(
                            common_interests, {1: 10, 2: 20, 3: 30}
                        )
                        points_movies = calc_points(
                            common_movies, {1: 10, 2: 13, 3: 15}
                        )
                        points_music = calc_points(common_music, {1: 20, 2: 25, 3: 30})
                        points_books = calc_points(common_books, {1: 10, 2: 15, 3: 20})
                        points_quotes = calc_points(
                            common_quotes, {1: 10, 2: 20, 3: 30}
                        )
                        points_about = calc_points(common_about, {1: 10, 2: 20, 3: 30})
                        points_home_town = calc_points(
                            common_home_town, {1: 20, 2: 25, 3: 30}
                        )
                        points_common_friends = calc_points(
                            user.get("common_count"), {1: 30, 2: 35, 3: 40}
                        )

                        points_auto = (
                            points_age
                            + points_relation
                            + points_activities
                            + points_interests
                            + points_movies
                            + points_music
                            + points_books
                            + points_quotes
                            + points_about
                            + points_home_town
                            + points_common_friends
                        )

                        insert_update_grade_users(
                            connection,
                            current_target_user.user_bd_id,
                            user_id_bd,
                            points_auto=points_auto,
                            num_common_friends=user.get("common_count"),
                        )

                    except TypeError as e:
                        print(f"Ошика типов: {e}")
    if all_users_id_search:
        return all_users_id_search