diff --git a/common/djangoapps/django_comment_common/signals.py b/common/djangoapps/django_comment_common/signals.py index 36d75a87ab..e8ae64e2ba 100644 --- a/common/djangoapps/django_comment_common/signals.py +++ b/common/djangoapps/django_comment_common/signals.py @@ -7,6 +7,8 @@ thread_created = Signal(providing_args=['user', 'post']) thread_edited = Signal(providing_args=['user', 'post']) thread_voted = Signal(providing_args=['user', 'post']) thread_deleted = Signal(providing_args=['user', 'post']) +thread_followed = Signal(providing_args=['user', 'post']) +thread_unfollowed = Signal(providing_args=['user', 'post']) comment_created = Signal(providing_args=['user', 'post']) comment_edited = Signal(providing_args=['user', 'post']) comment_voted = Signal(providing_args=['user', 'post']) diff --git a/lms/djangoapps/django_comment_client/base/tests.py b/lms/djangoapps/django_comment_client/base/tests.py index a3de71fe29..4fccc7a993 100644 --- a/lms/djangoapps/django_comment_client/base/tests.py +++ b/lms/djangoapps/django_comment_client/base/tests.py @@ -510,6 +510,23 @@ class ViewsTestCase( # create_thread_helper verifies that extra data are passed through to the comments service self.create_thread_helper(mock_request, extra_response_data={'context': ThreadContext.STANDALONE}) + @ddt.data( + ('follow_thread', 'thread_followed'), + ('unfollow_thread', 'thread_unfollowed'), + ) + @ddt.unpack + def test_follow_unfollow_thread_signals(self, view_name, signal, mock_request): + self.create_thread_helper(mock_request) + + with self.assert_discussion_signals(signal): + response = self.client.post( + reverse( + view_name, + kwargs={"course_id": unicode(self.course_id), "thread_id": 'i4x-MITx-999-course-Robot_Super_Course'} + ) + ) + self.assertEqual(response.status_code, 200) + def test_delete_thread(self, mock_request): self._set_mock_request_data(mock_request, { "user_id": str(self.student.id), diff --git a/lms/djangoapps/django_comment_client/base/views.py b/lms/djangoapps/django_comment_client/base/views.py index 6fdf23f81e..c937d44f35 100644 --- a/lms/djangoapps/django_comment_client/base/views.py +++ b/lms/djangoapps/django_comment_client/base/views.py @@ -42,7 +42,9 @@ from django_comment_common.signals import ( thread_created, thread_deleted, thread_edited, - thread_voted + thread_voted, + thread_followed, + thread_unfollowed, ) from django_comment_common.utils import ThreadContext import eventtracking @@ -291,6 +293,7 @@ def create_thread(request, course_id, commentable_id): if follow: cc_user = cc.User.from_django_user(user) cc_user.follow(thread) + thread_followed.send(sender=None, user=user, post=thread) data = thread.to_dict() @@ -525,6 +528,7 @@ def _vote_or_unvote(request, course_id, obj, value='up', undo_vote=False): # (People could theoretically downvote by handcrafting AJAX requests.) else: user.vote(obj, value) + thread_voted.send(sender=None, user=request.user, post=obj) track_voted_event(request, course, obj, value, undo_vote) return JsonResponse(prepare_content(obj.to_dict(), course_key)) @@ -563,7 +567,6 @@ def vote_for_thread(request, course_id, thread_id, value): """ thread = cc.Thread.find(thread_id) result = _vote_or_unvote(request, course_id, thread, value) - thread_voted.send(sender=None, user=request.user, post=thread) return result @@ -689,6 +692,7 @@ def follow_thread(request, course_id, thread_id): user = cc.User.from_django_user(request.user) thread = cc.Thread.find(thread_id) user.follow(thread) + thread_followed.send(sender=None, user=request.user, post=thread) return JsonResponse({}) @@ -717,6 +721,7 @@ def unfollow_thread(request, course_id, thread_id): user = cc.User.from_django_user(request.user) thread = cc.Thread.find(thread_id) user.unfollow(thread) + thread_unfollowed.send(sender=None, user=request.user, post=thread) return JsonResponse({}) diff --git a/lms/djangoapps/teams/models.py b/lms/djangoapps/teams/models.py index 154f424acd..f0398bc2b1 100644 --- a/lms/djangoapps/teams/models.py +++ b/lms/djangoapps/teams/models.py @@ -21,7 +21,9 @@ from django_comment_common.signals import ( thread_created, thread_deleted, thread_edited, - thread_voted + thread_voted, + thread_followed, + thread_unfollowed, ) from lms.djangoapps.teams import TEAM_DISCUSSION_CONTEXT from lms.djangoapps.teams.utils import emit_team_event @@ -42,6 +44,14 @@ def post_create_vote_handler(sender, **kwargs): # pylint: disable=unused-argume handle_activity(kwargs['user'], kwargs['post']) +@receiver(thread_followed) +@receiver(thread_unfollowed) +def post_followed_unfollowed_handler(sender, **kwargs): # pylint: disable=unused-argument + """Update the user's last activity date upon followed or unfollowed of a + post.""" + handle_activity(kwargs['user'], kwargs['post']) + + @receiver(thread_edited) @receiver(thread_deleted) @receiver(comment_edited)