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