def test_no_score(self): """ Run the engagement calculation for a user in a course who has no score """ self.assertEqual(get_notifications_count_for_user(self.user.id), 0) with patch('social_engagement.engagement._get_user_social_stats' ) as mock_func: mock_func.return_value = { 'num_threads': 0, 'num_comments': 0, 'num_replies': 0, 'num_upvotes': 0, 'num_thread_followers': 0, 'num_comments_generated': 0, } update_user_engagement_score(self.course.id, self.user.id) leaderboard_position = StudentSocialEngagementScore.get_user_leaderboard_position( self.course.id, self.user.id) self.assertEqual(leaderboard_position['score'], 0) self.assertEqual(leaderboard_position['position'], 0) self.assertEqual(get_notifications_count_for_user(self.user.id), 0)
def test_no_score(self): """ Run the engagement calculation for a user in a course who has no score """ self.assertEqual(get_notifications_count_for_user(self.user.id), 0) with patch('social_engagement.engagement._get_user_social_stats') as mock_func: mock_func.return_value = { 'num_threads': 0, 'num_comments': 0, 'num_replies': 0, 'num_upvotes': 0, 'num_thread_followers': 0, 'num_comments_generated': 0, } update_user_engagement_score(self.course.id, self.user.id) leaderboard_position = StudentSocialEngagementScore.get_user_leaderboard_position( self.course.id, self.user.id ) self.assertEqual( leaderboard_position['score'], 0 ) self.assertEqual( leaderboard_position['position'], 0 ) self.assertEqual(get_notifications_count_for_user(self.user.id), 0)
def handle(self, *args, **options): help = "Command to creaete or update social engagement entries" option_list = BaseCommand.option_list + ( make_option( "-c", "--course_ids", dest="course_ids", help="List of courses for which to generate social engagement", metavar="first/course/id,second/course/id" ), make_option( "-u", "--user_ids", dest="user_ids", help="List of users for which to generate social engagement", metavar="1234,2468,3579" ), ) course_ids = options.get('course_ids') user_ids = options.get('user_ids') if course_ids: # over a few specific courses? for course_id in course_ids: if user_ids: # over a few specific users in those courses? for user_id in user_ids: update_user_engagement_score(course_id, user_id, compute_if_closed_course=True) else: update_course_engagement_scores(course_id, compute_if_closed_course=True) else: print 'Updating social engagement scores in all courses...' update_all_courses_engagement_scores(compute_if_closed_course=True)
def _update_user_engagement_score(course_key, user_id): """ Helper to call down into the Social Engagement app to recalc the passed in user's Social Engagement score """ if settings.FEATURES.get('ENABLE_SOCIAL_ENGAGEMENT', False): update_user_engagement_score(course_key, user_id)
def task_update_user_engagement_score(course_id, user_id): """ Task to update user's engagement score """ try: update_user_engagement_score(course_id, user_id) except Exception as exc: # pylint: disable=broad-except log.info( "social engagement score update failure for course {} and user id {} with exception {}" .format(course_id, user_id, repr(exc)))
def test_multiple_users(self): """ See if it works with more than one enrollee """ self.assertEqual(get_notifications_count_for_user(self.user.id), 0) self.assertEqual(get_notifications_count_for_user(self.user2.id), 0) with patch('social_engagement.engagement._get_user_social_stats' ) as mock_func: mock_func.return_value = { 'num_threads': 1, 'num_comments': 1, 'num_replies': 1, 'num_upvotes': 1, 'num_thread_followers': 1, 'num_comments_generated': 1, } update_user_engagement_score(self.course.id, self.user.id) with patch('social_engagement.engagement._get_user_social_stats' ) as mock_func: mock_func.return_value = { 'num_threads': 2, 'num_comments': 2, 'num_replies': 2, 'num_upvotes': 2, 'num_thread_followers': 2, 'num_comments_generated': 2, } update_user_engagement_score(self.course.id, self.user2.id) leaderboard_position = StudentSocialEngagementScore.get_user_leaderboard_position( self.course.id, self.user.id) self.assertEqual(leaderboard_position['score'], 85) # user should be in place #2 self.assertEqual(leaderboard_position['position'], 2) self.assertEqual(get_notifications_count_for_user(self.user.id), 1) leaderboard_position = StudentSocialEngagementScore.get_user_leaderboard_position( self.course.id, self.user2.id) self.assertEqual(leaderboard_position['score'], 170) # user2 should be in place #1 self.assertEqual(leaderboard_position['position'], 1) self.assertEqual(get_notifications_count_for_user(self.user2.id), 1)
def task_compute_social_scores_in_course(course_id): """ Task to compute social scores in course """ score_update_count = 0 course_key = CourseKey.from_string(course_id) course = modulestore().get_course(course_key, depth=None) user_ids = CourseEnrollment.objects.values_list( 'user_id', flat=True).filter(is_active=1, course_id=course_key) if course: # For each user compute and save social engagement score for user_id in user_ids: update_user_engagement_score(course_key, user_id, compute_if_closed_course=True, course_descriptor=course) score_update_count += 1 else: log.info("Course with course id %s does not exist", course_id) log.info("Social scores updated for %d users in course %s", score_update_count, course_id)
def test_multiple_users(self): """ See if it works with more than one enrollee """ self.assertEqual(get_notifications_count_for_user(self.user.id), 0) self.assertEqual(get_notifications_count_for_user(self.user2.id), 0) with patch('social_engagement.engagement._get_user_social_stats') as mock_func: mock_func.return_value = { 'num_threads': 1, 'num_comments': 1, 'num_replies': 1, 'num_upvotes': 1, 'num_thread_followers': 1, 'num_comments_generated': 1, } update_user_engagement_score(self.course.id, self.user.id) with patch('social_engagement.engagement._get_user_social_stats') as mock_func: mock_func.return_value = { 'num_threads': 2, 'num_comments': 2, 'num_replies': 2, 'num_upvotes': 2, 'num_thread_followers': 2, 'num_comments_generated': 2, } update_user_engagement_score(self.course.id, self.user2.id) leaderboard_position = StudentSocialEngagementScore.get_user_leaderboard_position( self.course.id, self.user.id ) self.assertEqual( leaderboard_position['score'], 85 ) # user should be in place #2 self.assertEqual( leaderboard_position['position'], 2 ) self.assertEqual(get_notifications_count_for_user(self.user.id), 1) leaderboard_position = StudentSocialEngagementScore.get_user_leaderboard_position( self.course.id, self.user2.id ) self.assertEqual( leaderboard_position['score'], 170 ) # user2 should be in place #1 self.assertEqual( leaderboard_position['position'], 1 ) self.assertEqual(get_notifications_count_for_user(self.user2.id), 1)