예제 #1
0
    def test_team_removals_are_scoped_correctly(self):
        """ Team memberships should not search across topics in different courses """
        # Given a learner enrolled in similarly named teamsets across 2 courses
        audit_learner = UserFactory.create(username='******')

        CourseEnrollmentFactory.create(user=audit_learner, course_id=self.course.id, mode='audit')
        course_1_team = CourseTeamFactory(course_id=self.course.id, name='cross_course_test', topic_id='teamset_1')
        course_1_team.add_user(audit_learner)

        CourseEnrollmentFactory.create(user=audit_learner, course_id=self.second_course.id, mode='audit')
        course_2_team = CourseTeamFactory(
            course_id=self.second_course.id,
            name='cross_course_test',
            topic_id='teamset_1'
        )
        course_2_team.add_user(audit_learner)

        self.assertTrue(CourseTeamMembership.is_user_on_team(audit_learner, course_1_team))

        # When I try to remove them from the team
        row = {
            'mode': 'audit',
            'teamset_1': None,
            'user': audit_learner
        }
        self.import_manager.remove_user_from_team_for_reassignment(row)

        # They are successfully removed from the team
        self.assertFalse(CourseTeamMembership.is_user_on_team(audit_learner, course_1_team))
        self.assert_learner_removed_emitted(course_1_team.team_id, audit_learner.id)
예제 #2
0
    def test_switch_memberships(self):
        # Given a bunch of students enrolled in a course
        users = []
        for i in range(5):
            user = UserFactory.create(username='******'.format(id=i))
            CourseEnrollmentFactory.create(user=user, course_id=self.course.id, mode='audit')
            users.append(user)

        # When a team is already at/near capaciy
        for i in range(3):
            user = users[i]
            row = {'user': user, 'teamset_1': 'team_1', 'mode': 'audit'}
            self.import_manager.add_user_to_team(row)

        # ... and I try to switch membership (add/remove)
        csv_data = self._csv_reader_from_array([
            ['user', 'mode', 'teamset_1'],
            ['learner_4', 'audit', 'team_1'],
            ['learner_0', 'audit', 'team_2'],
        ])

        result = self.import_manager.set_team_memberships(csv_data)

        # Then membership size is calculated correctly, import finishes w/out error
        self.assertTrue(result)

        # ... and the users are assigned to the correct teams
        team_1 = CourseTeam.objects.get(course_id=self.course.id, topic_id='teamset_1', name='team_1')
        self.assertTrue(CourseTeamMembership.is_user_on_team(users[4], team_1))
        self.assert_learner_added_emitted(team_1.team_id, users[4].id)

        team_2 = CourseTeam.objects.get(course_id=self.course.id, topic_id='teamset_1', name='team_2')
        self.assertTrue(CourseTeamMembership.is_user_on_team(users[0], team_2))
        self.assert_learner_added_emitted(team_2.team_id, users[0].id)
예제 #3
0
    def test_user_moved_to_another_team(self):
        """ We should be able to move a user from one team to another """
        # Create a learner, enroll in course
        audit_learner = UserFactory.create(username='******')
        CourseEnrollmentFactory.create(user=audit_learner,
                                       course_id=self.course.id,
                                       mode='audit')
        # Make two teams in the same teamset, enroll the user in one
        team_1 = CourseTeamFactory(course_id=self.course.id,
                                   name='test_team_1',
                                   topic_id='teamset_1')
        team_2 = CourseTeamFactory(course_id=self.course.id,
                                   name='test_team_2',
                                   topic_id='teamset_1')
        team_1.add_user(audit_learner)

        csv_row = _csv_dict_row(audit_learner,
                                '',
                                'audit',
                                teamset_1=team_2.name)
        csv_import(self.course, [csv_row])

        assert not CourseTeamMembership.is_user_on_team(audit_learner, team_1)
        assert CourseTeamMembership.is_user_on_team(audit_learner, team_2)

        self.assert_learner_removed_emitted(team_1.team_id, audit_learner.id)
        self.assert_learner_added_emitted(team_2.team_id, audit_learner.id)
예제 #4
0
    def test_add_incompatible_mode_to_existing_protected_team_fails(self):
        # Given an existing protected team
        protected_team = CourseTeamFactory(
            course_id=self.course.id,
            name='protected_team',
            topic_id='teamset_1',
            organization_protected=True,
        )
        masters_learner = self._create_and_enroll_test_user('masters_learner',
                                                            mode='masters')
        protected_team.add_user(masters_learner)

        # When I attempt to add a student of an incompatible enrollment mode
        verified_learner = self._create_and_enroll_test_user(
            'verified_learner', mode='verified')
        csv_data = self._csv_reader_from_array(
            [['username', 'mode', 'teamset_1'],
             [verified_learner.username, 'verified', 'protected_team']])
        result = self.import_manager.set_team_memberships(csv_data)

        # The import fails with "mixed users" error and learner not added to team
        assert not result
        self.assert_no_events_were_emitted()
        assert self.import_manager.validation_errors[0] ==\
               'Team protected_team cannot have Master’s track users mixed with users in other tracks.'
        assert not CourseTeamMembership.is_user_on_team(
            verified_learner, protected_team)
예제 #5
0
    def test_remove_from_team(self):
        # Given a user already in a course and on a team
        user = UserFactory.create(username='******')
        mode = 'audit'
        CourseEnrollmentFactory.create(user=user, course_id=self.course.id, mode=mode)
        team = CourseTeamFactory(course_id=self.course.id, name='team_1', topic_id='teamset_1')
        team.add_user(user)
        self.assertTrue(CourseTeamMembership.is_user_on_team(user, team))

        # When I try to remove them from the team
        csv_data = self._csv_reader_from_array([
            ['user', 'mode', 'teamset_1'],
            [user.username, mode, ''],
        ])
        result = self.import_manager.set_team_memberships(csv_data)

        # Then they are removed from the team and the correct events are issued
        self.assertFalse(CourseTeamMembership.is_user_on_team(user, team))
        self.assert_learner_removed_emitted(team.team_id, user.id)
예제 #6
0
def user_on_team_or_team_is_public(user, team):
    """
    The only users who should be able to see private_managed teams
    or recieve any information about them at all from the API are:
    - Course staff
    - Users who are enrolled in a team in a private_managed teamset
    * They should only be able to see their own team, no other teams.
    """
    if CourseTeamMembership.is_user_on_team(user, team):
        return True
    course_module = modulestore().get_course(team.course_id)
    teamset = course_module.teams_configuration.teamsets_by_id[team.topic_id]
    return teamset.teamset_type != TeamsetType.private_managed
예제 #7
0
    def test_exceed_max_size(self):
        # Given a bunch of students enrolled in a course
        users = []
        for i in range(5):
            user = UserFactory.create(username='******'.format(id=i))
            CourseEnrollmentFactory.create(user=user,
                                           course_id=self.course.id,
                                           mode='audit')
            users.append(user)

        # When a team is already near capaciy
        team = CourseTeam.objects.create(
            name='team_1',
            course_id=self.course.id,
            topic_id='teamset_1',
            description='Team 1!',
        )
        for i in range(2):
            user = users[i]
            team.add_user(user)

        # ... and I try to add members in excess of capacity
        csv_data = self._csv_reader_from_array([
            ['user', 'mode', 'teamset_1'],
            ['max_size_0', 'audit', ''],
            ['max_size_2', 'audit', 'team_1'],
            ['max_size_3', 'audit', 'team_1'],
            ['max_size_4', 'audit', 'team_1'],
        ])

        result = self.import_manager.set_team_memberships(csv_data)

        # Then the import fails with no events emitted and a "team is full" error
        self.assertFalse(result)
        self.assert_no_events_were_emitted()
        self.assertEqual(
            self.import_manager.validation_errors[0],
            'New membership for team team_1 would exceed max size of 3.')

        # Confirm that memberships were not altered
        for i in range(2):
            self.assertTrue(CourseTeamMembership.is_user_on_team(user, team))
예제 #8
0
    def test_create_new_team_from_import(self):
        # Given a user in a course
        user = UserFactory.create(username='******')
        mode = 'audit'
        CourseEnrollmentFactory.create(user=user, course_id=self.course.id, mode=mode)

        # When I add them to a team that does not exist
        self.assertEquals(CourseTeam.objects.all().count(), 0)
        csv_data = self._csv_reader_from_array([
            ['user', 'mode', 'teamset_1'],
            [user.username, mode, 'new_exciting_team'],
        ])
        result = self.import_manager.set_team_memberships(csv_data)

        # Then a new team is created
        self.assertEqual(CourseTeam.objects.all().count(), 1)

        # ... and the user is assigned to the team
        new_team = CourseTeam.objects.get(topic_id='teamset_1', name='new_exciting_team')
        self.assertTrue(CourseTeamMembership.is_user_on_team(user, new_team))
        self.assert_learner_added_emitted(new_team.team_id, user.id)
예제 #9
0
 def assert_user_not_on_team(self, user):
     self.assertFalse(CourseTeamMembership.is_user_on_team(user, self.team))
예제 #10
0
 def assert_user_not_on_team(self, user):
     assert not CourseTeamMembership.is_user_on_team(user, self.team)