Commit 665fb707 by Vik Paruchuri

Cache notifications for 5 mins so that we don't hit the grading server on every web request

parent 68f563a1
...@@ -110,7 +110,7 @@ def _staff_grading(tab, user, course, active_page): ...@@ -110,7 +110,7 @@ def _staff_grading(tab, user, course, active_page):
tab_name = "Staff grading" 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'] pending_grading = notifications['pending_grading']
img_path = notifications['img_path'] img_path = notifications['img_path']
......
...@@ -8,20 +8,31 @@ import open_ended_util ...@@ -8,20 +8,31 @@ import open_ended_util
from courseware.models import StudentModule from courseware.models import StudentModule
import logging import logging
from courseware.access import has_access from courseware.access import has_access
from util.cache import cache
log=logging.getLogger(__name__) log=logging.getLogger(__name__)
NOTIFICATION_CACHE_TIME = 300
KEY_PREFIX = "open_ended_"
NOTIFICATION_TYPES = ( NOTIFICATION_TYPES = (
('student_needs_to_peer_grade', 'peer_grading', 'Peer Grading'), ('student_needs_to_peer_grade', 'peer_grading', 'Peer Grading'),
('staff_needs_to_grade', 'staff_grading', 'Staff Grading'), ('staff_needs_to_grade', 'staff_grading', 'Staff Grading'),
('new_student_grading_to_view', 'open_ended_problems', 'Problems you have submitted') ('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) staff_gs = StaffGradingService(settings.STAFF_GRADING_INTERFACE)
pending_grading=False pending_grading=False
img_path= "" img_path= ""
course_id = course.id 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: try:
notifications = json.loads(staff_gs.get_notifications(course_id)) notifications = json.loads(staff_gs.get_notifications(course_id))
if notifications['success']: if notifications['success']:
...@@ -35,16 +46,26 @@ def staff_grading_notifications(course): ...@@ -35,16 +46,26 @@ def staff_grading_notifications(course):
if pending_grading: if pending_grading:
img_path = "/static/images/slider-handle.png" 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): def peer_grading_notifications(course, user):
peer_gs = PeerGradingService(settings.PEER_GRADING_INTERFACE) peer_gs = PeerGradingService(settings.PEER_GRADING_INTERFACE)
pending_grading=False pending_grading=False
img_path= "" img_path= ""
course_id = course.id 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: 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['success']:
if notifications['student_needs_to_peer_grade']: if notifications['student_needs_to_peer_grade']:
pending_grading=True pending_grading=True
...@@ -56,7 +77,11 @@ def peer_grading_notifications(course, user): ...@@ -56,7 +77,11 @@ def peer_grading_notifications(course, user):
if pending_grading: if pending_grading:
img_path = "/static/images/slider-handle.png" 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): def combined_notifications(course, user):
controller_url = open_ended_util.get_controller_url() controller_url = open_ended_util.get_controller_url()
...@@ -64,6 +89,11 @@ def combined_notifications(course, user): ...@@ -64,6 +89,11 @@ def combined_notifications(course, user):
student_id = unique_id_for_user(user) student_id = unique_id_for_user(user)
user_is_staff = has_access(user, course, 'staff') user_is_staff = has_access(user, course, 'staff')
course_id = course.id 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 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') 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): ...@@ -92,4 +122,36 @@ def combined_notifications(course, user):
if pending_grading: if pending_grading:
img_path = "/static/images/slider-handle.png" 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}
\ No newline at end of file
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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment