예제 #1
0
    def test_can_see_topics_to_learn(self):
        self.login(self.VIEWER_EMAIL)

        response = self.get_json(feconf.LEARNER_DASHBOARD_DATA_URL)
        self.assertEqual(len(response['topics_to_learn_list']), 0)

        self.save_new_topic(self.TOPIC_ID_1,
                            self.owner_id,
                            name=self.TOPIC_NAME_1,
                            url_fragment='topic-one',
                            description='A new topic',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[self.subtopic_0],
                            next_subtopic_id=1)
        topic_services.publish_topic(self.TOPIC_ID_1, self.admin_id)
        self.save_new_story(self.STORY_ID_2, self.owner_id, self.TOPIC_ID_1)
        topic_services.add_canonical_story(self.owner_id, self.TOPIC_ID_1,
                                           self.STORY_ID_2)
        topic_services.publish_story(self.TOPIC_ID_1, self.STORY_ID_2,
                                     self.admin_id)

        learner_progress_services.validate_and_add_topic_to_learn_goal(
            self.viewer_id, self.TOPIC_ID_1)
        response = self.get_json(feconf.LEARNER_DASHBOARD_DATA_URL)
        self.assertEqual(len(response['topics_to_learn_list']), 1)
        self.assertEqual(response['topics_to_learn_list'][0]['id'],
                         self.TOPIC_ID_1)
        self.logout()
예제 #2
0
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BasePracticeSessionsControllerTests, self).setUp()
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.set_admins([self.ADMIN_USERNAME])
        self.admin = user_services.UserActionsInfo(self.admin_id)

        self.topic_id = 'topic'
        self.topic_id_1 = 'topic1'
        self.skill_id1 = 'skill_id_1'
        self.skill_id2 = 'skill_id_2'

        self.save_new_skill(self.skill_id1,
                            self.admin_id,
                            description='Skill 1')
        self.save_new_skill(self.skill_id2,
                            self.admin_id,
                            description='Skill 2')

        self.topic = topic_domain.Topic.create_default_topic(
            self.topic_id, 'public_topic_name', 'abbrev')
        self.topic.uncategorized_skill_ids.append(self.skill_id1)
        self.topic.subtopics.append(
            topic_domain.Subtopic(1, 'subtopic_name', [self.skill_id2]))
        self.topic.next_subtopic_id = 2
        topic_services.save_new_topic(self.admin_id, self.topic)

        self.topic = topic_domain.Topic.create_default_topic(
            self.topic_id_1, 'private_topic_name', 'abbrev')
        topic_services.save_new_topic(self.admin_id, self.topic)

        topic_services.publish_topic(self.topic_id, self.admin_id)
예제 #3
0
    def test_get_all_topic_names(self):
        response = self.get_json('/getalltopicnames')
        self.assertEqual(
            response,
            {'topic_names': []}
        )

        topic_id = '0'
        topic = topic_domain.Topic.create_default_topic(
            topic_id, 'topic', 'abbrev', 'description')
        topic.thumbnail_filename = 'thumbnail.svg'
        topic.thumbnail_bg_color = '#C6DCDA'
        topic.subtopics = [
            topic_domain.Subtopic(
                1, 'Title', ['skill_id_3'], 'image.svg',
                constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131,
                'dummy-subtopic-three')]
        topic.next_subtopic_id = 2
        topic_services.save_new_topic(self.owner_id, topic)
        topic_services.publish_topic(topic_id, self.admin_id)

        response = self.get_json('/getalltopicnames')
        self.assertEqual(
            response,
            {'topic_names': ['topic']}
        )
예제 #4
0
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BaseTopicViewerControllerTests, self).setUp()
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.set_admins([self.ADMIN_USERNAME])
        self.admin = user_services.UserActionsInfo(self.admin_id)

        self.topic_id = 'topic'
        self.story_id = 'story'
        self.topic_id_1 = 'topic1'

        self.story = story_domain.Story.create_default_story(
            self.story_id, 'story_title')
        self.story.description = 'story_description'
        story_services.save_new_story(self.admin_id, self.story)

        self.topic = topic_domain.Topic.create_default_topic(
            self.topic_id, 'public_topic_name')
        self.topic.canonical_story_ids.append(self.story_id)
        topic_services.save_new_topic(self.admin_id, self.topic)

        self.topic = topic_domain.Topic.create_default_topic(
            self.topic_id_1, 'private_topic_name')
        topic_services.save_new_topic(self.admin_id, self.topic)

        topic_services.publish_topic(self.topic_id, self.admin_id)
예제 #5
0
    def setUp(self):
        super(VoiceoverApplicationServicesUnitTests, self).setUp()
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME)
        self.signup(self.APPLICANT_EMAIL, self.APPLICANT_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)
        self.applicant_id = self.get_user_id_from_email(self.APPLICANT_EMAIL)

        self.applicant = user_services.UserActionsInfo(self.applicant_id)

        self.set_admins([self.ADMIN_USERNAME])
        self.admin = user_services.UserActionsInfo(self.admin_id)

        self.TOPIC_ID = 'topic'
        self.STORY_ID = 'story'
        self.USER_ID = 'user'
        self.SKILL_ID = 'skill'
        self.QUESTION_ID = question_services.get_new_question_id()
        explorations = [
            self.save_new_valid_exploration('%s' % i,
                                            self.owner_id,
                                            title='title %d' % i,
                                            category='category%d' % i,
                                            end_state_name='End State')
            for i in python_utils.RANGE(2)
        ]

        for exp in explorations:
            self.publish_exploration(self.owner_id, exp.id)

        topic = topic_domain.Topic.create_default_topic(
            self.TOPIC_ID, 'topic', 'abbrev', 'description')
        topic.thumbnail_filename = 'thumbnail.svg'
        topic.thumbnail_bg_color = '#C6DCDA'
        topic_services.save_new_topic(self.owner_id, topic)
        topic_services.publish_topic(self.TOPIC_ID, self.admin_id)

        story = story_domain.Story.create_default_story(
            self.STORY_ID, 'A story', 'Description', self.TOPIC_ID, 'a-story')
        story_services.save_new_story(self.owner_id, story)
        topic_services.add_canonical_story(self.owner_id, self.TOPIC_ID,
                                           self.STORY_ID)
        topic_services.publish_story(self.TOPIC_ID, self.STORY_ID,
                                     self.admin_id)
        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.')
예제 #6
0
    def test_get_published_summaries(self):
        # Unpublished topics should not be returned.
        topic_summaries = topic_fetchers.get_published_topic_summaries()
        self.assertEqual(len(topic_summaries), 0)

        # Publish the topic.
        changelist = [
            topic_domain.TopicChange({
                'cmd': topic_domain.CMD_MOVE_SKILL_ID_TO_SUBTOPIC,
                'old_subtopic_id': None,
                'new_subtopic_id': self.subtopic_id,
                'skill_id': self.skill_id_1
            })
        ]
        topic_services.update_topic_and_subtopic_pages(
            self.user_id_admin, self.TOPIC_ID, changelist,
            'Updated subtopic skill ids.')
        topic_services.publish_topic(self.TOPIC_ID, self.user_id_admin)

        topic_summaries = topic_fetchers.get_published_topic_summaries()

        self.assertEqual(len(topic_summaries), 1)
        self.assertEqual(topic_summaries[0].name, 'Name')
        self.assertEqual(topic_summaries[0].canonical_story_count, 0)
        self.assertEqual(topic_summaries[0].additional_story_count, 0)
        self.assertEqual(topic_summaries[0].total_skill_count, 2)
        self.assertEqual(topic_summaries[0].uncategorized_skill_count, 1)
        self.assertEqual(topic_summaries[0].subtopic_count, 1)
예제 #7
0
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BaseReviewTestsControllerTests, self).setUp()
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME)
        self.signup(self.VIEWER_EMAIL, self.VIEWER_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)
        self.viewer_id = self.get_user_id_from_email(self.VIEWER_EMAIL)

        self.set_admins([self.ADMIN_USERNAME])
        self.admin = user_services.UserActionsInfo(self.admin_id)

        self.topic_id = 'topic_id'
        self.story_id_1 = 'story_id_1'
        self.story_id_2 = 'story_id_2'
        self.story_id_3 = 'story_id_3'
        self.node_id = 'node_1'
        self.node_id_2 = 'node_2'
        self.exp_id = 'exp_id'

        self.save_new_valid_exploration(self.exp_id, self.owner_id)
        self.publish_exploration(self.owner_id, self.exp_id)

        self.node_1 = {
            'id': self.node_id,
            'title': 'Title 1',
            'destination_node_ids': [],
            'acquired_skill_ids': ['skill_id_1', 'skill_id_2'],
            'prerequisite_skill_ids': [],
            'outline': '',
            'outline_is_finalized': False,
            'exploration_id': self.exp_id
        }

        self.save_new_skill('skill_id_1', self.admin_id, 'Skill 1')
        self.save_new_skill('skill_id_2', self.admin_id, 'Skill 2')

        self.story = story_domain.Story.create_default_story(
            self.story_id_1, 'Public Story Title', self.topic_id)
        self.story.story_contents.nodes = [
            story_domain.StoryNode.from_dict(self.node_1)
        ]
        self.story.story_contents.initial_node_id = self.node_id
        self.story.story_contents.next_node_id = self.node_id_2
        story_services.save_new_story(self.admin_id, self.story)

        self.story_2 = story_domain.Story.create_default_story(
            self.story_id_2, 'Private Story Title', self.topic_id)
        story_services.save_new_story(self.admin_id, self.story_2)
        self.save_new_topic(
            self.topic_id, 'user', 'Topic', 'A new topic',
            [self.story_id_1, self.story_id_3], [], [], [], 0)
        topic_services.publish_topic(self.topic_id, self.admin_id)
        topic_services.publish_story(
            self.topic_id, self.story_id_1, self.admin_id)

        self.login(self.VIEWER_EMAIL)
예제 #8
0
    def test_get(self):
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.set_admins([self.ADMIN_USERNAME])

        self.login(self.ADMIN_EMAIL, is_super_admin=True)
        topic_id_1 = topic_services.get_new_topic_id()
        topic_id_2 = topic_services.get_new_topic_id()
        private_topic = topic_domain.Topic.create_default_topic(
            topic_id_1, 'private_topic_name',
            'private-topic-name', 'description')
        topic_services.save_new_topic(admin_id, private_topic)
        public_topic = topic_domain.Topic.create_default_topic(
            topic_id_2, 'public_topic_name',
            'public-topic-name', 'description')
        public_topic.thumbnail_filename = 'Topic.svg'
        public_topic.thumbnail_bg_color = (
            constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0])
        public_topic.subtopics = [
            topic_domain.Subtopic(
                1, 'Title', ['skill_id_1', 'skill_id_2', 'skill_id_3'],
                'image.svg',
                constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0],
                'dummy-subtopic-three')]
        public_topic.next_subtopic_id = 2
        topic_services.save_new_topic(admin_id, public_topic)
        topic_services.publish_topic(topic_id_2, admin_id)

        csrf_token = self.get_new_csrf_token()
        new_config_value = [{
            'name': 'math',
            'topic_ids': [topic_id_1, topic_id_2],
            'course_details': 'Course details for classroom.',
            'topic_list_intro': 'Topics covered for classroom',
            'url_fragment': 'math',
        }]

        payload = {
            'action': 'save_config_properties',
            'new_config_property_values': {
                config_domain.CLASSROOM_PAGES_DATA.name: (
                    new_config_value),
            }
        }
        self.post_json('/adminhandler', payload, csrf_token=csrf_token)
        self.logout()

        json_response = self.get_json(
            '%s/%s' % (feconf.CLASSROOM_DATA_HANDLER, 'math'))
        topic_summary_dict = (
            topic_services.get_topic_summary_by_id(topic_id_2).to_dict())

        expected_dict = {
            'name': 'math',
            'topic_summary_dicts': [topic_summary_dict],
            'course_details': 'Course details for classroom.',
            'topic_list_intro': 'Topics covered for classroom'
        }
        self.assertDictContainsSubset(expected_dict, json_response)
예제 #9
0
    def setUp(self):
        super(OpportunityServicesUnitTest, self).setUp()
        self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME)
        self.signup(self.CURRICULUM_ADMIN_EMAIL, self.CURRICULUM_ADMIN_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.CURRICULUM_ADMIN_EMAIL)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)

        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME])

        self.TOPIC_ID = 'topic'
        self.STORY_ID = 'story'
        explorations = [self.save_new_valid_exploration(
            '%s' % i,
            self.owner_id,
            title='title %d' % i,
            category='category%d' % i,
            end_state_name='End State',
            correctness_feedback_enabled=True
        ) for i in python_utils.RANGE(5)]

        for exp in explorations:
            self.publish_exploration(self.owner_id, exp.id)

        topic = topic_domain.Topic.create_default_topic(
            self.TOPIC_ID, 'topic', 'abbrev', 'description')
        topic.thumbnail_filename = 'thumbnail.svg'
        topic.thumbnail_bg_color = '#C6DCDA'
        topic.subtopics = [
            topic_domain.Subtopic(
                1, 'Title', ['skill_id_1'], 'image.svg',
                constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131,
                'dummy-subtopic-url')]
        topic.next_subtopic_id = 2
        topic_services.save_new_topic(self.owner_id, topic)
        topic_services.publish_topic(self.TOPIC_ID, self.admin_id)

        story = story_domain.Story.create_default_story(
            self.STORY_ID, 'A story', 'Description', self.TOPIC_ID,
            'story-two')
        story_services.save_new_story(self.owner_id, story)
        topic_services.add_canonical_story(
            self.owner_id, self.TOPIC_ID, self.STORY_ID)
        topic_services.publish_story(
            self.TOPIC_ID, self.STORY_ID, self.admin_id)

        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.')
예제 #10
0
    def setUp(self):
        super(TranslatableTextHandlerTest, self).setUp()
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)

        self.set_admins([self.ADMIN_USERNAME])

        explorations = [
            self.save_new_valid_exploration('%s' % i,
                                            self.owner_id,
                                            title='title %d' % i,
                                            category='category%d' % i,
                                            end_state_name='End State')
            for i in python_utils.RANGE(2)
        ]

        for exp in explorations:
            self.publish_exploration(self.owner_id, exp.id)

        topic = topic_domain.Topic.create_default_topic(
            '0', 'topic', 'abbrev', 'description')
        topic.thumbnail_filename = 'thumbnail.svg'
        topic.thumbnail_bg_color = '#C6DCDA'
        topic_services.save_new_topic(self.owner_id, topic)
        topic_services.publish_topic(topic.id, self.admin_id)

        stories = [
            story_domain.Story.create_default_story('%s' % i, 'title %d' % i,
                                                    'description %d' % i, '0',
                                                    'title-%s' % chr(97 + i))
            for i in python_utils.RANGE(2)
        ]

        for index, story in enumerate(stories):
            story.language_code = 'en'
            story_services.save_new_story(self.owner_id, story)
            topic_services.add_canonical_story(self.owner_id, topic.id,
                                               story.id)
            topic_services.publish_story(topic.id, story.id, self.admin_id)
            story_services.update_story(self.owner_id, 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': explorations[index].id
                })
            ], 'Changes.')
예제 #11
0
 def test_get_fails_when_skill_ids_dont_exist(self):
     topic = topic_domain.Topic.create_default_topic(
         'topic_id_3', 'topic_without_skills', 'abbrev')
     topic.uncategorized_skill_ids.append('non_existent_skill')
     topic_services.save_new_topic(self.admin_id, topic)
     topic_services.publish_topic('topic_id_3', self.admin_id)
     with self.swap(constants, 'ENABLE_NEW_STRUCTURE_PLAYERS', True):
         self.get_json('%s/%s' % (feconf.PRACTICE_SESSION_DATA_URL_PREFIX,
                                  'topic_without_skills'),
                       expected_status_int=404)
예제 #12
0
 def test_get_with_meta_tag_content(self):
     self.topic = topic_domain.Topic.create_default_topic(
         self.topic_id, 'topic_with_meta', 'topic-with-meta', 'description')
     self.topic.meta_tag_content = 'meta content'
     topic_services.save_new_topic(self.admin_id, self.topic)
     topic_services.publish_topic(self.topic_id, self.admin_id)
     json_response = self.get_json(
         '%s/staging/%s' % (feconf.TOPIC_DATA_HANDLER, 'topic-with-meta'))
     expected_meta_tag_content = 'meta content'
     self.assertEqual(expected_meta_tag_content,
                      json_response['meta_tag_content'])
예제 #13
0
    def test_cannot_publish_a_published_topic(self):
        topic_rights = topic_services.get_topic_rights(self.TOPIC_ID)
        self.assertFalse(topic_rights.topic_is_published)

        topic_services.publish_topic(self.TOPIC_ID, self.user_id_admin)
        topic_rights = topic_services.get_topic_rights(self.TOPIC_ID)
        self.assertTrue(topic_rights.topic_is_published)

        with self.assertRaisesRegexp(
            Exception, 'The topic is already published.'):
            topic_services.publish_topic(self.TOPIC_ID, self.user_id_admin)
예제 #14
0
 def test_get_with_page_title_fragment_for_web(self):
     self.topic = topic_domain.Topic.create_default_topic(
         self.topic_id, 'topic_with_page_title_fragment_for_web',
         'topic-page-title', 'description', 'topic page title')
     topic_services.save_new_topic(self.admin_id, self.topic)
     topic_services.publish_topic(self.topic_id, self.admin_id)
     json_response = self.get_json(
         '%s/staging/%s' % (feconf.TOPIC_DATA_HANDLER, 'topic-page-title'))
     expected_page_title_fragment_for_web = 'topic page title'
     self.assertEqual(expected_page_title_fragment_for_web,
                      json_response['page_title_fragment_for_web'])
예제 #15
0
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BaseTopicViewerControllerTests, self).setUp()
        self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME)
        self.user_id = self.get_user_id_from_email(self.NEW_USER_EMAIL)
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.set_admins([self.ADMIN_USERNAME])
        self.admin = user_services.UserActionsInfo(self.admin_id)

        self.topic_id = 'topic'
        self.story_id = 'story'
        self.topic_id_1 = 'topic1'
        self.skill_id_1 = skill_services.get_new_skill_id()
        self.skill_id_2 = skill_services.get_new_skill_id()

        self.story = story_domain.Story.create_default_story(
            self.story_id, 'story_title', self.topic_id_1)
        self.story.description = 'story_description'

        self.topic = topic_domain.Topic.create_default_topic(
            self.topic_id, 'public_topic_name', 'abbrev')
        self.topic.uncategorized_skill_ids.append(self.skill_id_1)
        self.topic.subtopics.append(
            topic_domain.Subtopic(1, 'subtopic_name', [self.skill_id_2]))
        self.topic.next_subtopic_id = 2
        self.topic.thumbnail_filename = 'Image.png'
        self.topic.canonical_story_references.append(
            topic_domain.StoryReference.create_default_story_reference(
                self.story_id))
        topic_services.save_new_topic(self.admin_id, self.topic)
        story_services.save_new_story(self.admin_id, self.story)

        self.topic = topic_domain.Topic.create_default_topic(
            self.topic_id_1, 'private_topic_name', 'abbrev')
        self.topic.thumbnail_filename = 'Image.png'
        topic_services.save_new_topic(self.admin_id, self.topic)

        topic_services.publish_topic(self.topic_id, self.admin_id)
        topic_services.publish_story(self.topic_id, self.story_id,
                                     self.admin_id)

        self.save_new_skill(self.skill_id_1,
                            self.user_id,
                            description='Skill Description 1')
        self.save_new_skill(self.skill_id_2,
                            self.user_id,
                            description='Skill Description 2')
        skill_services.create_user_skill_mastery(self.user_id, self.skill_id_1,
                                                 0.3)
        skill_services.create_user_skill_mastery(self.user_id, self.skill_id_2,
                                                 0.5)
예제 #16
0
 def test_get_with_twenty_or_more_questions(self):
     number_of_questions = 50
     self.topic_id = 'new_topic'
     self.skill_id_1 = skill_services.get_new_skill_id()
     self.skill_id_2 = skill_services.get_new_skill_id()
     self.topic = topic_domain.Topic.create_default_topic(
         self.topic_id, 'new_topic', 'new-topic', 'description', 'fragm')
     self.topic.uncategorized_skill_ids.append(self.skill_id_1)
     self.topic.thumbnail_filename = 'Image.svg'
     self.topic.thumbnail_bg_color = (
         constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0])
     self.topic.practice_tab_is_displayed = True
     subtopic_1 = topic_domain.Subtopic.create_default_subtopic(
         1, 'Subtopic Title 1', 'url-frag-one')
     subtopic_1.skill_ids = [self.skill_id_2]
     subtopic_1.url_fragment = 'sub-one-frag'
     self.topic.subtopics = [subtopic_1]
     self.topic.next_subtopic_id = 2
     self.topic.skill_ids_for_diagnostic_test = [self.skill_id_2]
     topic_services.save_new_topic(self.admin_id, self.topic)
     topic_services.publish_topic(self.topic_id, self.admin_id)
     self.save_new_skill(self.skill_id_1,
                         self.admin_id,
                         description='Skill Description 1')
     for index in range(number_of_questions):
         question_id = question_services.get_new_question_id()
         self.save_new_question(question_id, self.admin_id,
                                self._create_valid_question_data(index),
                                [self.skill_id_1])
         question_services.create_new_question_skill_link(
             self.admin_id, question_id, self.skill_id_1, 0.5)
     json_response = self.get_json('%s/staging/%s' %
                                   (feconf.TOPIC_DATA_HANDLER, 'new-topic'))
     expected_dict = {
         'topic_name': 'new_topic',
         'topic_id': self.topic_id,
         'canonical_story_dicts': [],
         'additional_story_dicts': [],
         'uncategorized_skill_ids': [self.skill_id_1],
         'subtopics': [subtopic_1.to_dict()],
         'degrees_of_mastery': {
             self.skill_id_1: None,
             self.skill_id_2: None
         },
         'skill_descriptions': {
             self.skill_id_1: 'Skill Description 1',
             self.skill_id_2: None
         },
         'practice_tab_is_displayed': True
     }
     self.assertDictContainsSubset(expected_dict, json_response)
     self.logout()
예제 #17
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)
예제 #18
0
    def test_get_with_more_questions_with_fifty_or_more_skills(self):
        number_of_skills = 60
        number_of_questions = [0] * 60
        number_of_questions[46] = 2
        number_of_questions[20] = 3
        number_of_questions[29] = 10
        self.topic_id = 'new_topic'
        skill_ids = ([
            skill_services.get_new_skill_id()
            for _ in python_utils.RANGE(number_of_skills)
        ])
        self.topic = topic_domain.Topic.create_default_topic(
            self.topic_id, 'new_topic', 'new-topic', 'description')
        for index in python_utils.RANGE(number_of_skills):
            self.topic.uncategorized_skill_ids.append(skill_ids[index])
        self.topic.thumbnail_filename = 'Image.svg'
        self.topic.thumbnail_bg_color = (
            constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0])
        self.topic.practice_tab_is_displayed = True
        subtopic_1 = topic_domain.Subtopic.create_default_subtopic(
            1, 'Subtopic Title 1')
        subtopic_1.skill_ids = ['skill_id_1']
        subtopic_1.url_fragment = 'sub-one-frag'
        self.topic.subtopics = [subtopic_1]
        self.topic.next_subtopic_id = 2
        topic_services.save_new_topic(self.admin_id, self.topic)
        topic_services.publish_topic(self.topic_id, self.admin_id)
        for i in python_utils.RANGE(number_of_skills):
            self.save_new_skill(skill_ids[i],
                                self.admin_id,
                                description='Skill Description')
        for i in python_utils.RANGE(number_of_skills):
            for j in python_utils.RANGE(number_of_questions[i]):
                question_id = question_services.get_new_question_id()
                self.save_new_question(question_id, self.admin_id,
                                       self._create_valid_question_data(j),
                                       [skill_ids[i]])
                question_services.create_new_question_skill_link(
                    self.admin_id, question_id, skill_ids[i], 0.5)

        json_response = self.get_json('%s/staging/%s' %
                                      (feconf.TOPIC_DATA_HANDLER, 'new-topic'))
        expected_dict = {
            'topic_name': 'new_topic',
            'topic_id': self.topic_id,
            'canonical_story_dicts': [],
            'additional_story_dicts': [],
            'practice_tab_is_displayed': True
        }
        self.assertDictContainsSubset(expected_dict, json_response)
        self.logout()
예제 #19
0
    def setUp(self) -> None:
        super(SubtopicPageServicesUnitTests, self).setUp()
        self.signup(self.CURRICULUM_ADMIN_EMAIL,
                    self.CURRICULUM_ADMIN_USERNAME)
        self.admin_id = self.get_user_id_from_email(  # type: ignore[no-untyped-call]
            self.CURRICULUM_ADMIN_EMAIL)
        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME
                                    ])  # type: ignore[no-untyped-call]

        self.TOPIC_ID = topic_fetchers.get_new_topic_id()

        self.subtopic_page = (
            subtopic_page_domain.SubtopicPage.create_default_subtopic_page(
                self.subtopic_id, self.TOPIC_ID))
        subtopic_page_services.save_subtopic_page(
            self.user_id, self.subtopic_page, 'Added subtopic', [
                topic_domain.TopicChange({
                    'cmd': topic_domain.CMD_ADD_SUBTOPIC,
                    'subtopic_id': 1,
                    'title': 'Sample',
                    'url_fragment': 'sample-fragment'
                })
            ])
        self.subtopic_page_id = (
            subtopic_page_domain.SubtopicPage.get_subtopic_page_id(
                self.TOPIC_ID, 1))

        self.TOPIC_ID_1 = topic_fetchers.get_new_topic_id()
        # Set up topic and subtopic.
        topic = topic_domain.Topic.create_default_topic(
            self.TOPIC_ID_1, 'Place Values', 'abbrev', 'description', 'fragm')
        topic.thumbnail_filename = 'thumbnail.svg'
        topic.thumbnail_bg_color = '#C6DCDA'
        topic.subtopics = [
            topic_domain.Subtopic(
                1, 'Naming Numbers', ['skill_id_1'], 'image.svg',
                constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131,
                'dummy-subtopic-url'),
            topic_domain.Subtopic(
                2, 'Subtopic Name', ['skill_id_2'], 'image.svg',
                constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131,
                'other-subtopic-url')
        ]
        topic.next_subtopic_id = 3
        topic.skill_ids_for_diagnostic_test = ['skill_id_1']
        topic_services.save_new_topic(self.admin_id,
                                      topic)  # type: ignore[no-untyped-call]

        # Publish the topic and its stories.
        topic_services.publish_topic(
            self.TOPIC_ID_1, self.admin_id)  # type: ignore[no-untyped-call]
예제 #20
0
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BasePracticeSessionsControllerTests, self).setUp()
        self.signup(self.CURRICULUM_ADMIN_EMAIL,
                    self.CURRICULUM_ADMIN_USERNAME)
        self.admin_id = self.get_user_id_from_email(
            self.CURRICULUM_ADMIN_EMAIL)
        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME])
        self.admin = user_services.get_user_actions_info(self.admin_id)

        self.topic_id = 'topic'
        self.topic_id_1 = 'topic1'
        self.skill_id1 = 'skill_id_1'
        self.skill_id2 = 'skill_id_2'

        self.save_new_skill(self.skill_id1,
                            self.admin_id,
                            description='Skill 1')
        self.save_new_skill(self.skill_id2,
                            self.admin_id,
                            description='Skill 2')

        self.topic = topic_domain.Topic.create_default_topic(
            self.topic_id, 'public_topic_name', 'public-topic-name',
            'description', 'fragm')
        self.topic.subtopics.append(
            topic_domain.Subtopic(
                1, 'subtopic_name', [self.skill_id1], 'image.svg',
                constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131,
                'subtopic-name-one'))
        self.topic.subtopics.append(
            topic_domain.Subtopic(
                2, 'subtopic_name_2', [self.skill_id2], 'image.svg',
                constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131,
                'subtopic-name-two'))
        self.topic.next_subtopic_id = 3
        self.topic.skill_ids_for_diagnostic_test = [self.skill_id1]
        self.topic.thumbnail_filename = 'Topic.svg'
        self.topic.thumbnail_bg_color = (
            constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0])
        topic_services.save_new_topic(self.admin_id, self.topic)

        self.topic = topic_domain.Topic.create_default_topic(
            self.topic_id_1, 'private_topic_name', 'private-topic-name',
            'description', 'fragm')
        self.topic.thumbnail_filename = 'Topic.svg'
        self.topic.thumbnail_bg_color = (
            constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0])
        topic_services.save_new_topic(self.admin_id, self.topic)

        topic_services.publish_topic(self.topic_id, self.admin_id)
예제 #21
0
    def setUp(self):
        super(OpportunityServicesIntegrationTest, self).setUp()
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)

        self.set_admins([self.ADMIN_USERNAME])
        self.admin = user_services.UserActionsInfo(self.admin_id)

        self.TOPIC_ID = 'topic'
        self.STORY_ID = 'story'
        self.USER_ID = 'user'
        self.SKILL_ID = 'skill'
        self.QUESTION_ID = question_services.get_new_question_id()
        self.THREAD_ID = 'exploration.exp1.thread_1'

        # Since a valid exploration is created here, it has EndExploration
        # state as well, so the content in that has to be taken into account as
        # well when checking content_count in the tests.
        explorations = [
            self.save_new_valid_exploration('%s' % i,
                                            self.owner_id,
                                            title='title %d' % i,
                                            category='category%d' % i,
                                            end_state_name='End State')
            for i in python_utils.RANGE(5)
        ]

        for exp in explorations:
            self.publish_exploration(self.owner_id, exp.id)

        topic = topic_domain.Topic.create_default_topic(
            self.TOPIC_ID, 'topic', 'abbrev', 'description')
        topic.thumbnail_filename = 'thumbnail.svg'
        topic.thumbnail_bg_color = '#C6DCDA'
        topic_services.save_new_topic(self.owner_id, topic)
        topic_services.publish_topic(self.TOPIC_ID, self.admin_id)

        story = story_domain.Story.create_default_story(
            self.STORY_ID, 'A story', 'description', self.TOPIC_ID,
            'story-one')
        story_services.save_new_story(self.owner_id, story)
        topic_services.add_canonical_story(self.owner_id, self.TOPIC_ID,
                                           self.STORY_ID)
        topic_services.publish_story(self.TOPIC_ID, self.STORY_ID,
                                     self.admin_id)
    def setUp(self):
        super(LearnerGoalsTests, self).setUp()
        self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME)
        self.signup(self.VIEWER_EMAIL, self.VIEWER_USERNAME)
        self.signup(self.CURRICULUM_ADMIN_EMAIL,
                    self.CURRICULUM_ADMIN_USERNAME)

        self.viewer_id = self.get_user_id_from_email(self.VIEWER_EMAIL)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)
        self.curriculum_admin_id = self.get_user_id_from_email(
            self.CURRICULUM_ADMIN_EMAIL)
        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME])

        # Save the topics.
        self.save_new_topic(self.TOPIC_ID_1,
                            self.owner_id,
                            name=self.TOPIC_NAME_1,
                            url_fragment='topic-one',
                            description='A new topic',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[self.subtopic_1],
                            next_subtopic_id=1)
        topic_services.publish_topic(self.TOPIC_ID_1, self.curriculum_admin_id)
        self.save_new_topic(self.TOPIC_ID_2,
                            self.owner_id,
                            name=self.TOPIC_NAME_2,
                            url_fragment='topic-two',
                            description='A new topic',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[self.subtopic_2],
                            next_subtopic_id=1)
        topic_services.publish_topic(self.TOPIC_ID_2, self.curriculum_admin_id)
        self.save_new_topic(self.TOPIC_ID_3,
                            self.owner_id,
                            name=self.TOPIC_NAME_3,
                            url_fragment='topic-three',
                            description='A new topic',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[self.subtopic_3],
                            next_subtopic_id=1)
        topic_services.publish_topic(self.TOPIC_ID_3, self.curriculum_admin_id)
        self.save_new_topic(self.TOPIC_ID_4,
                            self.owner_id,
                            name=self.TOPIC_NAME_4,
                            url_fragment='topic-four',
                            description='A new topic',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[self.subtopic_4],
                            next_subtopic_id=1)
        topic_services.publish_topic(self.TOPIC_ID_4, self.curriculum_admin_id)
예제 #23
0
    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)
예제 #24
0
    def test_can_see_all_topics(self):
        self.login(self.CURRICULUM_ADMIN_EMAIL, is_super_admin=True)

        response = self.get_json(
            feconf.LEARNER_DASHBOARD_TOPIC_AND_STORY_DATA_URL)
        self.assertEqual(len(response['all_topics_list']), 0)

        self.save_new_topic(self.TOPIC_ID_1,
                            self.owner_id,
                            name=self.TOPIC_NAME_1,
                            url_fragment='topic-one',
                            description='A new topic',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[self.subtopic_0],
                            next_subtopic_id=1)
        topic_services.publish_topic(self.TOPIC_ID_1, self.admin_id)
        self.save_new_story(self.STORY_ID_2, self.owner_id, self.TOPIC_ID_1)
        topic_services.add_canonical_story(self.owner_id, self.TOPIC_ID_1,
                                           self.STORY_ID_2)
        topic_services.publish_story(self.TOPIC_ID_1, self.STORY_ID_2,
                                     self.admin_id)
        csrf_token = self.get_new_csrf_token()
        new_config_value = [{
            'name': 'math',
            'url_fragment': 'math',
            'topic_ids': [self.TOPIC_ID_1],
            'course_details': '',
            'topic_list_intro': ''
        }]

        payload = {
            'action': 'save_config_properties',
            'new_config_property_values': {
                config_domain.CLASSROOM_PAGES_DATA.name: (new_config_value),
            }
        }
        self.post_json('/adminhandler', payload, csrf_token=csrf_token)
        self.logout()

        self.login(self.VIEWER_EMAIL)
        response = self.get_json(
            feconf.LEARNER_DASHBOARD_TOPIC_AND_STORY_DATA_URL)
        self.assertEqual(len(response['all_topics_list']), 1)
        self.assertEqual(response['all_topics_list'][0]['id'], self.TOPIC_ID_1)
        self.logout()
예제 #25
0
 def test_get_fails_when_skill_ids_dont_exist(self):
     topic = topic_domain.Topic.create_default_topic(
         'topic_id_3', 'topic_without_skills', 'noskills', 'description')
     topic.thumbnail_filename = 'Topic.svg'
     topic.thumbnail_bg_color = (
         constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0])
     topic.subtopics.append(
         topic_domain.Subtopic(
             1, 'subtopic_name', ['non_existent_skill'], 'image.svg',
             constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131,
             'subtopic-name-three'))
     topic.next_subtopic_id = 2
     topic_services.save_new_topic(self.admin_id, topic)
     topic_services.publish_topic('topic_id_3', self.admin_id)
     self.get_json('%s/staging/%s?selected_subtopic_ids=[1]' %
                   (feconf.PRACTICE_SESSION_DATA_URL_PREFIX, 'noskills'),
                   expected_status_int=404)
예제 #26
0
    def put(self, topic_id):
        """Publishes or unpublishes a topic."""
        topic = topic_fetchers.get_topic_by_id(topic_id, strict=False)
        if topic is None:
            raise self.PageNotFoundException

        publish_status = self.normalized_payload.get('publish_status')

        try:
            if publish_status:
                topic_services.publish_topic(topic_id, self.user_id)
            else:
                topic_services.unpublish_topic(topic_id, self.user_id)
        except Exception as e:
            raise self.UnauthorizedUserException(e)

        self.render_json(self.values)
예제 #27
0
    def test_get(self):
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.set_admins([self.ADMIN_USERNAME])

        self.login(self.ADMIN_EMAIL, is_super_admin=True)
        topic_id_1 = topic_services.get_new_topic_id()
        topic_id_2 = topic_services.get_new_topic_id()
        private_topic = topic_domain.Topic.create_default_topic(
            topic_id_1, 'private_topic_name', 'abbrev', 'description')
        topic_services.save_new_topic(admin_id, private_topic)
        public_topic = topic_domain.Topic.create_default_topic(
            topic_id_2, 'public_topic_name', 'abbrev', 'description')
        public_topic.thumbnail_filename = 'Topic.svg'
        public_topic.thumbnail_bg_color = (
            constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0])
        topic_services.save_new_topic(admin_id, public_topic)
        topic_services.publish_topic(topic_id_2, admin_id)

        csrf_token = self.get_new_csrf_token()
        new_config_value = [{
            'name': 'math',
            'topic_ids': [topic_id_1, topic_id_2]
        }]

        payload = {
            'action': 'save_config_properties',
            'new_config_property_values': {
                config_domain.TOPIC_IDS_FOR_CLASSROOM_PAGES.name: (
                    new_config_value),
            }
        }
        self.post_json('/adminhandler', payload, csrf_token=csrf_token)
        self.logout()

        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_PLAYERS', True):
            json_response = self.get_json(
                '%s/%s' % (feconf.CLASSROOM_DATA_HANDLER, 'math'))
            topic_summary_dict = (
                topic_services.get_topic_summary_by_id(topic_id_2).to_dict())

            expected_dict = {
                'topic_summary_dicts': [topic_summary_dict]
            }
            self.assertDictContainsSubset(expected_dict, json_response)
예제 #28
0
    def test_get_with_more_questions_with_fifty_or_more_skills(self):
        number_of_skills = 60
        number_of_questions = [0] * 60
        number_of_questions[46] = 2
        number_of_questions[20] = 3
        number_of_questions[29] = 10
        self.topic_id = 'new_topic'
        skill_ids = ([
            skill_services.get_new_skill_id()
            for _ in python_utils.RANGE(number_of_skills)
        ])
        self.topic = topic_domain.Topic.create_default_topic(
            self.topic_id, 'new_topic', 'new-topic', 'description')
        for index in python_utils.RANGE(number_of_skills):
            self.topic.uncategorized_skill_ids.append(skill_ids[index])
        self.topic.thumbnail_filename = 'Image.svg'
        self.topic.thumbnail_bg_color = (
            constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0])
        topic_services.save_new_topic(self.admin_id, self.topic)
        topic_services.publish_topic(self.topic_id, self.admin_id)
        for i in python_utils.RANGE(number_of_skills):
            self.save_new_skill(skill_ids[i],
                                self.admin_id,
                                description='Skill Description')
        for i in python_utils.RANGE(number_of_skills):
            for j in python_utils.RANGE(number_of_questions[i]):
                question_id = question_services.get_new_question_id()
                self.save_new_question(question_id, self.admin_id,
                                       self._create_valid_question_data(j),
                                       [skill_ids[i]])
                question_services.create_new_question_skill_link(
                    self.admin_id, question_id, skill_ids[i], 0.5)

        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_PLAYERS', True):
            json_response = self.get_json(
                '%s/staging/%s' % (feconf.TOPIC_DATA_HANDLER, 'new-topic'))
            expected_dict = {
                'topic_name': 'new_topic',
                'topic_id': self.topic_id,
                'canonical_story_dicts': [],
                'additional_story_dicts': [],
                'train_tab_should_be_displayed': True
            }
            self.assertDictContainsSubset(expected_dict, json_response)
        self.logout()
예제 #29
0
 def test_get_fails_when_skill_ids_dont_exist(self):
     topic = topic_domain.Topic.create_default_topic(
         'topic_id_3', 'topic_without_skills', 'abbrev')
     topic.thumbnail_filename = 'Topic.svg'
     topic.thumbnail_bg_color = (
         constants.ALLOWED_THUMBNAIL_BG_COLORS['topic'][0])
     topic.subtopics.append(topic_domain.Subtopic(
         1, 'subtopic_name', ['non_existent_skill'], 'image.svg',
         constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0]))
     topic.next_subtopic_id = 2
     topic_services.save_new_topic(self.admin_id, topic)
     topic_services.publish_topic('topic_id_3', self.admin_id)
     with self.swap(constants, 'ENABLE_NEW_STRUCTURE_PLAYERS', True):
         self.get_json(
             '%s/%s?selected_subtopic_ids=1' % (
                 feconf.PRACTICE_SESSION_DATA_URL_PREFIX,
                 'topic_without_skills'),
             expected_status_int=404)
예제 #30
0
    def put(self, topic_id):
        """Publishes or unpublishes a topic."""
        topic_domain.Topic.require_valid_topic_id(topic_id)

        publish_status = self.payload.get('publish_status')

        if not isinstance(publish_status, bool):
            raise self.InvalidInputException(
                'Publish status should only be true or false.')

        try:
            if publish_status:
                topic_services.publish_topic(topic_id, self.user_id)
            else:
                topic_services.unpublish_topic(topic_id, self.user_id)
        except Exception as e:
            raise self.UnauthorizedUserException(e)

        self.render_json(self.values)