def test_opportunity_updates_with_updating_story_node_title(self): self.add_exploration_0_to_story() translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) opportunity = translation_opportunities[0] self.assertEqual(opportunity.chapter_title, 'Node1') story_services.update_story(self.owner_id, self.STORY_ID, [ story_domain.StoryChange({ 'cmd': 'update_story_node_property', 'property_name': 'title', 'node_id': 'node_1', 'old_value': 'Node1', 'new_value': 'A new Node1' }) ], 'Change node title.') translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) opportunity = translation_opportunities[0] self.assertEqual(opportunity.chapter_title, 'A new Node1')
def test_opportunity_get_deleted_with_removing_exploration_from_story_node( self): story_services.update_story( self.owner_id, self.STORY_ID, [story_domain.StoryChange({ 'cmd': 'add_story_node', 'node_id': 'node_1', 'title': 'Node1', }), story_domain.StoryChange({ 'cmd': 'update_story_node_property', 'property_name': 'exploration_id', 'node_id': 'node_1', 'old_value': None, 'new_value': '0' })], 'Changes.') translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) story_services.update_story( self.owner_id, self.STORY_ID, [story_domain.StoryChange({ 'cmd': 'delete_story_node', 'node_id': 'node_1', })], 'Deleted one node.') translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0)
def test_new_opportunity_with_adding_exploration_in_story_node(self): translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0) story_services.update_story(self.owner_id, self.STORY_ID, [ story_domain.StoryChange({ 'cmd': 'add_story_node', 'node_id': 'node_1', 'title': 'Node1', }), story_domain.StoryChange({ 'cmd': 'update_story_node_property', 'property_name': 'exploration_id', 'node_id': 'node_1', 'old_value': None, 'new_value': '0' }) ], 'Changes.') translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) opportunity = translation_opportunities[0] self.assertEqual(opportunity['topic_name'], 'topic') self.assertEqual(opportunity['story_title'], 'A story')
def test_opportunities_updates_with_updating_topic_name(self): self.add_exploration_0_to_story() translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) opportunity = translation_opportunities[0] self.assertEqual(opportunity.story_title, 'A story') self.assertEqual(opportunity.topic_name, 'topic') topic_services.update_topic_and_subtopic_pages( self.owner_id, self.TOPIC_ID, [ topic_domain.TopicChange({ 'cmd': 'update_topic_property', 'property_name': 'name', 'old_value': 'topic', 'new_value': 'A new topic' }) ], 'Change topic title.') translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) opportunity = translation_opportunities[0] self.assertEqual(opportunity.story_title, 'A story') self.assertEqual(opportunity.topic_name, 'A new topic')
def test_regeneration_job_returns_the_initial_opportunity(self): exp_opp_summary_model_regen_job_class = ( opportunity_jobs_one_off. ExplorationOpportunitySummaryModelRegenerationJob) all_opportunity_models = list( opportunity_models.ExplorationOpportunitySummaryModel.get_all()) self.assertEqual(len(all_opportunity_models), 2) old_opportunities, _, more = ( opportunity_services.get_translation_opportunities('hi', None)) job_id = exp_opp_summary_model_regen_job_class.create_new() exp_opp_summary_model_regen_job_class.enqueue(job_id) self.assertEqual( self.count_jobs_in_taskqueue( taskqueue_services.QUEUE_NAME_ONE_OFF_JOBS), 1) self.process_and_flush_pending_tasks() output = exp_opp_summary_model_regen_job_class.get_output(job_id) expected = [['SUCCESS', 2]] self.assertEqual(expected, [ast.literal_eval(x) for x in output]) all_opportunity_models = list( opportunity_models.ExplorationOpportunitySummaryModel.get_all()) self.assertEqual(len(all_opportunity_models), 2) new_opportunities, _, more = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertFalse(more) self.assertEqual(old_opportunities, new_opportunities)
def test_unpublish_topic_deletes_exploration_opportunity(self): self.add_exploration_0_to_story() translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) topic_services.unpublish_topic(self.TOPIC_ID, self.admin_id) translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0)
def test_opportunity_get_deleted_with_deleting_topic(self): self.add_exploration_0_to_story() translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) topic_services.delete_topic(self.owner_id, self.TOPIC_ID) translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0)
def test_publish_topic_creates_exploration_opportunity(self): self.add_exploration_0_to_story() # Topic is already published, so unpublish first. topic_services.unpublish_topic(self.TOPIC_ID, self.admin_id) translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0) topic_services.publish_topic(self.TOPIC_ID, self.admin_id) translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1)
def test_new_opportunity_with_adding_exploration_in_story_node(self): translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0) self.add_exploration_0_to_story() translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) opportunity = translation_opportunities[0] self.assertEqual(opportunity.topic_name, 'topic') self.assertEqual(opportunity.story_title, 'A story')
def test_get_translation_opportunities_with_no_translations_in_review(self): translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0) self.add_exploration_0_to_story() translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) opportunity = translation_opportunities[0] languages_of_translations_in_review = ( opportunity.translation_in_review_counts.keys()) self.assertEqual(len(languages_of_translations_in_review), 0)
def test_get_translation_opportunities_with_translations_in_review(self): translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities( 'hi', 'topic', None)) self.assertEqual(len(translation_opportunities), 0) self.add_exploration_0_to_story() self.create_translation_suggestion_for_exploration_0_and_verify() translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities( 'hi', 'topic', None)) self.assertEqual(len(translation_opportunities), 1) opportunity = translation_opportunities[0] self.assertEqual(opportunity.translation_in_review_counts, {'hi': 1})
def get(self, opportunity_type): """Handles GET requests.""" if not feconf.COMMUNITY_DASHBOARD_ENABLED: raise self.PageNotFoundException search_cursor = self.request.get('cursor', None) if opportunity_type == constants.OPPORTUNITY_TYPE_TRANSLATION: language_code = self.request.get('language_code') if language_code is None or not ( utils.is_supported_audio_language_code(language_code)): raise self.InvalidInputException opportunities, next_cursor, more = ( opportunity_services.get_translation_opportunities( language_code, search_cursor)) elif opportunity_type == constants.OPPORTUNITY_TYPE_VOICEOVER: language_code = self.request.get('language_code') if language_code is None or not ( utils.is_supported_audio_language_code(language_code)): raise self.InvalidInputException opportunities, next_cursor, more = ( opportunity_services.get_voiceover_opportunities( language_code, search_cursor)) else: raise self.PageNotFoundException self.values = { 'opportunities': opportunities, 'next_cursor': next_cursor, 'more': more } self.render_json(self.values)
def test_publish_topic_does_not_create_exploration_opportunity_if_story_is_not_published( # pylint: disable=line-too-long self): self.add_exploration_0_to_story() # Story and topic are already published, so unpublish first. topic_services.unpublish_story(self.TOPIC_ID, self.STORY_ID, self.admin_id) topic_services.unpublish_topic(self.TOPIC_ID, self.admin_id) translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0) topic_services.publish_topic(self.TOPIC_ID, self.admin_id) translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0)
def _get_translation_opportunity_dicts( self, language_code, topic_name, search_cursor): """Returns a list of translation opportunity dicts. Args: language_code: str. The language for which translation opportunities should be fetched. topic_name: str or None. The topic for which translation opportunities should be fetched. If topic_name is None or empty, fetch translation opportunities from all topics. search_cursor: str or None. If provided, the list of returned entities starts from this datastore cursor. Otherwise, the returned entities start from the beginning of the full list of entities. Returns: 3-tuple(opportunities, cursor, more). where: opportunities: list(dict). A list of ExplorationOpportunitySummary dicts. cursor: str or None. A query cursor pointing to the next batch of results. If there are no more results, this might be None. more: bool. If True, there are (probably) more results after this batch. If False, there are no further results after this batch. """ opportunities, next_cursor, more = ( opportunity_services.get_translation_opportunities( language_code, topic_name, search_cursor)) opportunity_dicts = [opp.to_dict() for opp in opportunities] return opportunity_dicts, next_cursor, more
def test_opportunity_get_deleted_with_removing_exploration_from_story_node( self): self.add_exploration_0_to_story() translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) story_services.update_story( self.owner_id, self.STORY_ID, [story_domain.StoryChange({ 'cmd': 'delete_story_node', 'node_id': 'node_1', })], 'Deleted one node.') translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0)
def test_opportunities_updates_with_updating_topic_name(self): story_services.update_story(self.owner_id, self.STORY_ID, [ story_domain.StoryChange({ 'cmd': 'add_story_node', 'node_id': 'node_1', 'title': 'Node1', }), story_domain.StoryChange({ 'cmd': 'update_story_node_property', 'property_name': 'exploration_id', 'node_id': 'node_1', 'old_value': None, 'new_value': '0' }) ], 'Changes.') translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) opportunity = translation_opportunities[0] self.assertEqual(opportunity['story_title'], 'A story') self.assertEqual(opportunity['topic_name'], 'topic') topic_services.update_topic_and_subtopic_pages( self.owner_id, self.TOPIC_ID, [ topic_domain.TopicChange({ 'cmd': 'update_topic_property', 'property_name': 'name', 'old_value': 'topic', 'new_value': 'A new topic' }) ], 'Change topic title.') translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) opportunity = translation_opportunities[0] self.assertEqual(opportunity['story_title'], 'A story') self.assertEqual(opportunity['topic_name'], 'A new topic')
def test_completing_translation_removes_language_from_incomplete_language_codes( # pylint: disable=line-too-long self): story_services.update_story(self.owner_id, self.STORY_ID, [ story_domain.StoryChange({ 'cmd': 'add_story_node', 'node_id': 'node_1', 'title': 'Node1', }), story_domain.StoryChange({ 'cmd': 'update_story_node_property', 'property_name': 'exploration_id', 'node_id': 'node_1', 'old_value': None, 'new_value': '0' }) ], 'Changes.') translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) change_list = [ exp_domain.ExplorationChange({ 'cmd': exp_domain.CMD_EDIT_STATE_PROPERTY, 'state_name': 'Introduction', 'property_name': 'content', 'new_value': { 'html': '<p><strong>Test content</strong></p>', 'content_id': 'content', } }), exp_domain.ExplorationChange({ 'cmd': exp_domain.CMD_ADD_TRANSLATION, 'state_name': 'Introduction', 'content_id': 'content', 'language_code': 'hi', 'content_html': '<p><strong>Test content</strong></p>', 'translation_html': '<p>Translated text</p>' }), exp_domain.ExplorationChange({ 'cmd': exp_domain.CMD_EDIT_STATE_PROPERTY, 'state_name': 'End State', 'property_name': 'content', 'new_value': { 'html': '<p><strong>Test content</strong></p>', 'content_id': 'content', } }), exp_domain.ExplorationChange({ 'cmd': exp_domain.CMD_ADD_TRANSLATION, 'state_name': 'End State', 'content_id': 'content', 'language_code': 'hi', 'content_html': '<p><strong>Test content</strong></p>', 'translation_html': '<p>Translated text</p>' }), ] exp_services.update_exploration(self.owner_id, '0', change_list, 'commit message') # get_translation_opportunities should no longer return the opportunity # after translation completion. translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 0)
def test_opportunity_updates_with_updating_exploration(self): self.add_exploration_0_to_story() translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) self.assertEqual(translation_opportunities[0].content_count, 2) answer_group_dict = { 'outcome': { 'dest': 'Introduction', 'feedback': { 'content_id': 'feedback_1', 'html': '<p>Feedback</p>' }, 'labelled_as_correct': False, 'param_changes': [], 'refresher_exploration_id': None, 'missing_prerequisite_skill_id': None }, 'rule_specs': [{ 'inputs': { 'x': 'Test' }, 'rule_type': 'Contains' }], 'training_data': [], 'tagged_skill_misconception_id': None } hints_list = [] hints_list.append({ 'hint_content': { 'content_id': 'hint_1', 'html': '<p>hint one</p>' }, }) solution_dict = { 'answer_is_exclusive': False, 'correct_answer': 'helloworld!', 'explanation': { 'content_id': 'solution', 'html': '<p>hello_world is a string</p>' }, } exp_services.update_exploration(self.owner_id, '0', [ exp_domain.ExplorationChange({ 'cmd': exp_domain.CMD_EDIT_STATE_PROPERTY, 'property_name': exp_domain.STATE_PROPERTY_INTERACTION_ID, 'state_name': 'Introduction', 'new_value': 'TextInput' }), exp_domain.ExplorationChange({ 'cmd': exp_domain.CMD_EDIT_STATE_PROPERTY, 'property_name': exp_domain.STATE_PROPERTY_INTERACTION_CUST_ARGS, 'state_name': 'Introduction', 'new_value': { 'placeholder': { 'value': { 'content_id': 'ca_placeholder_0', 'unicode_str': '' } }, 'rows': { 'value': 1 } } }), exp_domain.ExplorationChange({ 'cmd': exp_domain.CMD_EDIT_STATE_PROPERTY, 'property_name': (exp_domain.STATE_PROPERTY_INTERACTION_ANSWER_GROUPS), 'state_name': 'Introduction', 'new_value': [answer_group_dict] }), exp_domain.ExplorationChange({ 'cmd': exp_domain.CMD_EDIT_STATE_PROPERTY, 'property_name': (exp_domain.STATE_PROPERTY_INTERACTION_HINTS), 'state_name': 'Introduction', 'new_value': hints_list }), exp_domain.ExplorationChange({ 'cmd': exp_domain.CMD_EDIT_STATE_PROPERTY, 'property_name': (exp_domain.STATE_PROPERTY_INTERACTION_SOLUTION), 'state_name': 'Introduction', 'new_value': solution_dict }) ], 'Add state name') translation_opportunities, _, _ = ( opportunity_services.get_translation_opportunities('hi', None)) self.assertEqual(len(translation_opportunities), 1) self.assertEqual(translation_opportunities[0].content_count, 5)