def handle_progress_pre_save_signal(sender, instance, **kwargs): # pylint: disable=unused-argument """ Handle the pre-save ORM event on CourseModuleCompletions """ if settings.FEATURES['ENABLE_NOTIFICATIONS']: # If notifications feature is enabled, then we need to get the user's # rank before the save is made, so that we can compare it to # after the save and see if the position changes instance.presave_leaderboard_rank = StudentProgress.get_user_position( instance.course_id, instance.user.id, get_aggregate_exclusion_user_ids(instance.course_id))['position']
def handle_progress_pre_save_signal(sender, instance, **kwargs): """ Handle the pre-save ORM event on StudentSocialEngagementScore """ if settings.FEATURES["ENABLE_NOTIFICATIONS"]: # If notifications feature is enabled, then we need to get the user's # rank before the save is made, so that we can compare it to # after the save and see if the position changes instance.presave_leaderboard_rank = StudentSocialEngagementScore.get_user_leaderboard_position( instance.course_id, instance.user.id, get_aggregate_exclusion_user_ids(instance.course_id) )["position"]
def handle_studentgradebook_post_save_signal(sender, instance, **kwargs): """ Handle the pre-save ORM event on CourseModuleCompletions """ if settings.FEATURES['ENABLE_NOTIFICATIONS']: # attach the rank of the user before the save is completed data = StudentGradebook.get_user_position( instance.course_id, instance.user.id, exclude_users=get_aggregate_exclusion_user_ids(instance.course_id) ) leaderboard_rank = data['user_position'] grade = data['user_grade'] # logic for Notification trigger is when a user enters into the Leaderboard if grade > 0.0: leaderboard_size = getattr(settings, 'LEADERBOARD_SIZE', 3) presave_leaderboard_rank = instance.presave_leaderboard_rank if instance.presave_leaderboard_rank else sys.maxint if leaderboard_rank <= leaderboard_size and presave_leaderboard_rank > leaderboard_size: try: notification_msg = NotificationMessage( msg_type=get_notification_type(u'open-edx.lms.leaderboard.gradebook.rank-changed'), namespace=unicode(instance.course_id), payload={ '_schema_version': '1', 'rank': leaderboard_rank, 'leaderboard_name': 'Proficiency', } ) # # add in all the context parameters we'll need to # generate a URL back to the website that will # present the new course announcement # # IMPORTANT: This can be changed to msg.add_click_link() if we # have a particular URL that we wish to use. In the initial use case, # we need to make the link point to a different front end website # so we need to resolve these links at dispatch time # notification_msg.add_click_link_params({ 'course_id': unicode(instance.course_id), }) publish_notification_to_user(int(instance.user.id), notification_msg) except Exception, ex: # Notifications are never critical, so we don't want to disrupt any # other logic processing. So log and continue. log.exception(ex)
def handle_progress_post_save_signal(sender, instance, **kwargs): """ Handle the pre-save ORM event on CourseModuleCompletions """ if settings.FEATURES["ENABLE_NOTIFICATIONS"]: # If notifications feature is enabled, then we need to get the user's # rank before the save is made, so that we can compare it to # after the save and see if the position changes leaderboard_rank = StudentSocialEngagementScore.get_user_leaderboard_position( instance.course_id, instance.user.id, get_aggregate_exclusion_user_ids(instance.course_id) )["position"] if leaderboard_rank == 0: # quick escape when user is not in the leaderboard # which means rank = 0. Trouble is 0 < 3, so unfortunately # the semantics around 0 don't match the logic below return # logic for Notification trigger is when a user enters into the Leaderboard leaderboard_size = getattr(settings, "LEADERBOARD_SIZE", 3) presave_leaderboard_rank = ( instance.presave_leaderboard_rank if instance.presave_leaderboard_rank else sys.maxint ) if leaderboard_rank <= leaderboard_size and presave_leaderboard_rank > leaderboard_size: try: notification_msg = NotificationMessage( msg_type=get_notification_type(u"open-edx.lms.leaderboard.engagement.rank-changed"), namespace=unicode(instance.course_id), payload={"_schema_version": "1", "rank": leaderboard_rank, "leaderboard_name": "Engagement"}, ) # # add in all the context parameters we'll need to # generate a URL back to the website that will # present the new course announcement # # IMPORTANT: This can be changed to msg.add_click_link() if we # have a particular URL that we wish to use. In the initial use case, # we need to make the link point to a different front end website # so we need to resolve these links at dispatch time # notification_msg.add_click_link_params({"course_id": unicode(instance.course_id)}) publish_notification_to_user(int(instance.user.id), notification_msg) except Exception, ex: # Notifications are never critical, so we don't want to disrupt any # other logic processing. So log and continue. log.exception(ex)
def handle_studentgradebook_pre_save_signal(sender, instance, **kwargs): """ Handle the pre-save ORM event on CourseModuleCompletions """ if settings.FEATURES['ENABLE_NOTIFICATIONS']: # attach the rank of the user before the save is completed data = StudentGradebook.get_user_position( instance.course_id, instance.user.id, exclude_users=get_aggregate_exclusion_user_ids(instance.course_id) ) grade = data['user_grade'] leaderboard_rank = data['user_position'] if grade > 0.0 else 0 instance.presave_leaderboard_rank = leaderboard_rank