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)
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")
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")
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")