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 })
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()
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'])
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()
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'])
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()
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)
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)