Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions lms/djangoapps/discussion/rest_api/discussions_notifications.py
Original file line number Diff line number Diff line change
Expand Up @@ -382,9 +382,17 @@ def send_reported_content_notification(self):
'content': thread_body,
'email_content': clean_thread_html_body(thread_body)
}
audience_filters = {'discussion_roles': [
FORUM_ROLE_ADMINISTRATOR, FORUM_ROLE_MODERATOR, FORUM_ROLE_COMMUNITY_TA
]}
group_id = self.thread.attributes.get('group_id')
cohort_ids = [int(group_id)] if group_id is not None else []

audience_filters = {
'discussion_roles': [
FORUM_ROLE_ADMINISTRATOR,
FORUM_ROLE_MODERATOR,
FORUM_ROLE_COMMUNITY_TA,
],
'cohort_for_group_tas': cohort_ids,
}
self._send_course_wide_notification("content_reported", audience_filters, context)

def _populate_context_with_ids_for_mobile(self, context, notification_type):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,11 @@ def _assert_send_notification_called_with(self, mock_send_notification, expected
'email_content': 'Thread body',
})
self.assertEqual(audience_filters, {
'discussion_roles': ['Administrator', 'Moderator', 'Community TA']
'discussion_roles': ['Administrator', 'Moderator', 'Community TA'],
'cohort_for_group_tas': [1],
})
self.assertEqual(len(audience_filters), 1)
self.assertEqual(list(audience_filters.keys()), ['discussion_roles'])
self.assertEqual(len(audience_filters), 2)
self.assertEqual(list(audience_filters.keys()), ['discussion_roles', 'cohort_for_group_tas'])

def test_send_reported_content_notification_for_response(self, mock_send_notification, mock_create_audience):
"""
Expand Down
38 changes: 38 additions & 0 deletions openedx/core/djangoapps/notifications/audience_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,3 +251,41 @@ def apply_filters(self, user_ids, course_key, notification_type) -> list:
)
user_ids = getattr(self, filter_name)(user_ids, course)
return user_ids


class GroupTAinCohortFilter(NotificationAudienceFilterBase):
"""
Returns Group Community TA (Group Moderator) user ids for the provided cohort IDs.
Expected param: a list of cohort ids (integers).
"""
# we accept any values (cohort ids), so allowed_filters can stay empty
allowed_filters = []

def filter(self, cohort_ids):
"""
cohort_ids: list of cohort id integers (or strings)
return: iterable of user ids
"""
if not cohort_ids:
return []

# Get user ids who are members of the cohort group(s)
cohort_users_qs = CourseUserGroup.objects.filter(
course_id=self.course_key,
id__in=cohort_ids,
group_type=CourseUserGroup.COHORT
).values_list("users__id", flat=True)

# If no users in cohort, short-circuit
cohort_user_ids = list(cohort_users_qs)
if not cohort_user_ids:
return []

# Now get those users who have the Group Moderator forum role in this course
group_moderator_user_ids_qs = Role.objects.filter(
course_id=self.course_key,
name=FORUM_ROLE_GROUP_MODERATOR,
users__id__in=cohort_user_ids
).values_list("users__id", flat=True)

return list(group_moderator_user_ids_qs)
4 changes: 4 additions & 0 deletions openedx/core/djangoapps/notifications/base_notification.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,10 @@
'replier_name': 'replier name',
},
'email_template': '',
'filters': [
FILTER_AUDIT_EXPIRED_USERS_WITH_NO_ROLE,
"GroupTAinCohortFilter",
],
'visible_to': [FORUM_ROLE_ADMINISTRATOR, FORUM_ROLE_MODERATOR, FORUM_ROLE_COMMUNITY_TA]
},
'response_endorsed_on_thread': {
Expand Down
Loading