From 665fb707b1f6c81c645c49d4efced853d7bb25fc Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Wed, 23 Jan 2013 10:43:45 -0500 Subject: [PATCH] Cache notifications for 5 mins so that we don't hit the grading server on every web request --- lms/djangoapps/courseware/tabs.py | 2 +- .../open_ended_notifications.py | 72 +++++++++++++++++-- 2 files changed, 68 insertions(+), 6 deletions(-) diff --git a/lms/djangoapps/courseware/tabs.py b/lms/djangoapps/courseware/tabs.py index a53e4bfb0a..b52324b360 100644 --- a/lms/djangoapps/courseware/tabs.py +++ b/lms/djangoapps/courseware/tabs.py @@ -110,7 +110,7 @@ def _staff_grading(tab, user, course, active_page): tab_name = "Staff grading" - notifications = open_ended_notifications.staff_grading_notifications(course) + notifications = open_ended_notifications.staff_grading_notifications(course, user) pending_grading = notifications['pending_grading'] img_path = notifications['img_path'] diff --git a/lms/djangoapps/open_ended_grading/open_ended_notifications.py b/lms/djangoapps/open_ended_grading/open_ended_notifications.py index d6621e468a..80f17352e9 100644 --- a/lms/djangoapps/open_ended_grading/open_ended_notifications.py +++ b/lms/djangoapps/open_ended_grading/open_ended_notifications.py @@ -8,20 +8,31 @@ import open_ended_util from courseware.models import StudentModule import logging from courseware.access import has_access +from util.cache import cache log=logging.getLogger(__name__) +NOTIFICATION_CACHE_TIME = 300 +KEY_PREFIX = "open_ended_" + NOTIFICATION_TYPES = ( ('student_needs_to_peer_grade', 'peer_grading', 'Peer Grading'), ('staff_needs_to_grade', 'staff_grading', 'Staff Grading'), ('new_student_grading_to_view', 'open_ended_problems', 'Problems you have submitted') ) -def staff_grading_notifications(course): +def staff_grading_notifications(course, user): staff_gs = StaffGradingService(settings.STAFF_GRADING_INTERFACE) pending_grading=False img_path= "" course_id = course.id + student_id = unique_id_for_user(user) + notification_type = "staff" + + success, notification_dict = get_value_from_cache(student_id, course_id, notification_type) + if success: + return notification_dict + try: notifications = json.loads(staff_gs.get_notifications(course_id)) if notifications['success']: @@ -35,16 +46,26 @@ def staff_grading_notifications(course): if pending_grading: img_path = "/static/images/slider-handle.png" - return {'pending_grading' : pending_grading, 'img_path' : img_path, 'response' : notifications} + notification_dict = {'pending_grading' : pending_grading, 'img_path' : img_path, 'response' : notifications} + + set_value_in_cache(student_id, course_id, notification_type, notification_dict) + + return notification_dict def peer_grading_notifications(course, user): peer_gs = PeerGradingService(settings.PEER_GRADING_INTERFACE) pending_grading=False img_path= "" course_id = course.id + student_id = unique_id_for_user(user) + notification_type = "peer" + + success, notification_dict = get_value_from_cache(student_id, course_id, notification_type) + if success: + return notification_dict try: - notifications = json.loads(peer_gs.get_notifications(course_id,unique_id_for_user(user))) + notifications = json.loads(peer_gs.get_notifications(course_id,student_id)) if notifications['success']: if notifications['student_needs_to_peer_grade']: pending_grading=True @@ -56,7 +77,11 @@ def peer_grading_notifications(course, user): if pending_grading: img_path = "/static/images/slider-handle.png" - return {'pending_grading' : pending_grading, 'img_path' : img_path, 'response' : notifications} + notification_dict = {'pending_grading' : pending_grading, 'img_path' : img_path, 'response' : notifications} + + set_value_in_cache(student_id, course_id, notification_type, notification_dict) + + return notification_dict def combined_notifications(course, user): controller_url = open_ended_util.get_controller_url() @@ -64,6 +89,11 @@ def combined_notifications(course, user): student_id = unique_id_for_user(user) user_is_staff = has_access(user, course, 'staff') course_id = course.id + notification_type = "combined" + + success, notification_dict = get_value_from_cache(student_id, course_id, notification_type) + if success: + return notification_dict min_time_to_query = user.last_login last_module_seen = StudentModule.objects.filter(student=user, course_id = course_id, modified__gt=min_time_to_query).values('modified').order_by('-modified') @@ -92,4 +122,36 @@ def combined_notifications(course, user): if pending_grading: img_path = "/static/images/slider-handle.png" - return {'pending_grading' : pending_grading, 'img_path' : img_path, 'response' : notifications} \ No newline at end of file + notification_dict = {'pending_grading' : pending_grading, 'img_path' : img_path, 'response' : notifications} + + set_value_in_cache(student_id, course_id, notification_type, notification_dict) + + return notification_dict + +def get_value_from_cache(student_id, course_id, notification_type): + key_name = create_key_name(student_id, course_id, notification_type) + success, value = _get_value_from_cache(key_name) + return success, value + +def set_value_in_cache(student_id, course_id, notification_type, value): + key_name = create_key_name(student_id, course_id, notification_type) + _set_value_in_cache(key_name, value) + +def create_key_name(student_id, course_id, notification_type): + key_name = "{prefix}{type}_{course}_{student}".format(prefix=KEY_PREFIX, type=notification_type, course=course_id, student=student_id) + return key_name + +def _get_value_from_cache(key_name): + value = cache.get(key_name) + success = False + if value is None: + return success , value + try: + value = json.loads(value) + success = True + except: + pass + return success , value + +def _set_value_in_cache(key_name, value): + cache.set(key_name, json.dumps(value), NOTIFICATION_CACHE_TIME) \ No newline at end of file