def _reading_preferences_hash(user): """ Method to retrieve the hash, as this is done several times. :param user: :return: articles_hash: ArticlesHash """ user_filter_subscriptions = TopicFilter.all_for_user(user) filters = [topic_id.topic for topic_id in user_filter_subscriptions] user_topic_subscriptions = TopicSubscription.all_for_user(user) topics = [topic_id.topic for topic_id in user_topic_subscriptions] user_languages = Language.all_reading_for_user(user) user_search_filters = SearchFilter.all_for_user(user) search_filters = [search_id.search for search_id in user_search_filters] user_searches = SearchSubscription.all_for_user(user) searches = [search_id.search for search_id in user_searches] articles_hash = ArticlesCache.calculate_hash( user, topics, filters, searches, search_filters, user_languages ) return articles_hash
def _find_articles_for_user(user): """ This method gets all the topic and search subscriptions for a user. It then returns all the articles that are associated with these. :param user: :return: """ user_languages = Language.all_reading_for_user(user) topic_subscriptions = TopicSubscription.all_for_user(user) search_subscriptions = SearchSubscription.all_for_user(user) subscribed_articles = _filter_subscribed_articles( search_subscriptions, topic_subscriptions, user_languages, user ) return subscribed_articles
def article_search_for_user(user, count, search_terms): """ Handles searching. Find the relational values from the database and use them to search in elasticsearch for relative articles. :param user: :param count: max amount of articles to return :param search_terms: the inputed search string by the user :return: articles """ user_languages = Language.all_reading_for_user(user) per_language_article_count = count / len(user_languages) final_article_mix = [] for language in user_languages: print(f"language: {language}") # 0. Ensure appropriate difficulty declared_level_min, declared_level_max = user.levels_for(language) lower_bounds = declared_level_min * 10 upper_bounds = declared_level_max * 10 # 1. Unwanted user topics # ============================== user_search_filters = SearchFilter.all_for_user(user) unwanted_user_topics = [] for user_search_filter in user_search_filters: unwanted_user_topics.append(user_search_filter.search.keywords) print(f"keywords to exclude: {unwanted_user_topics}") # 2. Topics to exclude / filter out # ================================= excluded_topics = TopicFilter.all_for_user(user) topics_to_exclude = [each.topic.title for each in excluded_topics] print(f"topics to exclude: {topics_to_exclude}") # 3. Topics subscribed, and thus to include # ========================================= topic_subscriptions = TopicSubscription.all_for_user(user) topics_to_include = [ subscription.topic.title for subscription in TopicSubscription.all_for_user(user) ] print(f"topics to include: {topic_subscriptions}") # 4. Wanted user topics # ========================================= user_subscriptions = SearchSubscription.all_for_user(user) wanted_user_topics = [] for sub in user_subscriptions: wanted_user_topics.append(sub.search.keywords) print(f"keywords to include: {wanted_user_topics}") # build the query using elastic_query_builder query_body = build_elastic_query( per_language_article_count, search_terms, _list_to_string(topics_to_include), _list_to_string(topics_to_exclude), _list_to_string(wanted_user_topics), _list_to_string(unwanted_user_topics), language, upper_bounds, lower_bounds, ) es = Elasticsearch(ES_CONN_STRING) res = es.search(index=ES_ZINDEX, body=query_body) hit_list = res["hits"].get("hits") final_article_mix.extend(_to_articles_from_ES_hits(hit_list)) # convert to article_info and return return [ UserArticle.user_article_info(user, article) for article in final_article_mix if article is not None ]