Пример #1
0
    def get_best_psi_films_queryset(self,
                                    user,
                                    tags=None,
                                    year_from=None,
                                    year_to=None,
                                    related_director=None,
                                    related_actor=None,
                                    popularity=None,
                                    include_features=(),
                                    exclude_features=(),
                                    netflix=None,
                                    exclude_production_country=None):
        from film20.recommendations import engine
        is_filtered = tags or year_from or year_to or related_director or related_actor or popularity or netflix

        if exclude_production_country:
            kw = dict(exclude_production_country=exclude_production_country)
        else:
            kw = {}
        all_scores = engine.compute_guess_score_for_all_films(user, **kw)
        all_scores = dict((key, val) for key, val in all_scores.items() if val)
        ratings = Rating.get_user_ratings(user)
        shitlisted = set(k for k, v in BasketItem.user_basket(user).items()
                         if v[0] == 9)

        film_ids = set(all_scores.keys())
        film_ids.difference_update(ratings.keys())
        film_ids.difference_update(shitlisted)

        if is_filtered:
            filtered = self._filter_films(tags, year_from, year_to,
                                          related_director, related_actor,
                                          popularity, netflix)
            filtered = filtered.filter(id__in=film_ids)
            film_ids = filtered.values_list('id', flat=True)

        if include_features:
            from film20.film_features.models import FilmFeature
            featured_ids = FilmFeature.matching_film_ids(
                include_features, exclude_features)
            film_ids = [id for id in film_ids if id in featured_ids]

        film_ids = sorted(film_ids, key=lambda f: -all_scores[f])

        from film20.utils.misc import ListWrapper

        class FilmWrapper(ListWrapper):
            def wrap(self, items):
                films = list(Film.objects.filter(id__in=items))
                films.sort(key=lambda f: -all_scores[f.id])
                for film in films:
                    film.guess_rating = all_scores.get(film.id)
                    yield film

        return FilmWrapper(film_ids)
Пример #2
0
    def get_ranking(self, type=Rating.TYPE_FILM, tags=None, year_from=None, year_to = None, related_director = None,
                    related_actor = None, popularity = None, order_by="average_score", order_way="desc",
                    limit = None, offset = None, min_num_votes = None, festival = False, exclude_production_country=None,
                    include_features=(), exclude_features=(), tv_series=False, **kw):
        """
            Gets film ranking for given type (overall, directory, screenplay, etc)
        """
        if min_num_votes == None:
            # festival hacks
            if festival:
                min_num_votes = 1
            # this is user-entered
            elif popularity is not None:
                min_num_votes = popularity
            elif type == Rating.TYPE_FILM:
                min_num_votes = FilmRanking.MIN_NUM_VOTES_FILM if not tv_series else 0
            else:
                min_num_votes = FilmRanking.MIN_NUM_VOTES_OTHER

        ranking = FilmRanking.objects.filter(type = type, number_of_votes__gte = min_num_votes).select_related('film', 'film__directors', 'film__actors').order_by('-average_score').distinct()
        if tv_series is not None:
            ranking = ranking.filter(film__is_tv_series=tv_series)
        if year_from:
            ranking = ranking.filter(film__release_year__gte = year_from)
        if year_to:
            ranking = ranking.filter(film__release_year__lte = year_to)
        if related_director:
            for director in related_director:
                ranking = ranking.filter(film__directors = director.id)
        if related_actor:
            for actor in related_actor:
                ranking = ranking.filter(film__actors = actor.id, film__character__LANG = settings.LANGUAGE_CODE)
        if tags:
            tags = [t.strip() for t in tags.split(',')]
            logger.debug("Enriching query. Filtering by tags: %r", tags)
            for tag in tags:
                ranking = ranking.filter(film__objectlocalized__tagged_items__tag__name = tag, film__objectlocalized__LANG = settings.LANGUAGE_CODE)

        if exclude_production_country:
            ranking = ranking.exclude(film__production_country_list__icontains=exclude_production_country)

        if include_features:
            from film20.film_features.models import FilmFeature
            featured_ids = FilmFeature.matching_film_ids(include_features, exclude_features)
            ranking = ranking.filter(film__in=featured_ids)

        logger.debug("Ranking fetched for type " + unicode(type))
        return ranking
Пример #3
0
    def get_best_psi_films_queryset(self, user, tags=None, year_from=None, year_to = None, related_director = None, related_actor = None, popularity = None, include_features=(), exclude_features=(), netflix=None, exclude_production_country=None):
        from film20.recommendations import engine
        is_filtered = tags or year_from or year_to or related_director or related_actor or popularity or netflix
        
        if exclude_production_country:
            kw = dict(exclude_production_country=exclude_production_country)
        else:
            kw = {}
        all_scores = engine.compute_guess_score_for_all_films(user, **kw)
        all_scores = dict((key, val) for key, val in all_scores.items() if val)
        ratings = Rating.get_user_ratings(user)
        shitlisted = set(k for k,v in BasketItem.user_basket(user).items() if v[0]==9)

        film_ids = set(all_scores.keys())
        film_ids.difference_update(ratings.keys())
        film_ids.difference_update(shitlisted)

        if is_filtered:
            filtered = self._filter_films(tags, year_from, year_to, related_director, related_actor, popularity, netflix)
            filtered = filtered.filter(id__in=film_ids)
            film_ids = filtered.values_list('id', flat=True)

        if include_features:
            from film20.film_features.models import FilmFeature
            featured_ids = FilmFeature.matching_film_ids(include_features, exclude_features)
            film_ids = [id for id in film_ids if id in featured_ids]

        film_ids = sorted(film_ids, key=lambda f: -all_scores[f])
        
        from film20.utils.misc import ListWrapper
        class FilmWrapper(ListWrapper):
            def wrap(self, items):
                films = list(Film.objects.filter(id__in=items))
                films.sort(key=lambda f:-all_scores[f.id])
                for film in films:
                    film.guess_rating = all_scores.get(film.id)
                    yield film
        return FilmWrapper(film_ids)
Пример #4
0
    def get_ranking(self,
                    type=Rating.TYPE_FILM,
                    tags=None,
                    year_from=None,
                    year_to=None,
                    related_director=None,
                    related_actor=None,
                    popularity=None,
                    order_by="average_score",
                    order_way="desc",
                    limit=None,
                    offset=None,
                    min_num_votes=None,
                    festival=False,
                    exclude_production_country=None,
                    include_features=(),
                    exclude_features=(),
                    tv_series=False,
                    **kw):
        """
            Gets film ranking for given type (overall, directory, screenplay, etc)
        """
        if min_num_votes == None:
            # festival hacks
            if festival:
                min_num_votes = 1
            # this is user-entered
            elif popularity is not None:
                min_num_votes = popularity
            elif type == Rating.TYPE_FILM:
                min_num_votes = FilmRanking.MIN_NUM_VOTES_FILM if not tv_series else 0
            else:
                min_num_votes = FilmRanking.MIN_NUM_VOTES_OTHER

        ranking = FilmRanking.objects.filter(
            type=type, number_of_votes__gte=min_num_votes).select_related(
                'film', 'film__directors',
                'film__actors').order_by('-average_score').distinct()
        if tv_series is not None:
            ranking = ranking.filter(film__is_tv_series=tv_series)
        if year_from:
            ranking = ranking.filter(film__release_year__gte=year_from)
        if year_to:
            ranking = ranking.filter(film__release_year__lte=year_to)
        if related_director:
            for director in related_director:
                ranking = ranking.filter(film__directors=director.id)
        if related_actor:
            for actor in related_actor:
                ranking = ranking.filter(
                    film__actors=actor.id,
                    film__character__LANG=settings.LANGUAGE_CODE)
        if tags:
            tags = [t.strip() for t in tags.split(',')]
            logger.debug("Enriching query. Filtering by tags: %r", tags)
            for tag in tags:
                ranking = ranking.filter(
                    film__objectlocalized__tagged_items__tag__name=tag,
                    film__objectlocalized__LANG=settings.LANGUAGE_CODE)

        if exclude_production_country:
            ranking = ranking.exclude(film__production_country_list__icontains=
                                      exclude_production_country)

        if include_features:
            from film20.film_features.models import FilmFeature
            featured_ids = FilmFeature.matching_film_ids(
                include_features, exclude_features)
            ranking = ranking.filter(film__in=featured_ids)

        logger.debug("Ranking fetched for type " + unicode(type))
        return ranking
Пример #5
0
 def get_mood_film_ids(self, tag):
     mood = tag and self.MOODS_MAP.get(tag)
     if not mood:
         return ()
     return FilmFeature.matching_film_ids(mood.include, mood.exclude)
Пример #6
0
 def get_mood_film_ids(self, tag):
     mood = tag and self.MOODS_MAP.get(tag)
     if not mood:
         return ()
     return FilmFeature.matching_film_ids(mood.include, mood.exclude)