Exemple #1
0
    def test_skill_which_is_assigned_to_multiple_topics(self):
        skill_id = skill_services.get_new_skill_id()
        self.save_new_skill(skill_id,
                            self.admin_id,
                            description='DescriptionSkill')

        subtopic = topic_domain.Subtopic.create_default_subtopic(
            1, 'Addition', 'addition')
        subtopic.skill_ids = [skill_id]
        topic_id = topic_fetchers.get_new_topic_id()
        self.save_new_topic(topic_id,
                            self.admin_id,
                            name='Maths',
                            abbreviated_name='maths',
                            url_fragment='maths',
                            description='Description',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[subtopic],
                            next_subtopic_id=2)

        subtopic = topic_domain.Subtopic.create_default_subtopic(
            1, 'Chemistry', 'chemistry')
        subtopic.skill_ids = [skill_id]
        topic_id = topic_fetchers.get_new_topic_id()
        self.save_new_topic(topic_id,
                            self.admin_id,
                            name='Science',
                            abbreviated_name='science',
                            url_fragment='science',
                            description='Description',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[subtopic],
                            next_subtopic_id=2)

        url = '%s/%s' % (feconf.SKILL_EDITOR_DATA_URL_PREFIX, skill_id)

        json_response = self.get_json(url)
        self.assertEqual(skill_id, json_response['skill']['id'])
        self.assertEqual(2,
                         len(json_response['assigned_skill_topic_data_dict']))
        self.assertEqual(
            json_response['assigned_skill_topic_data_dict']['Maths'],
            'Addition')
        self.assertEqual(
            json_response['assigned_skill_topic_data_dict']['Science'],
            'Chemistry')
        self.assertEqual(1,
                         len(json_response['grouped_skill_summaries']['Name']))
        self.logout()
    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]
    def test_get(self):
        self.login(self.CURRICULUM_ADMIN_EMAIL)
        skill_id = skill_services.get_new_skill_id()
        self.save_new_skill(
            skill_id, self.admin_id, description='Skill description')

        json_response = self.get_json(
            '%s/%s' % (feconf.UNASSIGN_SKILL_DATA_HANDLER_URL, skill_id))
        self.assertEqual(len(json_response['topic_assignment_dicts']), 0)

        topic_id_1 = topic_fetchers.get_new_topic_id()
        topic_id_2 = topic_fetchers.get_new_topic_id()
        self.save_new_topic(
            topic_id_1, self.admin_id, name='Topic1',
            abbreviated_name='topic-one', url_fragment='topic-one',
            description='Description1', canonical_story_ids=[],
            additional_story_ids=[],
            uncategorized_skill_ids=[skill_id],
            subtopics=[], next_subtopic_id=1)
        subtopic = topic_domain.Subtopic.from_dict({
            'id': 1,
            'title': 'subtopic1',
            'skill_ids': [skill_id],
            'thumbnail_filename': None,
            'thumbnail_bg_color': None,
            'thumbnail_size_in_bytes': None,
            'url_fragment': 'subtopic-url'
        })
        self.save_new_topic(
            topic_id_2, self.admin_id, name='Topic2',
            abbreviated_name='topic-two', url_fragment='topic-two',
            description='Description2', canonical_story_ids=[],
            additional_story_ids=[],
            uncategorized_skill_ids=[],
            subtopics=[subtopic], next_subtopic_id=2)

        json_response = self.get_json(
            '%s/%s' % (feconf.UNASSIGN_SKILL_DATA_HANDLER_URL, skill_id))
        topic_assignment_dicts = sorted(
            json_response['topic_assignment_dicts'],
            key=lambda i: i['topic_name'])

        self.assertEqual(len(topic_assignment_dicts), 2)
        self.assertEqual(topic_assignment_dicts[0]['topic_name'], 'Topic1')
        self.assertEqual(topic_assignment_dicts[0]['topic_id'], topic_id_1)
        self.assertIsNone(topic_assignment_dicts[0]['subtopic_id'])

        self.assertEqual(topic_assignment_dicts[1]['topic_name'], 'Topic2')
        self.assertEqual(topic_assignment_dicts[1]['topic_id'], topic_id_2)
        self.assertEqual(topic_assignment_dicts[1]['subtopic_id'], 1)
Exemple #4
0
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BaseStoryEditorControllerTests, self).setUp()
        self.signup(self.CURRICULUM_ADMIN_EMAIL,
                    self.CURRICULUM_ADMIN_USERNAME)
        self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME)

        self.admin_id = self.get_user_id_from_email(
            self.CURRICULUM_ADMIN_EMAIL)
        self.new_user_id = self.get_user_id_from_email(self.NEW_USER_EMAIL)

        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME])

        self.admin = user_services.get_user_actions_info(self.admin_id)
        self.topic_id = topic_fetchers.get_new_topic_id()
        self.story_id = story_services.get_new_story_id()
        self.save_new_story(self.story_id, self.admin_id, self.topic_id)
        self.save_new_topic(self.topic_id,
                            self.admin_id,
                            name='Name',
                            abbreviated_name='name',
                            url_fragment='name',
                            description='Description',
                            canonical_story_ids=[self.story_id],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[],
                            next_subtopic_id=1)
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BaseSkillEditorControllerTests, self).setUp()
        self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME)
        self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL)
        self.new_user_id = self.get_user_id_from_email(self.NEW_USER_EMAIL)

        self.set_admins([self.ADMIN_USERNAME])

        self.admin = user_services.UserActionsInfo(self.admin_id)
        self.skill_id = skill_services.get_new_skill_id()
        self.save_new_skill(self.skill_id,
                            self.admin_id,
                            description='Description')
        self.skill_id_2 = skill_services.get_new_skill_id()
        self.save_new_skill(self.skill_id_2,
                            self.admin_id,
                            description='Description')
        self.topic_id = topic_fetchers.get_new_topic_id()
        subtopic = topic_domain.Subtopic.create_default_subtopic(
            1, 'Subtopic1')
        subtopic.skill_ids = [self.skill_id]
        self.save_new_topic(self.topic_id,
                            self.admin_id,
                            name='Name',
                            abbreviated_name='name',
                            url_fragment='name',
                            description='Description',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[subtopic],
                            next_subtopic_id=2)
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BaseQuestionsListControllerTests, 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.skill_id = skill_services.get_new_skill_id()
        self.save_new_skill(
            self.skill_id, self.admin_id, description='Skill Description')
        self.skill_id_2 = skill_services.get_new_skill_id()
        self.save_new_skill(
            self.skill_id_2, self.admin_id, description='Skill Description 2')
        self.topic_id = topic_fetchers.get_new_topic_id()
        self.save_new_topic(
            self.topic_id, self.admin_id, name='Name',
            description='Description', canonical_story_ids=[],
            additional_story_ids=[],
            uncategorized_skill_ids=[self.skill_id, self.skill_id_2],
            subtopics=[], next_subtopic_id=1)
        self.skill_id_3 = skill_services.get_new_skill_id()
        changelist = [topic_domain.TopicChange({
            'cmd': topic_domain.CMD_ADD_SUBTOPIC,
            'title': 'Title',
            'subtopic_id': 1
        })]
        topic_services.update_topic_and_subtopic_pages(
            self.admin_id, self.topic_id, changelist, 'Added subtopic.')
Exemple #7
0
    def test_get_topic_by_version(self):
        topic_id = topic_fetchers.get_new_topic_id()
        self.save_new_topic(topic_id,
                            self.user_id,
                            name='topic name',
                            abbreviated_name='topic-name',
                            url_fragment='topic-name',
                            description='Description',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[],
                            next_subtopic_id=1)

        changelist = [
            topic_domain.TopicChange({
                'cmd': topic_domain.CMD_UPDATE_TOPIC_PROPERTY,
                'property_name': topic_domain.TOPIC_PROPERTY_LANGUAGE_CODE,
                'old_value': 'en',
                'new_value': 'bn'
            })
        ]
        topic_services.update_topic_and_subtopic_pages(self.user_id, topic_id,
                                                       changelist,
                                                       'Change language code')

        topic_v0 = topic_fetchers.get_topic_by_id(topic_id, version=0)
        topic_v1 = topic_fetchers.get_topic_by_id(topic_id, version=1)

        self.assertEqual(topic_v1.language_code, 'en')
        self.assertEqual(topic_v0.language_code, 'bn')
    def test_skill_which_is_assigned_to_topic_but_not_subtopic(self):
        skill_id = skill_services.get_new_skill_id()
        self.save_new_skill(skill_id,
                            self.admin_id,
                            description='DescriptionSkill')
        topic_id = topic_fetchers.get_new_topic_id()
        self.save_new_topic(topic_id,
                            self.admin_id,
                            name='TopicName1',
                            abbreviated_name='topicname',
                            url_fragment='topic-one',
                            description='DescriptionTopic',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[skill_id],
                            subtopics=[],
                            next_subtopic_id=1)

        url = '%s/%s' % (feconf.SKILL_EDITOR_DATA_URL_PREFIX, skill_id)

        json_response = self.get_json(url)
        self.assertEqual(skill_id, json_response['skill']['id'])
        self.assertIsNone(
            json_response['assigned_skill_topic_data_dict']['TopicName1'])
        self.assertEqual(1,
                         len(json_response['grouped_skill_summaries']['Name']))
        self.logout()
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BaseTopicsAndSkillsDashboardTests, self).setUp()
        self.signup(self.CURRICULUM_ADMIN_EMAIL, self.CURRICULUM_ADMIN_USERNAME)
        self.signup(self.TOPIC_MANAGER_EMAIL, self.TOPIC_MANAGER_USERNAME)
        self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME)

        self.admin_id = self.get_user_id_from_email(self.CURRICULUM_ADMIN_EMAIL)
        self.topic_manager_id = self.get_user_id_from_email(
            self.TOPIC_MANAGER_EMAIL)
        self.new_user_id = self.get_user_id_from_email(
            self.NEW_USER_EMAIL)
        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME])
        self.topic_id = topic_fetchers.get_new_topic_id()
        self.linked_skill_id = skill_services.get_new_skill_id()
        self.save_new_skill(
            self.linked_skill_id, self.admin_id, description='Description 3')
        self.subtopic_skill_id = skill_services.get_new_skill_id()
        self.save_new_skill(
            self.subtopic_skill_id, self.admin_id, description='Subtopic Skill')

        subtopic = topic_domain.Subtopic.create_default_subtopic(
            1, 'Subtopic Title')
        subtopic.skill_ids = [self.subtopic_skill_id]
        self.save_new_topic(
            self.topic_id, self.admin_id, name='Name',
            abbreviated_name='name', url_fragment='name',
            description='Description', canonical_story_ids=[],
            additional_story_ids=[],
            uncategorized_skill_ids=[self.linked_skill_id],
            subtopics=[subtopic], next_subtopic_id=2)

        self.set_topic_managers([self.TOPIC_MANAGER_USERNAME], self.topic_id)
Exemple #10
0
    def test_editable_skill_handler_delete_when_associated_topics_exist(self):
        self.login(self.CURRICULUM_ADMIN_EMAIL)
        # Check DELETE removes skill from the topic and returns 200 when the
        # skill still has associated topics.
        topic_id = topic_fetchers.get_new_topic_id()
        self.save_new_topic(topic_id,
                            self.admin_id,
                            name='Topic1',
                            abbreviated_name='topic-one',
                            url_fragment='topic-one',
                            description='Description1',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[self.skill_id],
                            subtopics=[],
                            next_subtopic_id=1)

        topic = topic_fetchers.get_topic_by_id(topic_id)
        self.assertTrue(self.skill_id in topic.get_all_skill_ids())

        self.delete_json(self.url, expected_status_int=200)

        topic = topic_fetchers.get_topic_by_id(topic_id)
        self.assertFalse(self.skill_id in topic.get_all_skill_ids())
        self.logout()
Exemple #11
0
    def test_editable_topic_handler_delete(self):
        # Check that admins can delete a topic.
        self.login(self.CURRICULUM_ADMIN_EMAIL)
        self.delete_json(
            '%s/%s' % (
                feconf.TOPIC_EDITOR_DATA_URL_PREFIX, self.topic_id),
            expected_status_int=200)
        self.logout()

        # Check that non-admins cannot delete a topic.
        self.login(self.NEW_USER_EMAIL)
        self.delete_json(
            '%s/%s' % (
                feconf.TOPIC_EDITOR_DATA_URL_PREFIX, self.topic_id),
            expected_status_int=401)
        self.logout()

        # Check that topic can not be deleted when the topic id passed does
        # not have a topic associated with it.
        self.login(self.CURRICULUM_ADMIN_EMAIL)

        self.delete_json(
            '%s/%s' % (
                feconf.TOPIC_EDITOR_DATA_URL_PREFIX,
                topic_fetchers.get_new_topic_id()), expected_status_int=404)

        self.logout()
Exemple #12
0
    def setUp(self):
        super(RegenerateTopicSummaryOneOffJobTests, self).setUp()

        self.signup(self.ALBERT_EMAIL, self.ALBERT_NAME)
        self.albert_id = self.get_user_id_from_email(self.ALBERT_EMAIL)
        self.TOPIC_ID = topic_fetchers.get_new_topic_id()
        self.process_and_flush_pending_mapreduce_tasks()
Exemple #13
0
    def test_story_creation_fails_with_duplicate_story_url_fragment(self):
        self.login(self.CURRICULUM_ADMIN_EMAIL)
        csrf_token = self.get_new_csrf_token()
        payload = {
            'title': 'Story title',
            'description': 'Story Description',
            'filename': 'test_svg.svg',
            'thumbnailBgColor': '#F8BF74',
            'story_url_fragment': 'original'
        }
        self.save_new_story(story_services.get_new_story_id(),
                            self.admin_id,
                            topic_fetchers.get_new_topic_id(),
                            title='title',
                            description='description',
                            notes='note',
                            url_fragment='original')

        with python_utils.open_file(os.path.join(feconf.TESTS_DATA_DIR,
                                                 'test_svg.svg'),
                                    'rb',
                                    encoding=None) as f:
            raw_image = f.read()

        json_response = self.post_json(
            '%s/%s' % (feconf.TOPIC_EDITOR_STORY_URL, self.topic_id),
            payload,
            csrf_token=csrf_token,
            upload_files=(('image', 'unused_filename', raw_image), ),
            expected_status_int=400)

        self.assertEqual(json_response['error'],
                         'Story url fragment is not unique across the site.')
Exemple #14
0
 def test_get_all_skill_ids_assigned_to_some_topic(self):
     change_list = [
         topic_domain.TopicChange({
             'cmd': topic_domain.CMD_MOVE_SKILL_ID_TO_SUBTOPIC,
             'old_subtopic_id': None,
             'new_subtopic_id': 1,
             'skill_id': self.skill_id_1
         })
     ]
     topic_services.update_topic_and_subtopic_pages(
         self.user_id_admin, self.TOPIC_ID, change_list,
         'Moved skill to subtopic.')
     topic_id = topic_fetchers.get_new_topic_id()
     self.save_new_topic(
         topic_id,
         self.user_id,
         name='Name 2',
         description='Description',
         abbreviated_name='random',
         url_fragment='name-three',
         canonical_story_ids=[],
         additional_story_ids=[],
         uncategorized_skill_ids=[self.skill_id_1, 'skill_3'],
         subtopics=[],
         next_subtopic_id=1)
     self.assertEqual(
         topic_fetchers.get_all_skill_ids_assigned_to_some_topic(),
         {self.skill_id_1, self.skill_id_2, 'skill_3'})
Exemple #15
0
 def test_get_topic_by_id(self):
     expected_topic = self.topic.to_dict()
     topic = topic_fetchers.get_topic_by_id(self.TOPIC_ID)
     self.assertEqual(topic.to_dict(), expected_topic)
     fake_topic_id = topic_fetchers.get_new_topic_id()
     fake_topic = topic_fetchers.get_topic_by_id(
         fake_topic_id, strict=False)
     self.assertIsNone(fake_topic)
Exemple #16
0
    def test_get_can_not_access_topic_page_with_nonexistent_topic_id(self):
        self.login(self.CURRICULUM_ADMIN_EMAIL)

        self.get_html_response('%s/%s' % (feconf.TOPIC_EDITOR_URL_PREFIX,
                                          topic_fetchers.get_new_topic_id()),
                               expected_status_int=404)

        self.logout()
Exemple #17
0
    def test_get_can_not_access_handler_with_invalid_topic_id(self):
        self.login(self.CURRICULUM_ADMIN_EMAIL)

        self.get_json('%s/%s/%s' %
                      (feconf.SUBTOPIC_PAGE_EDITOR_DATA_URL_PREFIX,
                       self.topic_id, topic_fetchers.get_new_topic_id()),
                      expected_status_int=404)

        self.logout()
Exemple #18
0
    def test_with_delete_topic_id(self):
        self.login(self.NEW_USER_EMAIL)
        topic_id_1 = topic_fetchers.get_new_topic_id()
        topic_id_2 = topic_fetchers.get_new_topic_id()

        with self.swap_to_always_return(topic_fetchers, 'get_topics_by_ids',
                                        [None, 'random_topic']):
            json_response = self.get_json(
                '%s' % feconf.SUBTOPIC_MASTERY_DATA_URL,
                params={
                    'selected_topic_ids': json.dumps([topic_id_1, topic_id_2])
                },
                expected_status_int=400)

            self.assertEqual(json_response['error'],
                             'Invalid topic ID %s' % topic_id_1)

        self.logout()
Exemple #19
0
    def test_get_can_not_access_handler_with_invalid_topic_id(self):
        self.login(self.CURRICULUM_ADMIN_EMAIL)

        csrf_token = self.get_new_csrf_token()

        new_topic_id = topic_fetchers.get_new_topic_id()
        self.put_json('%s/%s' % (feconf.TOPIC_STATUS_URL_PREFIX, new_topic_id),
                      {'publish_status': True},
                      csrf_token=csrf_token,
                      expected_status_int=404)
Exemple #20
0
    def setUp(self) -> None:
        super(TopicFetchersUnitTests, self).setUp()
        self.TOPIC_ID = topic_fetchers.get_new_topic_id()
        changelist = [
            topic_domain.TopicChange({
                'cmd': topic_domain.CMD_ADD_SUBTOPIC,
                'title': 'Title',
                'subtopic_id': 1,
                'url_fragment': 'sample-fragment'
            })
        ]
        self.save_new_topic(  # type: ignore[no-untyped-call]
            self.TOPIC_ID,
            self.user_id,
            name='Name',
            abbreviated_name='name',
            url_fragment='name-one',
            description='Description',
            canonical_story_ids=[self.story_id_1, self.story_id_2],
            additional_story_ids=[self.story_id_3],
            uncategorized_skill_ids=[self.skill_id_1, self.skill_id_2],
            subtopics=[],
            next_subtopic_id=1)
        self.save_new_story(self.story_id_1, self.user_id,
                            self.TOPIC_ID)  # type: ignore[no-untyped-call]
        self.save_new_story(  # type: ignore[no-untyped-call]
            self.story_id_3,
            self.user_id,
            self.TOPIC_ID,
            title='Title 3',
            description='Description 3')
        self.signup('*****@*****.**', 'A')
        self.signup('*****@*****.**', 'B')
        self.signup(self.CURRICULUM_ADMIN_EMAIL,
                    self.CURRICULUM_ADMIN_USERNAME)

        self.user_id_a = self.get_user_id_from_email(
            '*****@*****.**')  # type: ignore[no-untyped-call]
        self.user_id_b = self.get_user_id_from_email(
            '*****@*****.**')  # type: ignore[no-untyped-call]
        self.user_id_admin = (self.get_user_id_from_email(
            self.CURRICULUM_ADMIN_EMAIL))  # type: ignore[no-untyped-call]
        topic_services.update_topic_and_subtopic_pages(  # type: ignore[no-untyped-call]
            self.user_id_admin, self.TOPIC_ID, changelist, 'Added a subtopic')

        self.topic: Optional[topic_domain.Topic] = (
            topic_fetchers.get_topic_by_id(self.TOPIC_ID))
        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME
                                    ])  # type: ignore[no-untyped-call]
        self.set_topic_managers(  # type: ignore[no-untyped-call]
            [user_services.get_username(self.user_id_a)], self.TOPIC_ID)
        self.user_a = user_services.get_user_actions_info(self.user_id_a)
        self.user_b = user_services.get_user_actions_info(self.user_id_b)
        self.user_admin = user_services.get_user_actions_info(
            self.user_id_admin)
Exemple #21
0
    def setUp(self) -> None:
        super(StoryFetchersUnitTests, self).setUp()
        self.story_id = story_services.get_new_story_id()
        self.TOPIC_ID = topic_fetchers.get_new_topic_id(
        )  # type: ignore[no-untyped-call]
        self.save_new_topic(  # type: ignore[no-untyped-call]
            self.TOPIC_ID,
            self.USER_ID,
            name='Topic',
            description='A new topic',
            canonical_story_ids=[],
            additional_story_ids=[],
            uncategorized_skill_ids=[],
            subtopics=[],
            next_subtopic_id=0)
        self.save_new_story(  # type: ignore[no-untyped-call]
            self.story_id,
            self.USER_ID,
            self.TOPIC_ID,
            url_fragment='story-one')
        topic_services.add_canonical_story(  # type: ignore[no-untyped-call]
            self.USER_ID, self.TOPIC_ID, self.story_id)
        changelist = [
            story_domain.StoryChange({
                'cmd': story_domain.CMD_ADD_STORY_NODE,
                'node_id': self.NODE_ID_1,
                'title': 'Title 1'
            })
        ]
        story_services.update_story(  # type: ignore[no-untyped-call]
            self.USER_ID, self.story_id, changelist, 'Added node.')
        self.story = story_fetchers.get_story_by_id(self.story_id)
        self.signup('*****@*****.**', 'A')
        self.signup('*****@*****.**', 'B')
        self.signup(self.CURRICULUM_ADMIN_EMAIL,
                    self.CURRICULUM_ADMIN_USERNAME)

        self.user_id_a = self.get_user_id_from_email(
            '*****@*****.**')  # type: ignore[no-untyped-call]
        self.user_id_b = self.get_user_id_from_email(
            '*****@*****.**')  # type: ignore[no-untyped-call]
        self.user_id_admin = (self.get_user_id_from_email(
            self.CURRICULUM_ADMIN_EMAIL))  # type: ignore[no-untyped-call]

        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME
                                    ])  # type: ignore[no-untyped-call]
        self.set_topic_managers(  # type: ignore[no-untyped-call]
            [user_services.get_username(self.user_id_a)],
            self.TOPIC_ID)  # type: ignore[no-untyped-call]
        self.user_a = user_services.get_user_actions_info(
            self.user_id_a)  # type: ignore[no-untyped-call]
        self.user_b = user_services.get_user_actions_info(
            self.user_id_b)  # type: ignore[no-untyped-call]
        self.user_admin = user_services.get_user_actions_info(  # type: ignore[no-untyped-call]
            self.user_id_admin)
Exemple #22
0
    def test_can_not_get_topic_rights_when_topic_id_has_no_associated_topic(
            self):
        self.login(self.CURRICULUM_ADMIN_EMAIL)

        json_response = self.get_json('%s/%s' %
                                      (feconf.TOPIC_RIGHTS_URL_PREFIX,
                                       topic_fetchers.get_new_topic_id()),
                                      expected_status_int=400)
        self.assertEqual(json_response['error'],
                         'Expected a valid topic id to be provided.')

        self.logout()
Exemple #23
0
    def test_editable_topic_handler_get(self):
        skill_services.delete_skill(self.admin_id, self.skill_id_2)
        # Check that non-admins cannot access the editable topic data.
        self.login(self.NEW_USER_EMAIL)
        self.get_json(
            '%s/%s' % (
                feconf.TOPIC_EDITOR_DATA_URL_PREFIX, self.topic_id),
            expected_status_int=401)
        self.logout()

        # Check that admins can access the editable topic data.
        self.login(self.CURRICULUM_ADMIN_EMAIL)
        with self.swap(feconf, 'CAN_SEND_EMAILS', True):
            messages = self._get_sent_email_messages(
                feconf.ADMIN_EMAIL_ADDRESS)
            self.assertEqual(len(messages), 0)
            json_response = self.get_json(
                '%s/%s' % (
                    feconf.TOPIC_EDITOR_DATA_URL_PREFIX, self.topic_id))
            self.assertEqual(self.topic_id, json_response['topic_dict']['id'])
            self.assertTrue(
                self.skill_id in json_response['skill_question_count_dict'])
            self.assertEqual(
                json_response['skill_question_count_dict'][self.skill_id], 0)
            self.assertTrue(
                self.skill_id_2 in json_response['skill_question_count_dict'])
            self.assertEqual(
                json_response['skill_question_count_dict'][self.skill_id_2], 0)
            self.assertEqual(
                'Skill Description',
                json_response['skill_id_to_description_dict'][self.skill_id])

            messages = self._get_sent_email_messages(
                feconf.ADMIN_EMAIL_ADDRESS)
            expected_email_html_body = (
                'The deleted skills: %s are still'
                ' present in topic with id %s' % (
                    self.skill_id_2, self.topic_id))
            self.assertEqual(len(messages), 1)
            self.assertIn(expected_email_html_body, messages[0].html)

        self.logout()

        # Check that editable topic handler is accessed only when a topic id
        # passed has an associated topic.
        self.login(self.CURRICULUM_ADMIN_EMAIL)

        self.get_json(
            '%s/%s' % (
                feconf.TOPIC_EDITOR_DATA_URL_PREFIX,
                topic_fetchers.get_new_topic_id()), expected_status_int=404)

        self.logout()
Exemple #24
0
    def setUp(self):
        super(ThreadListHandlerForTopicsHandlerTests, self).setUp()
        self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME)
        self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL)
        self.set_curriculum_admins([self.OWNER_USERNAME])

        self.topic_id = topic_fetchers.get_new_topic_id()
        self.save_new_topic(
            self.topic_id, self.owner_id, name='Name',
            description='Description', canonical_story_ids=[],
            additional_story_ids=[], uncategorized_skill_ids=[],
            subtopics=[], next_subtopic_id=1)
    def post(self):
        """Handles POST requests."""
        name = self.payload.get('name')
        url_fragment = self.payload.get('url_fragment')
        description = self.payload.get('description')
        thumbnail_filename = self.payload.get('filename')
        thumbnail_bg_color = self.payload.get('thumbnailBgColor')
        raw_image = self.request.get('image')
        page_title_frag = self.payload.get('page_title_fragment')

        try:
            topic_domain.Topic.require_valid_name(name)
        except Exception as e:
            raise self.InvalidInputException(
                'Invalid topic name, received %s.' % name) from e
        new_topic_id = topic_fetchers.get_new_topic_id()
        topic = topic_domain.Topic.create_default_topic(
            new_topic_id, name, url_fragment, description, page_title_frag)
        topic_services.save_new_topic(self.user_id, topic)

        try:
            file_format = image_validation_services.validate_image_and_filename(
                raw_image, thumbnail_filename)
        except utils.ValidationError as e:
            raise self.InvalidInputException(e)

        entity_id = new_topic_id
        filename_prefix = 'thumbnail'

        image_is_compressible = (file_format
                                 in feconf.COMPRESSIBLE_IMAGE_FORMATS)
        fs_services.save_original_and_compressed_versions_of_image(
            thumbnail_filename, feconf.ENTITY_TYPE_TOPIC, entity_id, raw_image,
            filename_prefix, image_is_compressible)

        topic_services.update_topic_and_subtopic_pages(
            self.user_id, new_topic_id, [
                topic_domain.TopicChange({
                    'cmd': 'update_topic_property',
                    'property_name': 'thumbnail_filename',
                    'old_value': None,
                    'new_value': thumbnail_filename
                }),
                topic_domain.TopicChange({
                    'cmd': 'update_topic_property',
                    'property_name': 'thumbnail_bg_color',
                    'old_value': None,
                    'new_value': thumbnail_bg_color
                }),
            ], 'Add topic thumbnail.')

        self.render_json({'topicId': new_topic_id})
Exemple #26
0
 def test_get_topic_by_id(self) -> None:
     # Ruling out the possibility of None for mypy type checking.
     assert self.topic is not None
     expected_topic = self.topic.to_dict()
     topic: Optional[topic_domain.Topic] = (topic_fetchers.get_topic_by_id(
         self.TOPIC_ID))
     # Ruling out the possibility of None for mypy type checking.
     assert topic is not None
     self.assertEqual(topic.to_dict(), expected_topic)
     fake_topic_id = topic_fetchers.get_new_topic_id()
     fake_topic: Optional[topic_domain.Topic] = (
         topic_fetchers.get_topic_by_id(fake_topic_id, strict=False))
     self.assertIsNone(fake_topic)
 def setUp(self):
     super(StoryThumbnailSizeAuditOneOffJobTests, self).setUp()
     # Setup user who will own the test story nodes.
     self.signup(self.ALBERT_EMAIL, self.ALBERT_NAME)
     self.albert_id = self.get_user_id_from_email(self.ALBERT_EMAIL)
     self.TOPIC_ID = topic_fetchers.get_new_topic_id()
     self.story_id_1 = 'story_id_1'
     self.save_new_topic(self.TOPIC_ID,
                         self.albert_id,
                         name='Name',
                         description='Description',
                         canonical_story_ids=[self.story_id_1])
     self.process_and_flush_pending_mapreduce_tasks()
Exemple #28
0
 def test_get_classroom_url_fragment_for_topic_id(self):
     topic_id = topic_fetchers.get_new_topic_id()
     config_services.set_property(
         self.user_id_admin, 'classroom_pages_data', [{
             'name': 'math',
             'url_fragment': 'math-one',
             'topic_ids': [topic_id],
             'course_details': '',
             'topic_list_intro': ''
         }])
     classroom_url_fragment = (
         classroom_services.get_classroom_url_fragment_for_topic_id(
             topic_id))
     self.assertEqual(classroom_url_fragment, 'math-one')
Exemple #29
0
 def test_can_get_classroom_by_url_fragment(self):
     topic_id = topic_fetchers.get_new_topic_id()
     config_services.set_property(
         self.user_id_admin, 'classroom_pages_data', [{
             'name': 'math',
             'url_fragment': 'math',
             'topic_ids': [topic_id],
             'course_details': '',
             'topic_list_intro': ''
         }])
     classroom = classroom_services.get_classroom_by_url_fragment('math')
     self.assertEqual(classroom.name, 'math')
     self.assertEqual(classroom.url_fragment, 'math')
     self.assertEqual(classroom.topic_ids, [topic_id])
Exemple #30
0
    def setUp(self):
        """Completes the sign-up process for the various users."""
        super(BaseQuestionEditorControllerTests, self).setUp()
        self.signup(self.TOPIC_MANAGER_EMAIL, self.TOPIC_MANAGER_USERNAME)
        self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME)
        self.signup(self.EDITOR_EMAIL, self.EDITOR_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.topic_manager_id = self.get_user_id_from_email(
            self.TOPIC_MANAGER_EMAIL)
        self.new_user_id = self.get_user_id_from_email(self.NEW_USER_EMAIL)
        self.editor_id = self.get_user_id_from_email(self.EDITOR_EMAIL)

        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME])

        self.topic_id = topic_fetchers.get_new_topic_id()
        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.save_new_topic(self.topic_id,
                            self.admin_id,
                            name='Name',
                            description='Description',
                            canonical_story_ids=[],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[subtopic_1],
                            next_subtopic_id=2)
        self.set_topic_managers([self.TOPIC_MANAGER_USERNAME], self.topic_id)

        self.topic_manager = user_services.get_user_actions_info(
            self.topic_manager_id)
        self.admin = user_services.get_user_actions_info(self.admin_id)
        self.new_user = user_services.get_user_actions_info(self.new_user_id)
        self.editor = user_services.get_user_actions_info(self.editor_id)

        self.skill_id = skill_services.get_new_skill_id()
        self.save_new_skill(self.skill_id,
                            self.admin_id,
                            description='Skill Description')

        self.question_id = question_services.get_new_question_id()
        self.question = self.save_new_question(
            self.question_id, self.editor_id,
            self._create_valid_question_data('ABC'), [self.skill_id])