From 51b2b89bcd684527bd8f2bb48d2f78e28c315c68 Mon Sep 17 00:00:00 2001 From: =Awais Jibran Date: Fri, 10 Dec 2021 16:50:20 +0500 Subject: [PATCH] fix: add is_configured property --- lms/djangoapps/learner_dashboard/programs.py | 15 ++++++----- .../learner_dashboard/tests/test_views.py | 25 ++++++++++++++++++- lms/djangoapps/learner_dashboard/views.py | 24 ++++++++---------- openedx/core/djangoapps/discussions/models.py | 14 ++++------- 4 files changed, 46 insertions(+), 32 deletions(-) diff --git a/lms/djangoapps/learner_dashboard/programs.py b/lms/djangoapps/learner_dashboard/programs.py index 71485db581..cbfcd3fe62 100644 --- a/lms/djangoapps/learner_dashboard/programs.py +++ b/lms/djangoapps/learner_dashboard/programs.py @@ -151,7 +151,7 @@ class ProgramDetailsFragmentView(EdxFragmentView): 'credit_pathways': credit_pathways, 'program_tab_view_enabled': program_tab_view_is_enabled(), 'discussion_fragment': { - 'configured': bool(program_discussion_lti.configuration), + 'configured': program_discussion_lti.is_configured, 'iframe': program_discussion_lti.render_iframe() } } @@ -179,15 +179,14 @@ class ProgramDiscussionLTI: self.program_uuid = program_uuid self.program = get_programs(uuid=self.program_uuid) self.request = request - self.configuration = self.get_configuration() + self.configuration = ProgramDiscussionsConfiguration.get(self.program_uuid) - def get_configuration(self) -> ProgramDiscussionsConfiguration: + @property + def is_configured(self): """ - Returns ProgramDiscussionsConfiguration object with respect to program_uuid + Returns a boolean indicating if the program configuration is enabled or not. """ - return ProgramDiscussionsConfiguration.objects.filter( - program_uuid=self.program_uuid - ).first() + return bool(self.configuration and self.configuration.enabled) def _get_resource_link_id(self) -> str: site = get_current_site(self.request) @@ -268,7 +267,7 @@ class ProgramDiscussionLTI: """ Returns the program discussion fragment if program discussions configuration exists for a program uuid """ - if not self.configuration: + if not self.is_configured: return '' lti_embed_html = self._get_lti_embed_code() diff --git a/lms/djangoapps/learner_dashboard/tests/test_views.py b/lms/djangoapps/learner_dashboard/tests/test_views.py index b52febea21..f5548c97c0 100644 --- a/lms/djangoapps/learner_dashboard/tests/test_views.py +++ b/lms/djangoapps/learner_dashboard/tests/test_views.py @@ -54,7 +54,7 @@ class TestProgramDiscussionIframeView(SharedModuleStoreTestCase, ProgramCacheMix response = self.client.get(self.url) self.assertEqual(response.status_code, 200) expected_data = { - 'enabled': True, + 'tab_view_enabled': True, 'discussion': { 'iframe': "", 'configured': False @@ -70,6 +70,29 @@ class TestProgramDiscussionIframeView(SharedModuleStoreTestCase, ProgramCacheMix response = self.client.get(self.url) self.assertEqual(response.status_code, 401) + def test_program_discussion_disabled(self): + """ + Tests that API does not return discussion iframe when discussion + configuration is disabled. + """ + __ = ProgramDiscussionsConfiguration.objects.create( + program_uuid=self.program_uuid, + enabled=False, + provider_type="piazza", + ) + expected_data = { + 'tab_view_enabled': True, + 'discussion': { + 'iframe': "", + 'configured': False + } + } + + response = self.client.get(self.url) + + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data, expected_data) + def test_api_returns_discussions_iframe(self): """ Test if API returns iframe in case ProgramDiscussionsConfiguration model contains proper data diff --git a/lms/djangoapps/learner_dashboard/views.py b/lms/djangoapps/learner_dashboard/views.py index 80e6710385..acd866e517 100644 --- a/lms/djangoapps/learner_dashboard/views.py +++ b/lms/djangoapps/learner_dashboard/views.py @@ -86,7 +86,7 @@ class ProgramDiscussionIframeView(APIView, ProgramSpecificViewMixin): **Example** { - 'enabled_for_masters': True, + 'tab_view_enabled': True, 'discussion': { "iframe": " ", - "enabled": false + "configured": false } } - """ authentication_classes = (BearerAuthentication, SessionAuthentication) permission_classes = (permissions.IsAuthenticated, IsEnrolledInProgram) @@ -108,14 +107,11 @@ class ProgramDiscussionIframeView(APIView, ProgramSpecificViewMixin): def get(self, request, program_uuid): """ GET handler """ program_discussion_lti = ProgramDiscussionLTI(program_uuid, request) - return Response( - - { - 'enabled': masters_program_tab_view_is_enabled(), - 'discussion': { - 'iframe': program_discussion_lti.render_iframe(), - 'configured': bool(program_discussion_lti.configuration), - } - }, - status=status.HTTP_200_OK - ) + response_data = { + 'tab_view_enabled': masters_program_tab_view_is_enabled(), + 'discussion': { + 'iframe': program_discussion_lti.render_iframe(), + 'configured': program_discussion_lti.is_configured, + } + } + return Response(response_data, status=status.HTTP_200_OK) diff --git a/openedx/core/djangoapps/discussions/models.py b/openedx/core/djangoapps/discussions/models.py index 0fd6916665..b485a43f77 100644 --- a/openedx/core/djangoapps/discussions/models.py +++ b/openedx/core/djangoapps/discussions/models.py @@ -552,17 +552,13 @@ class ProgramDiscussionsConfiguration(TimeStampedModel): return f"Configuration(uuid='{self.program_uuid}', provider='{self.provider_type}', enabled={self.enabled})" @classmethod - def is_enabled(cls, program_uuid) -> bool: + def get(cls, program_uuid): """ - Check if there is an active configuration for a given program uuid - - Default to False, if no configuration exists + Lookup a program discussion configuration by program uuid. """ - try: - configuration = cls.objects.get(program_uuid=program_uuid) - return configuration.enabled - except cls.DoesNotExist: - return False + return ProgramDiscussionsConfiguration.objects.filter( + program_uuid=program_uuid + ).first() class DiscussionTopicLink(models.Model):