diff --git a/openedx/core/djangoapps/course_live/serializers.py b/openedx/core/djangoapps/course_live/serializers.py index 648d3f8d40..b018b7d04b 100644 --- a/openedx/core/djangoapps/course_live/serializers.py +++ b/openedx/core/djangoapps/course_live/serializers.py @@ -32,7 +32,7 @@ class LtiSerializer(serializers.ModelSerializer): """ Validates if lti_config contains all required data i.e. custom_instructor_email """ - additional_parameters = value.get('additional_parameters', None) + additional_parameters = value.get('additional_parameters', {}) custom_instructor_email = additional_parameters.get('custom_instructor_email', None) requires_email = self.context.get('provider').requires_custom_email() @@ -118,9 +118,14 @@ class CourseLiveConfigurationSerializer(serializers.ModelSerializer): self.context['provider_type'] = self.data.get('provider_type', '') def validate_free_tier(self, value): - if value == self.context['provider'].has_free_tier: - return value - raise serializers.ValidationError('Provider does not support free tier') + """ + Validates free_tier attribute + """ + if value: + if value == self.context['provider'].has_free_tier: + return value + raise serializers.ValidationError('Provider does not support free tier') + return value def get_pii_sharing_allowed(self, instance): return self.context['pii_sharing_allowed'] @@ -140,6 +145,8 @@ class CourseLiveConfigurationSerializer(serializers.ModelSerializer): instance = self._update_course_live_instance(instance, validated_data) if not validated_data.get('free_tier', False): instance = self._update_lti(instance, lti_config) + else: + instance.lti_configuration = None instance.save() return instance @@ -151,6 +158,8 @@ class CourseLiveConfigurationSerializer(serializers.ModelSerializer): instance = self._update_course_live_instance(instance, validated_data) if not validated_data.get('free_tier', False): instance = self._update_lti(instance, lti_config) + else: + instance.lti_configuration = None instance.save() return instance diff --git a/openedx/core/djangoapps/course_live/tests/test_views.py b/openedx/core/djangoapps/course_live/tests/test_views.py index 5ec6dc6874..7f9e2e79c0 100644 --- a/openedx/core/djangoapps/course_live/tests/test_views.py +++ b/openedx/core/djangoapps/course_live/tests/test_views.py @@ -63,6 +63,9 @@ class TestCourseLiveConfigurationView(ModuleStoreTestCase, APITestCase): } }, } + if not providers.get(provider).additional_parameters: + lti_config.pop('lti_config') + course_live_config_data = { 'enabled': True, 'provider_type': provider, @@ -125,8 +128,7 @@ class TestCourseLiveConfigurationView(ModuleStoreTestCase, APITestCase): """ lti_config, data, response = self.create_course_live_config(provider) course_live_configurations = CourseLiveConfiguration.get(self.course.id) - lti_configuration = CourseLiveConfiguration.get(self.course.id).lti_configuration - + lti_configuration = course_live_configurations.get(self.course.id).lti_configuration self.assertEqual(self.course.id, course_live_configurations.course_key) self.assertEqual(data['enabled'], course_live_configurations.enabled) self.assertEqual(data['provider_type'], course_live_configurations.provider_type) @@ -134,10 +136,16 @@ class TestCourseLiveConfigurationView(ModuleStoreTestCase, APITestCase): self.assertEqual(lti_config['lti_1p1_client_key'], lti_configuration.lti_1p1_client_key) self.assertEqual(lti_config['lti_1p1_client_secret'], lti_configuration.lti_1p1_client_secret) self.assertEqual(lti_config['lti_1p1_launch_url'], lti_configuration.lti_1p1_launch_url) + + provider_instance = ProviderManager().get_enabled_providers().get(provider) + additional_param = {'additional_parameters': {}} + if provider_instance.additional_parameters: + additional_param = {'additional_parameters': {'custom_instructor_email': 'email@example.com'}} + self.assertEqual({ 'pii_share_username': share_username, 'pii_share_email': share_email, - 'additional_parameters': {'custom_instructor_email': 'email@example.com'} + **additional_param }, lti_configuration.lti_config) self.assertEqual(response.status_code, 200) @@ -149,6 +157,12 @@ class TestCourseLiveConfigurationView(ModuleStoreTestCase, APITestCase): Create and test POST request response data """ lti_config, course_live_config_data, response = self.create_course_live_config(provider) + + provider_instance = ProviderManager().get_enabled_providers().get(provider) + additional_param = {'additional_parameters': {}} + if provider_instance.additional_parameters: + additional_param = {'additional_parameters': {'custom_instructor_email': 'email@example.com'}} + expected_data = { 'course_key': str(self.course.id), 'enabled': True, @@ -163,9 +177,7 @@ class TestCourseLiveConfigurationView(ModuleStoreTestCase, APITestCase): 'lti_config': { 'pii_share_email': share_email, 'pii_share_username': share_username, - 'additional_parameters': { - 'custom_instructor_email': 'email@example.com' - }, + **additional_param }, }, } @@ -198,6 +210,12 @@ class TestCourseLiveConfigurationView(ModuleStoreTestCase, APITestCase): response = self._post(updated_data) content = json.loads(response.content.decode('utf-8')) self.assertEqual(response.status_code, 200) + + provider_instance = ProviderManager().get_enabled_providers().get(provider) + additional_param = {'additional_parameters': {}} + if provider_instance.additional_parameters: + additional_param = {'additional_parameters': {'custom_instructor_email': 'new_email@example.com'}} + expected_data = { 'course_key': str(self.course.id), 'provider_type': provider, @@ -211,10 +229,7 @@ class TestCourseLiveConfigurationView(ModuleStoreTestCase, APITestCase): 'lti_config': { 'pii_share_username': share_username, 'pii_share_email': share_email, - 'additional_parameters': { - 'custom_instructor_email': - 'new_email@example.com' - } + **additional_param } }, 'pii_sharing_allowed': share_email or share_username @@ -271,6 +286,7 @@ class TestCourseLiveConfigurationView(ModuleStoreTestCase, APITestCase): """ Create and test POST request response data """ + self.create_course_live_config() providers = ProviderManager().get_enabled_providers() if providers.get(provider).requires_pii_sharing(): CourseAllowPIISharingInLTIFlag.objects.create(course_id=self.course.id, enabled=True) diff --git a/openedx/core/djangoapps/course_live/views.py b/openedx/core/djangoapps/course_live/views.py index 8cff28b920..d148e93018 100644 --- a/openedx/core/djangoapps/course_live/views.py +++ b/openedx/core/djangoapps/course_live/views.py @@ -120,7 +120,9 @@ class CourseLiveConfigurationView(APIView): "pii_sharing_allowed": pii_sharing_allowed, "message": "PII sharing is not allowed on this course" }) - + if provider and not provider.additional_parameters and request.data.get('lti_configuration', False): + # Add empty lti config if none is provided in case additional params are not required + request.data['lti_configuration']['lti_config'] = {'additional_parameters': {}} configuration = CourseLiveConfiguration.get(course_id) serializer = CourseLiveConfigurationSerializer( configuration,