From 149ca028d769815665cbd438d8ace00591fb9842 Mon Sep 17 00:00:00 2001 From: SaadYousaf Date: Wed, 6 Apr 2022 13:18:02 +0500 Subject: [PATCH] feat: update discussion settings API to handle changes reported_content_email_notification field --- .../discussion/django_comment_client/tests/utils.py | 6 +++++- .../discussion/rest_api/tests/test_views.py | 13 ++++++++++++- lms/djangoapps/discussion/toggles.py | 13 +++++++++++++ openedx/core/djangoapps/discussions/serializers.py | 8 +++++++- .../core/djangoapps/discussions/tests/test_views.py | 5 ++++- .../core/djangoapps/django_comment_common/models.py | 1 + 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/lms/djangoapps/discussion/django_comment_client/tests/utils.py b/lms/djangoapps/discussion/django_comment_client/tests/utils.py index 1e762feeec..4f5fa72ef3 100644 --- a/lms/djangoapps/discussion/django_comment_client/tests/utils.py +++ b/lms/djangoapps/discussion/django_comment_client/tests/utils.py @@ -83,7 +83,8 @@ def config_course_discussions( course, discussion_topics={}, divided_discussions=[], - always_divide_inline_discussions=False + always_divide_inline_discussions=False, + reported_content_email_notifications=False, ): """ Set discussions and configure divided discussions for a course. @@ -96,6 +97,8 @@ def config_course_discussions( list to use the same ids as discussion topic names. always_divide_inline_discussions (bool): Whether inline discussions should be divided by default. + reported_content_email_notifications (bool): Whether email notifications + are enabled for reported content for moderators. Returns: Nothing -- modifies course in place. @@ -113,6 +116,7 @@ def config_course_discussions( ], 'always_divide_inline_discussions': always_divide_inline_discussions, 'division_scheme': CourseDiscussionSettings.COHORT, + 'reported_content_email_notifications': reported_content_email_notifications, }) course.discussion_topics = {name: {"sort_key": "A", "id": to_id(name)} diff --git a/lms/djangoapps/discussion/rest_api/tests/test_views.py b/lms/djangoapps/discussion/rest_api/tests/test_views.py index 37e97daa8f..4a0f279355 100644 --- a/lms/djangoapps/discussion/rest_api/tests/test_views.py +++ b/lms/djangoapps/discussion/rest_api/tests/test_views.py @@ -2313,7 +2313,9 @@ class CourseDiscussionSettingsAPIViewTest(APITestCase, UrlResetMixin, ModuleStor 'divided_course_wide_discussions': [], 'id': 1, 'division_scheme': 'cohort', - 'available_division_schemes': ['cohort'] + 'available_division_schemes': ['cohort'], + 'reported_content_email_notifications': False, + 'reported_content_email_notifications_flag': False, } def patch_request(self, data, headers=None): @@ -2491,6 +2493,15 @@ class CourseDiscussionSettingsAPIViewTest(APITestCase, UrlResetMixin, ModuleStor expected_response['division_scheme'] = 'none' self._assert_patched_settings({'division_scheme': 'none'}, expected_response) + def test_update_reported_content_email_notifications(self): + """Test whether the 'reported_content_email_notifications' setting is updated.""" + config_course_cohorts(self.course, is_cohorted=True) + config_course_discussions(self.course, reported_content_email_notifications=True) + expected_response = self._get_expected_response() + expected_response['reported_content_email_notifications'] = True + self._login_as_staff() + self._assert_current_settings(expected_response) + @ddt.ddt class CourseDiscussionRolesAPIViewTest(APITestCase, UrlResetMixin, ModuleStoreTestCase): diff --git a/lms/djangoapps/discussion/toggles.py b/lms/djangoapps/discussion/toggles.py index 6d2f8e3909..90a8d66f9f 100644 --- a/lms/djangoapps/discussion/toggles.py +++ b/lms/djangoapps/discussion/toggles.py @@ -45,3 +45,16 @@ ENABLE_DISCUSSION_MODERATION_REASON_CODES = CourseWaffleFlag( 'enable_moderation_reason_codes', __name__, ) + +# .. toggle_name: discussions.enable_reported_content_email_notifications +# .. toggle_implementation: CourseWaffleFlag +# .. toggle_default: False +# .. toggle_description: Waffle flag to toggle email notifications for reported content for moderators +# .. toggle_use_cases: temporary, open_edx +# .. toggle_creation_date: 2022-03-08 +# .. toggle_target_removal_date: 2022-12-31 +ENABLE_REPORTED_CONTENT_EMAIL_NOTIFICATIONS = CourseWaffleFlag( + WAFFLE_FLAG_NAMESPACE, + 'enable_reported_content_email_notifications', + __name__, +) diff --git a/openedx/core/djangoapps/discussions/serializers.py b/openedx/core/djangoapps/discussions/serializers.py index 874f5e62d2..5f01ca457e 100644 --- a/openedx/core/djangoapps/discussions/serializers.py +++ b/openedx/core/djangoapps/discussions/serializers.py @@ -6,6 +6,7 @@ from lti_consumer.api import get_lti_pii_sharing_state_for_course from lti_consumer.models import LtiConfiguration from rest_framework import serializers +from lms.djangoapps.discussion.toggles import ENABLE_REPORTED_CONTENT_EMAIL_NOTIFICATIONS from openedx.core.djangoapps.django_comment_common.models import CourseDiscussionSettings from openedx.core.lib.courses import get_course_by_id from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-order @@ -84,6 +85,7 @@ class LegacySettingsSerializer(serializers.BaseSerializer): 'divided_course_wide_discussions', 'divided_inline_discussions', 'division_scheme', + 'reported_content_email_notifications' ] def create(self, validated_data): @@ -363,6 +365,7 @@ class DiscussionSettingsSerializer(serializers.Serializer): read_only=True, ) always_divide_inline_discussions = serializers.BooleanField() + reported_content_email_notifications = serializers.BooleanField() division_scheme = serializers.CharField() def to_internal_value(self, data: dict) -> dict: @@ -406,7 +409,10 @@ class DiscussionSettingsSerializer(serializers.Serializer): 'divided_course_wide_discussions': divided_course_wide_discussions, 'always_divide_inline_discussions': instance.always_divide_inline_discussions, 'division_scheme': instance.division_scheme, - 'available_division_schemes': available_division_schemes(course_key) + 'available_division_schemes': available_division_schemes(course_key), + 'reported_content_email_notifications': instance.reported_content_email_notifications, + 'reported_content_email_notifications_flag': + ENABLE_REPORTED_CONTENT_EMAIL_NOTIFICATIONS.is_enabled(course_key), } return payload diff --git a/openedx/core/djangoapps/discussions/tests/test_views.py b/openedx/core/djangoapps/discussions/tests/test_views.py index 0da60bfeb2..b8f560847c 100644 --- a/openedx/core/djangoapps/discussions/tests/test_views.py +++ b/openedx/core/djangoapps/discussions/tests/test_views.py @@ -47,7 +47,8 @@ DEFAULT_LEGACY_CONFIGURATION = { 'divided_course_wide_discussions': [], 'division_scheme': 'none', 'available_division_schemes': [], - + 'reported_content_email_notifications': False, + 'reported_content_email_notifications_flag': False, } DEFAULT_LTI_CONFIGURATION = { 'lti_1p1_client_key': '', @@ -350,6 +351,7 @@ class DataTest(AuthorizedApiTest): 'plugin_configuration': { 'allow_anonymous': False, 'custom_field': 'custom_value', + 'reported_content_email_notifications': True, }, } response = self._post(payload) @@ -357,6 +359,7 @@ class DataTest(AuthorizedApiTest): assert data['plugin_configuration'] == { 'allow_anonymous': False, 'custom_field': 'custom_value', + 'reported_content_email_notifications': True, } course = self.store.get_course(self.course.id) diff --git a/openedx/core/djangoapps/django_comment_common/models.py b/openedx/core/djangoapps/django_comment_common/models.py index 2df064e62d..6dd4ba177d 100644 --- a/openedx/core/djangoapps/django_comment_common/models.py +++ b/openedx/core/djangoapps/django_comment_common/models.py @@ -298,6 +298,7 @@ class CourseDiscussionSettings(models.Model): 'division_scheme': (str,)[0], 'always_divide_inline_discussions': bool, 'divided_discussions': list, + 'reported_content_email_notifications': bool, } for field, field_type in fields.items(): if field in validated_data: