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, )
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, {})
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)
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, [])
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, [])
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 == []
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)
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)
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)
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)
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, )
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)
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, )
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, [])
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, [])
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)
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) )
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"] )
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, )
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, )