Exemple #1
0
    def test_rerun(self, pacing_type, expected_self_paced_value):
        course_run = ToyCourseFactory()
        start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
        end = start + datetime.timedelta(days=30)
        user = UserFactory()
        role = 'instructor'
        run = '3T2017'
        url = reverse('api:v1:course_run-rerun', kwargs={'pk': str(course_run.id)})
        data = {
            'run': run,
            'schedule': {
                'start': serialize_datetime(start),
                'end': serialize_datetime(end),
            },
            'team': [
                {
                    'user': user.username,
                    'role': role,
                }
            ],
            'pacing_type': pacing_type,
        }
        response = self.client.post(url, data, format='json')
        assert response.status_code == 201

        course_run_key = CourseKey.from_string(response.data['id'])
        course_run = modulestore().get_course(course_run_key)
        assert course_run.id.run == run
        assert course_run.self_paced is expected_self_paced_value
        self.assert_course_run_schedule(course_run, start, end)
        self.assert_access_role(course_run, user, role)
        self.assert_course_access_role_count(course_run, 1)
Exemple #2
0
 def test_rerun_duplicate_run(self):
     course_run = ToyCourseFactory()
     url = reverse('api:v1:course_run-rerun', kwargs={'pk': str(course_run.id)})
     data = {
         'run': course_run.id.run,
     }
     response = self.client.post(url, data, format='json')
     assert response.status_code == 400
     assert response.data == {'run': ['Course run {key} already exists'.format(key=course_run.id)]}
Exemple #3
0
 def test_rerun_invalid_number(self):
     course_run = ToyCourseFactory()
     url = reverse('api:v1:course_run-rerun', kwargs={'pk': str(course_run.id)})
     data = {
         'run': '2T2019',
         'number': '!@#$%^&*()',
     }
     response = self.client.post(url, data, format='json')
     assert response.status_code == 400
     assert response.data == {'non_field_errors': [
         'Invalid key supplied. Ensure there are no special characters in the Course Number.'
     ]}
    def test_rerun(self, pacing_type, expected_self_paced_value, number):
        original_course_run = ToyCourseFactory()
        add_organization({
            'name': 'Test Organization',
            'short_name': original_course_run.id.org,
            'description': 'Testing Organization Description',
        })
        start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
        end = start + datetime.timedelta(days=30)
        user = UserFactory()
        role = 'instructor'
        run = '3T2017'
        url = reverse('api:v1:course_run-rerun',
                      kwargs={'pk': str(original_course_run.id)})
        data = {
            'run': run,
            'schedule': {
                'start': serialize_datetime(start),
                'end': serialize_datetime(end),
            },
            'team': [{
                'user': user.username,
                'role': role,
            }],
            'pacing_type': pacing_type,
        }
        # If number is supplied, this should become the course number used in the course run key
        # If not, it should default to the original course run number that the rerun is based on.
        if number:
            data.update({'number': number})
        response = self.client.post(url, data, format='json')
        assert response.status_code == 201

        course_run_key = CourseKey.from_string(response.data['id'])
        course_run = modulestore().get_course(course_run_key)

        assert course_run.id.run == run
        assert course_run.self_paced is expected_self_paced_value

        if number:
            assert course_run.id.course == number
            assert course_run.id.course != original_course_run.id.course
        else:
            assert course_run.id.course == original_course_run.id.course

        self.assert_course_run_schedule(course_run, start, end)
        self.assert_access_role(course_run, user, role)
        self.assert_course_access_role_count(course_run, 1)
        course_orgs = get_course_organizations(course_run_key)
        self.assertEqual(len(course_orgs), 1)
        self.assertEqual(course_orgs[0]['short_name'],
                         original_course_run.id.org)
    def test_permissions_query_load(self):
        """
        Tests that the permissions queries are cached when rendering numerous discussion XBlocks.
        """
        user = UserFactory()
        course = ToyCourseFactory()
        course_key = course.id
        course_usage_key = self.store.make_course_usage_key(course_key)
        discussions = []

        for counter in range(5):
            discussion_id = f'test_discussion_{counter}'
            discussions.append(
                ItemFactory.create(
                    parent_location=course_usage_key,
                    category='discussion',
                    discussion_id=discussion_id,
                    discussion_category='Category discussion',
                    discussion_target='Target Discussion',
                ))

        # 7 queries are required to do first discussion xblock render:
        # * split_modulestore_django_splitmodulestorecourseindex x2
        # * waffle_utils_wafflecourseoverridemodel
        # * waffle_utils_waffleorgoverridemodel
        # * waffle_flag
        # * django_comment_client_role
        # * lms_xblock_xblockasidesconfig
        num_queries = 7
        for discussion in discussions:
            discussion_xblock = get_module_for_descriptor_internal(
                user=user,
                descriptor=discussion,
                student_data=mock.Mock(name='student_data'),
                course_id=course.id,
                track_function=mock.Mock(name='track_function'),
                request_token='request_token',
            )
            with self.assertNumQueries(num_queries):
                fragment = discussion_xblock.render('student_view')

            # Permissions are cached, so only 1  query required for subsequent renders
            # to check the waffle flag
            num_queries = 1

            html = fragment.content
            assert 'data-user-create-comment="false"' in html
            assert 'data-user-create-subcomment="false"' in html
    def test_permissions_query_load(self):
        """
        Tests that the permissions queries are cached when rendering numerous discussion XBlocks.
        """
        user = UserFactory()
        course = ToyCourseFactory()
        course_key = course.id
        course_usage_key = self.store.make_course_usage_key(course_key)
        discussions = []

        for counter in range(5):
            discussion_id = 'test_discussion_{}'.format(counter)
            discussions.append(
                ItemFactory.create(
                    parent_location=course_usage_key,
                    category='discussion',
                    discussion_id=discussion_id,
                    discussion_category='Category discussion',
                    discussion_target='Target Discussion',
                ))

        # 2 queries are required to do first discussion xblock render:
        # * django_comment_client_role
        # * lms_xblock_xblockasidesconfig
        # If the query for roles returned a non-empty result set, there would be
        # an additional query against django_comment_client_permission, but there
        # are no roles associated with this test.
        num_queries = 2
        for discussion in discussions:
            discussion_xblock = get_module_for_descriptor_internal(
                user=user,
                descriptor=discussion,
                student_data=mock.Mock(name='student_data'),
                course_id=course.id,
                track_function=mock.Mock(name='track_function'),
                xqueue_callback_url_prefix=mock.Mock(
                    name='xqueue_callback_url_prefix'),
                request_token='request_token',
            )
            with self.assertNumQueries(num_queries):
                fragment = discussion_xblock.render('student_view')

            # Permissions are cached, so no queries required for subsequent renders
            num_queries = 0

            html = fragment.content
            self.assertIn('data-user-create-comment="false"', html)
            self.assertIn('data-user-create-subcomment="false"', html)