예제 #1
0
def user_recommendations(user, films, with_rated=False, order_by=None):
    film_ids = [f.id for f in films]

    if user and user.is_authenticated():
        profile = user.get_profile()
        basket = BasketItem.user_basket(user)
        rated_ids = set(Rating.get_user_ratings(user).keys())
        if profile.recommendations_status in (profile.NORMAL_RECOMMENDATIONS,
                                              profile.FAST_RECOMMENDATIONS):
            recommendations = recommendations_engine.compute_guess_score_for_films(
                user, film_ids)
        else:
            recommendations = {}

        for f in films:
            r = recommendations.get(f.id)
            b = basket.get(f.id)
            f._rated = f.id in rated_ids
            f._guess_rating = r or 0
            f._on_wishlist = b and b[0] and (
                b[0] != BasketItem.NOT_INTERESTED) or False
            f._on_shitlist = b and (b[0] == BasketItem.NOT_INTERESTED) or False
    else:
        for f in films:
            f._rated = False
            f._guess_rating = 0
            f._on_wishlist = False
            f._on_shitlist = False

    test_with_rated = lambda f: with_rated or not f._rated

    films = list(f for f in films if not f._on_shitlist and test_with_rated(f))

    comparator = create_film_comparator(order_by)
    return sorted(films, cmp=comparator)
예제 #2
0
def user_recommendations(user, films, with_rated=False, order_by=None):
    film_ids = [f.id for f in films]

    if user and user.is_authenticated():
        profile = user.get_profile()
        basket = BasketItem.user_basket(user)
        rated_ids = set(Rating.get_user_ratings(user).keys())
        if profile.recommendations_status in (profile.NORMAL_RECOMMENDATIONS, profile.FAST_RECOMMENDATIONS):
            recommendations = recommendations_engine.compute_guess_score_for_films(user, film_ids)
        else:
            recommendations = {}

        for f in films:
            r = recommendations.get(f.id)
            b = basket.get(f.id)
            f._rated = f.id in rated_ids
            f._guess_rating = r or 0
            f._on_wishlist = b and b[0] and (b[0] != BasketItem.NOT_INTERESTED) or False
            f._on_shitlist = b and (b[0] == BasketItem.NOT_INTERESTED) or False
    else:
        for f in films:
            f._rated = False
            f._guess_rating = 0
            f._on_wishlist = False
            f._on_shitlist = False

    test_with_rated = lambda f: with_rated or not f._rated

    films = list(f for f in films if not f._on_shitlist and test_with_rated(f))

    comparator = create_film_comparator(order_by)
    return sorted(films, cmp=comparator)
예제 #3
0
def recompute_recommendations(user):
    engine.compute_user_features(user, save=True)

    key = cache_key("top_film_ids", MAX_RECOMMENDATIONS_NUMBER)
    film_ids = cache.get(key)
    if film_ids is None:
        film_ids = Film.objects.filter(popularity__gte=MIN_POPULARITY)
        film_ids = film_ids.with_poster().with_description().values_list(
            'id', flat=True)
        film_ids = film_ids.exclude(
            production_country_list__icontains='Poland').exclude(
                production_country_list__icontains='Polska')
        film_ids = film_ids.order_by(
            '-popularity')[:MAX_RECOMMENDATIONS_NUMBER]
        film_ids = list(film_ids)
        cache.set(key, film_ids)

    recommendations = [
        s
        for s in engine.compute_guess_score_for_films(user, film_ids).items()
        if s[1]
    ]
    recommendations = sorted(recommendations, key=lambda s: -s[1])

    return recommendations
예제 #4
0
def recompute_recommendations(user):
    engine.compute_user_features(user, save=True)

    key = cache_key("top_film_ids", MAX_RECOMMENDATIONS_NUMBER)
    film_ids = cache.get(key)
    if film_ids is None:
        film_ids = Film.objects.filter(popularity__gte=MIN_POPULARITY)
        film_ids = film_ids.with_poster().with_description().values_list('id', flat=True)
        film_ids = film_ids.exclude(production_country_list__icontains='Poland').exclude(production_country_list__icontains='Polska')
        film_ids = film_ids.order_by('-popularity')[:MAX_RECOMMENDATIONS_NUMBER]
        film_ids = list(film_ids)
        cache.set(key, film_ids)

    recommendations = [s for s in engine.compute_guess_score_for_films(user, film_ids).items() if s[1]]
    recommendations = sorted(recommendations, key=lambda s:-s[1])

    return recommendations
예제 #5
0
    def _get_recommendations(self):
        self.films = set()
        film_ids = []

        for film_set in self.film_sets:
            for f in film_set.values():
                if not f in self.films and f.has_screenings(
                        self.channel_ids, self.since):
                    self.films.add(f)
                    if f.film_id:
                        film_ids.append(f.film_id)

        if self.user and self.user.is_authenticated():
            profile = self.user.get_profile()
            basket = BasketItem.user_basket(self.user)
            rated_ids = Film._rated_film_ids(self.user)
            if profile.recommendations_status in (
                    profile.NORMAL_RECOMMENDATIONS,
                    profile.FAST_RECOMMENDATIONS):
                recommendations = recommendations_engine.compute_guess_score_for_films(
                    self.user, film_ids)
            else:
                recommendations = {}

            for f in self.films:
                if not f.film_id:
                    continue
                r = recommendations.get(f.film_id)
                b = basket.get(f.film_id)
                f._rated = f.film_id in rated_ids
                f._guess_rating = r or 0
                f._on_wishlist = b and b[0] and (
                    b[0] != BasketItem.NOT_INTERESTED) or False
                f._on_shitlist = b and (b[0]
                                        == BasketItem.NOT_INTERESTED) or False

        test_with_rated = lambda f: self.with_rated or not f._rated
        test_unmatched = lambda f: not self.without_unmatched or f.film_id

        films = list(
            f for f in self.films
            if not f._on_shitlist and test_with_rated(f) and test_unmatched(f))

        comparator = create_film_comparator(self.order_by)
        return sorted(films, cmp=comparator)
예제 #6
0
    def _get_recommendations(self):
        self.films = set()
        film_ids = []

        for film_set in self.film_sets:
            for f in film_set.values():
                if not f in self.films and f.has_screenings(self.channel_ids, self.since):
                    self.films.add(f)
                    if f.film_id:
                        film_ids.append(f.film_id)

        if self.user and self.user.is_authenticated():
            profile = self.user.get_profile()
            basket = BasketItem.user_basket(self.user)
            rated_ids = Film._rated_film_ids(self.user)
            if profile.recommendations_status in (profile.NORMAL_RECOMMENDATIONS, profile.FAST_RECOMMENDATIONS):
                recommendations = recommendations_engine.compute_guess_score_for_films(self.user, film_ids)
            else:
                recommendations = {}

            for f in self.films:
                if not f.film_id:
                    continue
                r = recommendations.get(f.film_id)
                b = basket.get(f.film_id)
                f._rated = f.film_id in rated_ids
                f._guess_rating = r or 0
                f._on_wishlist = b and b[0] and (b[0] != BasketItem.NOT_INTERESTED) or False
                f._on_shitlist = b and (b[0] == BasketItem.NOT_INTERESTED) or False

        test_with_rated = lambda f: self.with_rated or not f._rated
        test_unmatched = lambda f: not self.without_unmatched or f.film_id

        films = list(f for f in self.films if not f._on_shitlist and test_with_rated(f) and test_unmatched(f))

        comparator = create_film_comparator(self.order_by)
        return sorted(films, cmp=comparator)