示例#1
0
    def test_get_predict(self):
        from models.Users import Users
        from predict.get_predict import get_predict

        user = Users.get()
        res = get_predict(user, n=10)

        self.assertIsInstance(res, list)
        self.assertEqual(len(res), 10)
        self.assertIsInstance(res[0], int)
示例#2
0
    def get(self, request):

        r = {}
        for k in request.args:
            r[k] = request.args[k][0]

        assert "user_id" in r
        assert "type" in r

        if r["type"] == "get_predict":
            if "predict_size" in r:
                count = int(r["predict_size"])
            else:
                count = 1

            user = Users.get(Users.user_id == r["user_id"])
            predict = user.predict_films

            if len(predict) < count:
                predict += get_predict(user, 20)

            with db.atomic() as txn:
                user.predict_films = predict[count:]
                user.save()

                @test
                def not_save():
                    txn.rollback()

            return response.json(predict[:count])

        elif r["type"] == "get_liked":
            user = Users.get(Users.user_id == r["user_id"])
            return response.json(user.liked)
        else:
            response.text("error")
示例#3
0
    def patch(self, request):
        r = request.json
        assert "user_id" in r

        if "unliked_film_id" in r:
            user = Users.get(Users.user_id == r["user_id"])
            try:
                user.liked.remove(int(r["unliked_film_id"]))
            except:
                logger.error("FILM IS NOT IN USER LIKED")
                return response.text("film is not in user's liked")

            @not_test
            def save():
                user.save()
        else:
            @not_test
            def save():
                Users.update(r).where(Users.user_id == r["user_id"]).execute()

        return response.text("ok")
示例#4
0
    def post(self, request):
        """
        Add new mark for user and recomute models
        Resalt:
            2 - like
            1 - viewed
            -1 - dislike
            -2 - shit
        :param request:
        :return:
        """
        r = request.json
        assert "film_id" in r
        film = Films.get_or_none(Films.film_id == r["film_id"])

        assert film is not None, "Film not found!"

        if "event" in r:
            event = r["event"]

            if event == "error":
                film.errors += 1
            elif event == "open":
                film.opening += 1
            elif event == "trailer":
                film.count_triler += 1
            else:
                return response.text("unknown event type")

            @not_test
            def save():
                film.save()

            return response.text("ok")

        assert "user_id" in r
        assert "result" in r
        user = Users.get(Users.user_id == r["user_id"])
        result = r["result"]

        if user.mark_wight is not None and user.just_marked is not None:
            mark_wight = 1.5 - user.mark_wight / 2
        else:
            user.mark_wight = 1
            mark_wight = 1

        if result > 0:
            film.meanage = film.meanage + (film.meanage -
                                           user.age) / (film.likes + 1)
            film.sex = film.sex + (film.sex - user.sex) / (film.likes + 1)
            film.likes += 1

            if result == 1:
                user.ganres = [
                    x + y * 2 for x, y in zip(user.ganres, film.ganres)
                ]
                film.stars = film.stars + (
                    (10 - film.stars) * mark_wight) / (film.marks + 1)
                user.liked.append(film.film_id)

            if result == 2:
                user.ganres = [x + y for x, y in zip(user.ganres, film.ganres)]
                film.stars = film.stars + (
                    (9 - film.stars) * mark_wight) / (film.marks + 1)
                user.viewed.append(film.film_id)

        if result < 0:
            if result == -1:
                user.ganres = [
                    x + y * -1 for x, y in zip(user.ganres, film.ganres)
                ]
                film.stars = film.stars + (
                    (6 - film.stars) * mark_wight) / (film.marks + 1)
                user.disliked.append(film.film_id)
                film.dislikes += 1

            if result == -2:
                film.stars = film.stars + (
                    (1 - film.stars) * mark_wight) / (film.marks + 1)
                user.disliked.append(film.film_id)
                film.shit += 1

        user.mark_wight = user.mark_wight + result / (user.just_marked + 1)
        user.just_marked += 1
        film.marks += 1

        import random
        a = random.random()
        if a < 0.15:
            user.group = UserGroupClassifiter().get_group(user)
        if a < 0.3:
            u = self.upload_users_vectors(model_to_dict(user))
            Users.update(**u).where(Users.user_id == u["user_id"]).execute()

        @not_test
        def save():
            Dataset.create(data=datetime.now(),
                           user_value=model_to_dict(user),
                           film_value=model_to_dict(film),
                           result=result)

            film.save()
            user.save()

        return response.text("ok")