Exemplo n.º 1
0
    def get(self, request, username):
        """
        Returns a list of courses enrolled by user.
        """
        queryset = CourseEnrollment.objects.all()
        course_ids = set(queryset.values_list('course_id', flat=True))
        catalog_course_runs_against_course_keys = get_course_runs(course_ids, request.user)

        enrollments = queryset.filter(
            user__username=username,
            is_active=True
        ).order_by('created').reverse()
        org = request.query_params.get('org', None)

        return Response([
            CourseEnrollmentSerializer(
                enrollment,
                context={
                    "request": request,
                    "catalog_course_run": (
                        catalog_course_runs_against_course_keys[unicode(enrollment.course_id)]
                        if unicode(enrollment.course_id) in catalog_course_runs_against_course_keys else None
                    )
                }
            ).data for enrollment in enrollments
            if enrollment.course_overview and self.is_org(org, enrollment.course_overview.org) and
            is_mobile_available_for_user(request.user, enrollment.course_overview)
        ])
    def handle(self, *args, **options):
        """Execute the command"""
        instructor = self.get_user(options['instructor'])

        course_runs = get_course_runs()
        for course_run in course_runs:
            course_key = CourseKey.from_string(course_run.get('key'))
            fields = {
                "display_name": course_run.get('title')
            }

            try:
                new_course = create_new_course_in_store(
                    ModuleStoreEnum.Type.split,
                    instructor,
                    course_key.org,
                    course_key.course,
                    course_key.run,
                    fields,
                )
                logger.info(u"Created {}".format(text_type(new_course.id)))
            except DuplicateCourseError:
                logger.warning(
                    u"Course already exists for %s, %s, %s. Skipping",
                    course_key.org,
                    course_key.course,
                    course_key.run,
                )
Exemplo n.º 3
0
    def test_config_missing(self):
        """
        Verify that no errors occur if this method is called when catalog config is missing.
        """
        CatalogIntegration.objects.all().delete()

        data = utils.get_course_runs([], self.user)
        self.assertEqual(data, {})
Exemplo n.º 4
0
    def test_course_run_unavailable(self):
        course_key_strings = [self.course_runs[0]["key"], self.course_runs[3]["key"]]
        course_keys = [self.course_key_1, self.course_key_4]
        self.register_catalog_course_run_response(course_key_strings, [self.course_runs[0]])

        course_catalog_data_dict = utils.get_course_runs(course_keys, self.user)
        expected_data = {self.course_runs[0]["key"]: self.course_runs[0]}
        self.assertEqual(expected_data, course_catalog_data_dict)
Exemplo n.º 5
0
    def test_config_missing(self, mock_get_edx_api_data):
        """
        Verify that no errors occur when catalog config is missing.
        """
        CatalogIntegration.objects.all().delete()

        data = get_course_runs()
        self.assertFalse(mock_get_edx_api_data.called)
        self.assertEqual(data, [])
Exemplo n.º 6
0
    def test_config_missing(self, mock_get_edx_api_data):
        """
        Verify that no errors occur when catalog config is missing.
        """
        CatalogIntegration.objects.all().delete()

        data = get_course_runs()
        self.assertFalse(mock_get_edx_api_data.called)
        self.assertEqual(data, [])
Exemplo n.º 7
0
    def test_config_missing(self, mock_get_edx_api_data):
        """
        Verify that no errors occur when catalog config is missing.
        """
        CatalogIntegration.objects.all().delete()
        self.clear_caches()

        data = get_course_runs()
        assert not mock_get_edx_api_data.called
        assert data == []
Exemplo n.º 8
0
    def test_get_course_runs(self, mock_get_edx_api_data):
        """
        Test retrieval of course runs.
        """
        catalog_course_runs = CourseRunFactory.create_batch(10)
        mock_get_edx_api_data.return_value = catalog_course_runs

        data = get_course_runs()
        self.assertTrue(mock_get_edx_api_data.called)
        self.assert_contract(mock_get_edx_api_data.call_args)
        self.assertEqual(data, catalog_course_runs)
Exemplo n.º 9
0
    def test_get_course_runs(self, mock_get_edx_api_data):
        """
        Test retrieval of course runs.
        """
        catalog_course_runs = [CourseRunFactory() for __ in xrange(10)]
        mock_get_edx_api_data.return_value = catalog_course_runs

        data = get_course_runs()
        self.assertTrue(mock_get_edx_api_data.called)
        self.assert_contract(mock_get_edx_api_data.call_args)
        self.assertEqual(data, catalog_course_runs)
Exemplo n.º 10
0
    def test_get_course_runs(self, mock_get_edx_api_data):
        """
        Test retrieval of course runs.
        """
        catalog_course_runs = [CourseRunFactory() for __ in xrange(10)]
        mock_get_edx_api_data.return_value = catalog_course_runs

        data = get_course_runs()
        self.assertTrue(mock_get_edx_api_data.called)
        self.assert_contract(mock_get_edx_api_data.call_args)
        self.assertEqual(data, catalog_course_runs)
Exemplo n.º 11
0
    def test_get_course_runs(self, mock_get_edx_api_data):
        """
        Test retrieval of course runs.
        """
        catalog_course_runs = CourseRunFactory.create_batch(10)
        mock_get_edx_api_data.return_value = catalog_course_runs

        data = get_course_runs()
        self.assertTrue(mock_get_edx_api_data.called)
        self.assert_contract(mock_get_edx_api_data.call_args)
        self.assertEqual(data, catalog_course_runs)
Exemplo n.º 12
0
    def handle(self, *args, **options):
        log.info('[sync_course_runs] Fetching course runs from catalog service.')
        course_runs = get_course_runs()
        course_runs_retrieved, course_runs_found, course_metadata_updated = self.update_course_overviews(course_runs)

        log.info(
            ('[sync_course_runs] course runs retrieved: %d, course runs found in course overview: %d,'
             ' course runs not found in course overview: %d, course overviews metadata updated: %d,'),
            course_runs_retrieved,
            course_runs_found,
            course_runs_retrieved - course_runs_found,
            course_metadata_updated,
        )
Exemplo n.º 13
0
    def test_cached_course_run_data(self):
        course_key_strings = [self.course_runs[0]["key"], self.course_runs[1]["key"]]
        course_keys = [self.course_key_1, self.course_key_2]
        course_cached_keys = [
            "{}{}".format(utils.CatalogCacheUtility.CACHE_KEY_PREFIX, self.course_runs[0]["key"]),
            "{}{}".format(utils.CatalogCacheUtility.CACHE_KEY_PREFIX, self.course_runs[1]["key"]),
        ]
        self.register_catalog_course_run_response(course_key_strings, [self.course_runs[0], self.course_runs[1]])
        expected_data = {
            self.course_runs[0]["key"]: self.course_runs[0],
            self.course_runs[1]["key"]: self.course_runs[1],
        }

        course_catalog_data_dict = utils.get_course_runs(course_keys, self.user)
        self.assertEqual(expected_data, course_catalog_data_dict)
        cached_data = cache.get_many(course_cached_keys)
        self.assertEqual(set(course_cached_keys), set(cached_data.keys()))

        with mock.patch("openedx.core.djangoapps.catalog.utils.get_edx_api_data") as mock_method:
            course_catalog_data_dict = utils.get_course_runs(course_keys, self.user)
            self.assertEqual(0, mock_method.call_count)
            self.assertEqual(expected_data, course_catalog_data_dict)
Exemplo n.º 14
0
    def handle(self, *args, **options):
        log.info('[sync_course_runs] Fetching course runs from catalog service.')
        course_runs = get_course_runs()
        course_runs_retrieved, course_runs_found, course_metadata_updated = self.update_course_overviews(course_runs)

        log.info(
            ('[sync_course_runs] course runs retrieved: %d, course runs found in course overview: %d,'
             ' course runs not found in course overview: %d, course overviews metadata updated: %d,'),
            course_runs_retrieved,
            course_runs_found,
            course_runs_retrieved - course_runs_found,
            course_metadata_updated,
        )
Exemplo n.º 15
0
    def test_service_user_missing(self, mock_log_error, mock_get_edx_api_data):
        """
        Verify that no errors occur when the catalog service user is missing.
        """
        catalog_integration = self.create_catalog_integration(service_username='******')

        data = get_course_runs()
        mock_log_error.any_call(
            'Catalog service user with username [%s] does not exist. Course runs will not be retrieved.',
            catalog_integration.service_username,
        )
        self.assertFalse(mock_get_edx_api_data.called)
        self.assertEqual(data, [])
Exemplo n.º 16
0
    def test_service_user_missing(self, mock_log_error, mock_get_edx_api_data):
        """
        Verify that no errors occur when the catalog service user is missing.
        """
        catalog_integration = self.create_catalog_integration(service_username='******')

        data = get_course_runs()
        mock_log_error.any_call(
            'Catalog service user with username [%s] does not exist. Course runs will not be retrieved.',
            catalog_integration.service_username,
        )
        self.assertFalse(mock_get_edx_api_data.called)
        self.assertEqual(data, [])
Exemplo n.º 17
0
    def test_get_multiple_course_run(self):
        course_key_strings = [self.course_runs[0]["key"], self.course_runs[1]["key"], self.course_runs[2]["key"]]
        course_keys = [self.course_key_1, self.course_key_2, self.course_key_3]
        self.register_catalog_course_run_response(
            course_key_strings, [self.course_runs[0], self.course_runs[1], self.course_runs[2]]
        )

        course_catalog_data_dict = utils.get_course_runs(course_keys, self.user)
        expected_data = {
            self.course_runs[0]["key"]: self.course_runs[0],
            self.course_runs[1]["key"]: self.course_runs[1],
            self.course_runs[2]["key"]: self.course_runs[2],
        }
        self.assertEqual(expected_data, course_catalog_data_dict)
Exemplo n.º 18
0
 def test_course_about_lms_url(self):
     self.register_catalog_course_run_response(self.course_keys, [self.course_run])
     catalog_course_runs_against_course_keys = get_course_runs(self.course_keys, self.request.user)
     enrollment = CourseEnrollment.enrollments_for_user(self.user)[0]
     serialized = CourseEnrollmentSerializer(
         enrollment,
         context={
             'request': self.request,
             "catalog_course_run": (
                 catalog_course_runs_against_course_keys[unicode(enrollment.course_id)]
                 if unicode(enrollment.course_id) in catalog_course_runs_against_course_keys else None
             )
         },
     ).data
     self.assertEqual(
         serialized['course']['course_about'], "http://localhost:8000/courses/{}/about".format(self.course_id_string)
     )
Exemplo n.º 19
0
 def test_course_about_marketing_url(self):
     self.register_catalog_course_run_response(self.course_keys, [self.course_run])
     catalog_course_runs_against_course_keys = get_course_runs(self.course_keys, self.request.user)
     enrollment = CourseEnrollment.enrollments_for_user(self.user)[0]
     serialized = CourseEnrollmentSerializer(
         enrollment,
         context={
             'request': self.request,
             "catalog_course_run": (
                 catalog_course_runs_against_course_keys[unicode(enrollment.course_id)]
                 if unicode(enrollment.course_id) in catalog_course_runs_against_course_keys else None
             )
         },
     ).data
     self.assertEqual(
         serialized['course']['course_about'], self.course_run["marketing_url"]
     )
Exemplo n.º 20
0
    def handle(self, *args, **options):
        log.info(
            '[sync_course_runs] Fetching course runs from catalog service.')
        course_runs = get_course_runs()

        # metrics for observability
        num_runs_found_in_catalog = len(course_runs)
        num_runs_found_in_course_overview = 0
        num_course_overviews_updated = 0

        for course_run in course_runs:
            course_key = CourseKey.from_string(course_run['key'])
            try:
                course_overview = CourseOverview.objects.get(id=course_key)
                num_runs_found_in_course_overview += 1
            except CourseOverview.DoesNotExist:
                log.info(
                    '[sync_course_runs] course overview record not found for course run: %s',
                    str(course_key),
                )
                continue

            is_course_metadata_updated = False
            for field in self.course_run_fields:
                catalog_value = course_run.get(field.catalog_name)
                if getattr(course_overview,
                           field.course_overview_name) != catalog_value:
                    setattr(course_overview, field.course_overview_name,
                            catalog_value)
                    is_course_metadata_updated = True

            if is_course_metadata_updated:
                course_overview.save()
                num_course_overviews_updated += 1

        log.info(
            '[sync_course_runs] '
            'course runs found in catalog: %d, '
            'course runs found in course overview: %d, '
            'course runs not found in course overview: %d, '
            'course overviews updated: %d',
            num_runs_found_in_catalog,
            num_runs_found_in_course_overview,
            num_runs_found_in_catalog - num_runs_found_in_course_overview,
            num_course_overviews_updated,
        )
Exemplo n.º 21
0
    def handle(self, *args, **options):
        log.info('[sync_course_runs] Fetching course runs from catalog service.')
        course_runs = get_course_runs()

        # metrics for observability
        num_runs_found_in_catalog = len(course_runs)
        num_runs_found_in_course_overview = 0
        num_course_overviews_updated = 0

        for course_run in course_runs:
            course_key = CourseKey.from_string(course_run['key'])
            try:
                course_overview = CourseOverview.objects.get(id=course_key)
                num_runs_found_in_course_overview += 1
            except CourseOverview.DoesNotExist:
                log.info(
                    u'[sync_course_runs] course overview record not found for course run: %s',
                    six.text_type(course_key),
                )
                continue

            is_course_metadata_updated = False
            for field in self.course_run_fields:
                catalog_value = course_run.get(field.catalog_name)
                if getattr(course_overview, field.course_overview_name) != catalog_value:
                    setattr(course_overview, field.course_overview_name, catalog_value)
                    is_course_metadata_updated = True

            if is_course_metadata_updated:
                course_overview.save()
                num_course_overviews_updated += 1

        log.info(
            '[sync_course_runs] '
            u'course runs found in catalog: %d, '
            u'course runs found in course overview: %d, '
            u'course runs not found in course overview: %d, '
            u'course overviews updated: %d',
            num_runs_found_in_catalog,
            num_runs_found_in_course_overview,
            num_runs_found_in_catalog - num_runs_found_in_course_overview,
            num_course_overviews_updated,
        )