Esempio n. 1
0
    def post(self):
        """Creates a new learner group."""

        title = self.normalized_payload.get('group_title')
        description = self.normalized_payload.get('group_description')
        invited_student_usernames = self.normalized_payload.get(
            'invited_student_usernames')
        subtopic_page_ids = self.normalized_payload.get('subtopic_page_ids')
        story_ids = self.normalized_payload.get('story_ids')

        invited_student_ids = user_services.get_multi_user_ids_from_usernames(
            invited_student_usernames)

        new_learner_grp_id = learner_group_fetchers.get_new_learner_group_id()

        learner_group = learner_group_services.create_learner_group(
            new_learner_grp_id, title, description, [self.user_id],
            invited_student_ids, subtopic_page_ids, story_ids
        )

        self.render_json({
            'id': learner_group.group_id,
            'title': learner_group.title,
            'description': learner_group.description,
            'facilitator_usernames': user_services.get_usernames(
                learner_group.facilitator_user_ids),
            'student_usernames': user_services.get_usernames(
                learner_group.student_user_ids),
            'invited_student_usernames': user_services.get_usernames(
                learner_group.invited_student_user_ids),
            'subtopic_page_ids': learner_group.subtopic_page_ids,
            'story_ids': learner_group.story_ids
        })
Esempio n. 2
0
    def test_searching_a_valid_user_to_invite(self):
        learner_group_services.create_learner_group('groupId', 'Group Title',
                                                    'Group Description',
                                                    [self.owner_id], [],
                                                    ['subtopic1'], [])
        params = {
            'username': self.NEW_USER_USERNAME,
            'learner_group_id': 'groupId'
        }
        response = self.get_json('/learner_group_search_student_handler',
                                 params=params)

        user_settings = user_services.get_user_settings_from_username(
            self.NEW_USER_USERNAME)
        self.assertEqual(response['username'], user_settings.username)
        self.assertEqual(response['profile_picture_data_url'],
                         user_settings.profile_picture_data_url)
        self.assertEqual(response['error'], '')
        self.logout()
Esempio n. 3
0
    def setUp(self) -> None:
        super(LearnerGroupFetchersUnitTests, self).setUp()

        self.LEARNER_GROUP_ID = (
            learner_group_fetchers.get_new_learner_group_id())

        self.learner_group = learner_group_services.create_learner_group(
            self.LEARNER_GROUP_ID, 'Learner Group Name', 'Description',
            [self.FACILITATOR_ID], [self.STUDENT_ID_1, self.STUDENT_ID_2],
            ['subtopic_id_1'], ['story_id_1'])
Esempio n. 4
0
    def test_searching_an_already_invited_user(self):
        learner_group_services.create_learner_group('groupId', 'Group Title',
                                                    'Group Description',
                                                    [self.owner_id],
                                                    [self.new_user_id],
                                                    ['subtopic1'], [])
        params = {
            'username': self.NEW_USER_USERNAME,
            'learner_group_id': 'groupId'
        }
        response = self.get_json('/learner_group_search_student_handler',
                                 params=params)

        self.assertEqual(response['username'], self.NEW_USER_USERNAME)
        self.assertEqual(response['profile_picture_data_url'], '')
        self.assertEqual(
            response['error'],
            'User with username %s has been already invited to join the '
            'group' % self.NEW_USER_USERNAME)
        self.logout()
Esempio n. 5
0
    def setUp(self):
        super(FacilitatorLearnerGroupViewHandlerTests, self).setUp()
        self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME)
        self.signup(self.USER1_EMAIL, self.USER1_USERNAME)
        self.signup(self.USER2_EMAIL, self.USER2_USERNAME)

        self.user_id_1 = self.get_user_id_from_email(self.USER1_EMAIL)
        self.facilitator_id = self.get_user_id_from_email(self.NEW_USER_EMAIL)

        self.LEARNER_GROUP_ID = (
            learner_group_fetchers.get_new_learner_group_id())

        self.learner_group = learner_group_services.create_learner_group(
            self.LEARNER_GROUP_ID, 'Learner Group Title', 'Description',
            [self.facilitator_id], [self.user_id_1], ['subtopic_id_1'],
            ['story_id_1'])
Esempio n. 6
0
    def test_get_teacher_dashboard_view(self):
        self.login(self.NEW_USER_EMAIL)

        # There are no learner groups created by new user yet.
        response = self.get_json('%s' % (feconf.FACILITATOR_DASHBOARD_HANDLER))

        self.assertEqual(response['learner_groups_list'], [])

        # Create a learner group.
        learner_group_id = (learner_group_fetchers.get_new_learner_group_id())

        learner_group = learner_group_services.create_learner_group(
            learner_group_id, 'Learner Group Title', 'Description',
            [self.facilitator_id], [], ['subtopic_id_1'], ['story_id_1'])

        response = self.get_json('%s' % (feconf.FACILITATOR_DASHBOARD_HANDLER))

        self.assertEqual(len(response['learner_groups_list']), 1)
        self.assertEqual(response['learner_groups_list'][0]['id'],
                         learner_group.group_id)

        self.logout()
Esempio n. 7
0
    def setUp(self):
        super(LearnerGroupStudentProgressHandlerTests, self).setUp()
        self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME)
        self.signup(self.CURRICULUM_ADMIN_EMAIL,
                    self.CURRICULUM_ADMIN_USERNAME)
        self.signup(self.STUDENT_1_EMAIL, self.STUDENT_1_USERNAME)
        self.signup(self.STUDENT_2_EMAIL, self.STUDENT_2_USERNAME)

        self.STUDENT_ID_1 = self.get_user_id_from_email(self.STUDENT_1_EMAIL)
        self.STUDENT_ID_2 = self.get_user_id_from_email(self.STUDENT_2_EMAIL)
        self.facilitator_id = self.get_user_id_from_email(self.NEW_USER_EMAIL)
        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.LEARNER_GROUP_ID = (
            learner_group_fetchers.get_new_learner_group_id())

        learner_group_services.create_learner_group(
            self.LEARNER_GROUP_ID, 'Learner Group Name', 'Description',
            [self.facilitator_id], [self.STUDENT_ID_1, self.STUDENT_ID_2],
            [self.SUBTOPIC_PAGE_ID_1], [self.STORY_ID_1])

        # Set up topics, subtopics and stories for learner group syllabus.
        self.save_new_valid_exploration(self.EXP_ID_0,
                                        self.admin_id,
                                        title='Title 1',
                                        end_state_name='End',
                                        correctness_feedback_enabled=True)
        self.save_new_valid_exploration(self.EXP_ID_1,
                                        self.admin_id,
                                        title='Title 2',
                                        end_state_name='End',
                                        correctness_feedback_enabled=True)
        self.save_new_valid_exploration(self.EXP_ID_7,
                                        self.admin_id,
                                        title='Title 3',
                                        end_state_name='End',
                                        correctness_feedback_enabled=True)
        self.publish_exploration(self.admin_id, self.EXP_ID_0)
        self.publish_exploration(self.admin_id, self.EXP_ID_1)
        self.publish_exploration(self.admin_id, self.EXP_ID_7)

        story = story_domain.Story.create_default_story(
            self.STORY_ID_1, 'Title', 'Description', self.TOPIC_ID_1,
            self.STORY_URL_FRAGMENT)
        story.meta_tag_content = 'story meta content'

        exp_summary_dicts = (
            summary_services.get_displayable_exp_summary_dicts_matching_ids(
                [self.EXP_ID_0, self.EXP_ID_1, self.EXP_ID_7],
                user=self.admin))
        self.node_1 = {
            'id':
            self.NODE_ID_1,
            'title':
            'Title 1',
            'description':
            'Description 1',
            'thumbnail_filename':
            'image_1.svg',
            'thumbnail_bg_color':
            constants.ALLOWED_THUMBNAIL_BG_COLORS['chapter'][0],
            'thumbnail_size_in_bytes':
            21131,
            'destination_node_ids': ['node_3'],
            'acquired_skill_ids': [],
            'prerequisite_skill_ids': [],
            'outline':
            '',
            'outline_is_finalized':
            False,
            'exploration_id':
            self.EXP_ID_1,
            'exp_summary_dict':
            exp_summary_dicts[1],
            'completed':
            False
        }
        self.node_2 = {
            'id':
            self.NODE_ID_2,
            'title':
            'Title 2',
            'description':
            'Description 2',
            'thumbnail_filename':
            'image_2.svg',
            'thumbnail_bg_color':
            constants.ALLOWED_THUMBNAIL_BG_COLORS['chapter'][0],
            'thumbnail_size_in_bytes':
            21131,
            'destination_node_ids': ['node_1'],
            'acquired_skill_ids': [],
            'prerequisite_skill_ids': [],
            'outline':
            '',
            'outline_is_finalized':
            False,
            'exploration_id':
            self.EXP_ID_0,
            'exp_summary_dict':
            exp_summary_dicts[0],
            'completed':
            True
        }
        self.node_3 = {
            'id':
            self.NODE_ID_3,
            'title':
            'Title 3',
            'description':
            'Description 3',
            'thumbnail_filename':
            'image_3.svg',
            'thumbnail_bg_color':
            constants.ALLOWED_THUMBNAIL_BG_COLORS['chapter'][0],
            'thumbnail_size_in_bytes':
            21131,
            'destination_node_ids': [],
            'acquired_skill_ids': [],
            'prerequisite_skill_ids': [],
            'outline':
            '',
            'outline_is_finalized':
            False,
            'exploration_id':
            self.EXP_ID_7,
            'exp_summary_dict':
            exp_summary_dicts[2],
            'completed':
            False
        }
        story.story_contents.nodes = [
            story_domain.StoryNode.from_dict(self.node_1),
            story_domain.StoryNode.from_dict(self.node_2),
            story_domain.StoryNode.from_dict(self.node_3)
        ]
        self.nodes = story.story_contents.nodes
        story.story_contents.initial_node_id = 'node_2'
        story.story_contents.next_node_id = 'node_4'
        story_services.save_new_story(self.admin_id, story)
        self.subtopic_1 = topic_domain.Subtopic.create_default_subtopic(
            1, 'Subtopic Title 1', 'sub-one-frag')
        self.subtopic_2 = topic_domain.Subtopic.create_default_subtopic(
            2, 'Subtopic Title 2', 'sub-two-frag')
        self.SKILL_ID_1 = skill_services.get_new_skill_id()
        self.SKILL_ID_2 = skill_services.get_new_skill_id()
        self.subtopic_1.skill_ids = [self.SKILL_ID_1]
        self.subtopic_2.skill_ids = [self.SKILL_ID_2]
        self.save_new_topic(self.TOPIC_ID_1,
                            'user',
                            name='Topic',
                            description='A new topic',
                            canonical_story_ids=[story.id],
                            additional_story_ids=[],
                            uncategorized_skill_ids=[],
                            subtopics=[self.subtopic_1, self.subtopic_2],
                            next_subtopic_id=3)
        topic_services.publish_topic(self.TOPIC_ID_1, self.admin_id)
        topic_services.publish_story(self.TOPIC_ID_1, self.STORY_ID_1,
                                     self.admin_id)

        # Add the invited students to the learner group.
        learner_group_services.add_student_to_learner_group(
            self.LEARNER_GROUP_ID, self.STUDENT_ID_1, True)

        learner_group_services.add_student_to_learner_group(
            self.LEARNER_GROUP_ID, self.STUDENT_ID_2, False)

        # Add some progress for the students.
        story_services.record_completed_node_in_story_context(
            self.STUDENT_ID_1, self.STORY_ID_1, self.NODE_ID_1)
        story_services.record_completed_node_in_story_context(
            self.STUDENT_ID_1, self.STORY_ID_1, self.NODE_ID_2)
        story_services.record_completed_node_in_story_context(
            self.STUDENT_ID_2, self.STORY_ID_1, self.NODE_ID_3)

        self.SKILL_IDS = [self.SKILL_ID_1, self.SKILL_ID_2]
        skill_services.create_user_skill_mastery(self.STUDENT_ID_1,
                                                 self.SKILL_ID_1,
                                                 self.DEGREE_OF_MASTERY_1)
        skill_services.create_user_skill_mastery(self.STUDENT_ID_2,
                                                 self.SKILL_ID_2,
                                                 self.DEGREE_OF_MASTERY_2)
Esempio n. 8
0
    def setUp(self):
        super(LearnerGroupSearchSyllabusHandlerTests, self).setUp()
        self.signup(self.NEW_USER_EMAIL, self.NEW_USER_USERNAME)
        self.signup(self.CURRICULUM_ADMIN_EMAIL,
                    self.CURRICULUM_ADMIN_USERNAME)

        self.facilitator_id = self.get_user_id_from_email(self.NEW_USER_EMAIL)
        self.admin_id = self.get_user_id_from_email(
            self.CURRICULUM_ADMIN_EMAIL)
        self.set_curriculum_admins([self.CURRICULUM_ADMIN_USERNAME])

        self.LEARNER_GROUP_ID = (
            learner_group_fetchers.get_new_learner_group_id())

        learner_group_services.create_learner_group(
            self.LEARNER_GROUP_ID, 'Learner Group Name', 'Description',
            [self.facilitator_id], [self.STUDENT_ID], ['subtopic_id_1'],
            ['story_id_1'])

        # Set up topics, subtopics and stories for learner group syllabus.
        topic = topic_domain.Topic.create_default_topic(
            self.TOPIC_ID_0, '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.next_subtopic_id = 2
        topic.skill_ids_for_diagnostic_test = ['skill_id_1']
        topic_services.save_new_topic(self.admin_id, topic)
        self.save_new_story(self.STORY_ID_0, self.admin_id, self.TOPIC_ID_0,
                            'Story test 0')
        topic_services.add_canonical_story(self.admin_id, self.TOPIC_ID_0,
                                           self.STORY_ID_0)

        # Publish the topic and its stories.
        topic_services.publish_topic(self.TOPIC_ID_0, self.admin_id)
        topic_services.publish_story(self.TOPIC_ID_0, self.STORY_ID_0,
                                     self.admin_id)

        # Create another topic.
        topic = topic_domain.Topic.create_default_topic(
            self.TOPIC_ID_1, 'Negative Numbers', 'abbrev-one', 'description 1',
            'fragm')
        topic.thumbnail_filename = 'thumbnail.svg'
        topic.thumbnail_bg_color = '#C6DCDA'
        topic.subtopics = [
            topic_domain.Subtopic(
                1, 'Intro to negative numbers', ['skill_id_1'], 'image.svg',
                constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131,
                'dummy-subtopic-url-one')
        ]
        topic.next_subtopic_id = 2
        topic.skill_ids_for_diagnostic_test = ['skill_id_1']

        topic_services.save_new_topic(self.admin_id, topic)
        self.save_new_story(self.STORY_ID_1, self.admin_id, self.TOPIC_ID_1,
                            'Story test 1')
        topic_services.add_canonical_story(self.admin_id, self.TOPIC_ID_1,
                                           self.STORY_ID_1)

        # Publish the topic and its stories.
        topic_services.publish_topic(self.TOPIC_ID_1, self.admin_id)
        topic_services.publish_story(self.TOPIC_ID_1, self.STORY_ID_1,
                                     self.admin_id)