def get_exploration_opportunity_summary_from_model(model): """Returns the ExplorationOpportunitySummary object out of the model. Args: model: ExplorationOpportunitySummaryModel. The exploration opportunity summary model. Returns: ExplorationOpportunitySummary. The corresponding ExplorationOpportunitySummary object. """ # We're making sure that the audio language codes in any exploration # opportunity domain object match the ones in # constants.SUPPORTED_AUDIO_LANGUAGES. set_of_all_languages = set(model.incomplete_translation_language_codes + model.need_voice_artist_in_language_codes + model.assigned_voice_artist_in_language_codes) supported_language_codes = set( [language['id'] for language in (constants.SUPPORTED_AUDIO_LANGUAGES)]) missing_language_codes = list(supported_language_codes - set_of_all_languages) if missing_language_codes: logging.info( 'Missing language codes %s in exploration opportunity model with ' 'id %s' % (missing_language_codes, model.id)) new_incomplete_translation_language_codes = ( model.incomplete_translation_language_codes + missing_language_codes) return opportunity_domain.ExplorationOpportunitySummary( model.id, model.topic_id, model.topic_name, model.story_id, model.story_title, model.chapter_title, model.content_count, new_incomplete_translation_language_codes, model.translation_counts, model.need_voice_artist_in_language_codes, model.assigned_voice_artist_in_language_codes)
def add_new_exploration_opportunities(story_id, exp_ids): """Adds new exploration opportunity into the model. Args: story_id: str. ID of the story. exp_ids: list(str). A list of exploration ids for which new opportunities are to be created. All exp_ids must be part of the given story. """ story = story_fetchers.get_story_by_id(story_id) topic = topic_fetchers.get_topic_by_id(story.corresponding_topic_id) explorations = exp_fetchers.get_multiple_explorations_by_id(exp_ids) exploration_opportunity_summary_list = [] for exp_id, exploration in explorations.items(): node = story.story_contents.get_node_with_corresponding_exp_id(exp_id) audio_language_codes = set([ language['id'] for language in constants.SUPPORTED_AUDIO_LANGUAGES ]) complete_translation_languages = set( exploration.get_languages_with_complete_translation()) incomplete_translation_language_codes = ( audio_language_codes - complete_translation_languages) need_voice_artist_in_language_codes = complete_translation_languages if exploration.language_code in incomplete_translation_language_codes: # Removing exploration language from incomplete translation # languages list as exploration does not need any translation in # its own language. incomplete_translation_language_codes.discard( exploration.language_code) # Adding exploration language to voiceover required languages # list as exploration can be voiceovered in it's own language. need_voice_artist_in_language_codes.add(exploration.language_code) content_count = exploration.get_content_count() translation_counts = exploration.get_translation_counts() # TODO(#7376): Once the voiceover application functionality is # implemented change this method such that it also populates the # assigned_voice_artist_in_language_codes with the required data. exploration_opportunity_summary = ( opportunity_domain.ExplorationOpportunitySummary( exp_id, topic.id, topic.name, story.id, story.title, node.title, content_count, list(incomplete_translation_language_codes), translation_counts, list(need_voice_artist_in_language_codes), [])) exploration_opportunity_summary_list.append( exploration_opportunity_summary) _save_multi_exploration_opportunity_summary( exploration_opportunity_summary_list)
def _create_exploration_opportunity_summary(topic, story, exploration): """Create an ExplorationOpportunitySummary object with the given topic, story and exploration object. Args: topic: Topic. The topic object to which the opportunity belongs. story: Story. The story object to which the opportunity belongs. exploration: Exploration. The exploration object to which the opportunity belongs. Returns: ExplorationOpportunitySummary. The exploration opportunity summary object. """ audio_language_codes = set( [language['id'] for language in constants.SUPPORTED_AUDIO_LANGUAGES]) complete_translation_languages = set( exploration.get_languages_with_complete_translation()) incomplete_translation_language_codes = (audio_language_codes - complete_translation_languages) language_codes_needing_voice_artists = complete_translation_languages if exploration.language_code in incomplete_translation_language_codes: # Removing exploration language from incomplete translation # languages list as exploration does not need any translation in # its own language. incomplete_translation_language_codes.discard( exploration.language_code) # Adding exploration language to voiceover required languages # list as exploration can be voiceovered in it's own language. language_codes_needing_voice_artists.add(exploration.language_code) content_count = exploration.get_content_count() translation_counts = exploration.get_translation_counts() story_node = story.story_contents.get_node_with_corresponding_exp_id( exploration.id) # TODO(#7376): Once the voiceover application functionality is # implemented change this method such that it also populates the # language_codes_with_assigned_voice_artists with the required data. exploration_opportunity_summary = ( opportunity_domain.ExplorationOpportunitySummary( exploration.id, topic.id, topic.name, story.id, story.title, story_node.title, content_count, list(incomplete_translation_language_codes), translation_counts, list(language_codes_needing_voice_artists), [])) return exploration_opportunity_summary
def _create_exploration_opportunity_summary(topic, story, exploration): """Create an ExplorationOpportunitySummary object with the given topic, story and exploration object. Args: topic: Topic. The topic object to which the opportunity belongs. story: Story. The story object to which the opportunity belongs. exploration: Exploration. The exploration object to which the opportunity belongs. Returns: ExplorationOpportunitySummary. The exploration opportunity summary object. """ # TODO(#13903): Find a way to reduce runtime of computing the complete # languages. complete_translation_language_list = ( exploration.get_languages_with_complete_translation()) # TODO(#13912): Revisit voiceover language logic. language_codes_needing_voice_artists = set( complete_translation_language_list) incomplete_translation_language_codes = ( _compute_exploration_incomplete_translation_languages( complete_translation_language_list)) if exploration.language_code in incomplete_translation_language_codes: # Remove exploration language from incomplete translation languages list # as an exploration does not need a translation in its own language. incomplete_translation_language_codes.remove(exploration.language_code) # Add exploration language to voiceover required languages list as an # exploration can be voiceovered in its own language. language_codes_needing_voice_artists.add(exploration.language_code) content_count = exploration.get_content_count() translation_counts = exploration.get_translation_counts() story_node = story.story_contents.get_node_with_corresponding_exp_id( exploration.id) # TODO(#7376): Once the voiceover application functionality is # implemented change this method such that it also populates the # language_codes_with_assigned_voice_artists with the required data. exploration_opportunity_summary = ( opportunity_domain.ExplorationOpportunitySummary( exploration.id, topic.id, topic.name, story.id, story.title, story_node.title, content_count, incomplete_translation_language_codes, translation_counts, list(language_codes_needing_voice_artists), [], {})) return exploration_opportunity_summary
def get_exploration_opportunity_summary_from_model(model): """Returns the ExplorationOpportunitySummary object out of the model. Args: model: ExplorationOpportunitySummaryModel. The exploration opportunity summary model. Returns: ExplorationOpportunitySummary. The corresponding ExplorationOpportunitySummary object. """ return opportunity_domain.ExplorationOpportunitySummary( model.id, model.topic_id, model.topic_name, model.story_id, model.story_title, model.chapter_title, model.content_count, model.incomplete_translation_language_codes, model.translation_counts, model.need_voice_artist_in_language_codes, model.assigned_voice_artist_in_language_codes)