54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
import logging
|
|
from django.core.cache import cache, get_cache
|
|
from datetime import datetime
|
|
|
|
def _get_discussion_cache():
|
|
return get_cache('mongo_metadata_inheritance')
|
|
|
|
|
|
def get_discussion_cache_key(course_id):
|
|
return 'discussion_items_{0}'.format(course_id)
|
|
|
|
|
|
def get_discussion_cache_entry(modulestore, course_id):
|
|
cache_entry = None
|
|
cache = _get_discussion_cache()
|
|
|
|
if cache is not None:
|
|
cache_entry = cache.get(get_discussion_cache_key(course_id), None)
|
|
# @todo: add expiry here
|
|
|
|
if cache_entry is None:
|
|
cache_entry = generate_discussion_cache_entry(modulestore, course_id)
|
|
|
|
return cache_entry.get('modules',[])
|
|
|
|
|
|
def generate_discussion_cache_entry(modulestore, course_id):
|
|
# make this a NOP for now. We have to figure out how to pickle the result set
|
|
return
|
|
|
|
components = course_id.split('/')
|
|
all_discussion_modules = modulestore.get_items(['i4x', components[0], components[1], 'discussion', None],
|
|
course_id=course_id)
|
|
|
|
cache = _get_discussion_cache()
|
|
entry = {'modules': all_discussion_modules, 'timestamp': datetime.now()}
|
|
if cache is not None:
|
|
cache.set(get_discussion_cache_key(course_id), entry)
|
|
return entry
|
|
|
|
|
|
def modulestore_update_signal_handler(modulestore = None, course_id = None, location = None, **kwargs):
|
|
"""called when there is an write event in our modulestore
|
|
"""
|
|
return
|
|
if location.category == 'discussion':
|
|
logging.debug('******* got modulestore update signal. Regenerating discussion cache for {0}'.format(course_id))
|
|
# refresh the cache entry if we've changed a discussion module
|
|
generate_discussion_cache_entry(modulestore, course_id)
|
|
|
|
|
|
def discussion_cache_register_for_updates(modulestore):
|
|
if modulestore.modulestore_update_signal is not None:
|
|
modulestore.modulestore_update_signal.connect(modulestore_update_signal_handler) |