add caching for StudentModule
--HG-- branch : dormsbee_performance
This commit is contained in:
@@ -8,12 +8,18 @@ file and check it in at the same time as your model changes. To do that,
|
||||
2. ./manage.py schemamigration courseware --auto description_of_your_change
|
||||
3. Add the migration file created in mitx/courseware/migrations/
|
||||
|
||||
|
||||
ASSUMPTIONS: modules have unique IDs, even across different module_types
|
||||
|
||||
"""
|
||||
from django.db import models
|
||||
from django.core.cache import cache
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
from cache_toolbox import cache_model, cache_relation
|
||||
|
||||
CACHE_TIMEOUT = 60 * 60 * 4 # Set the cache timeout to be four hours
|
||||
|
||||
class StudentModule(models.Model):
|
||||
# For a homework problem, contains a JSON
|
||||
# object consisting of state
|
||||
@@ -51,5 +57,28 @@ class StudentModule(models.Model):
|
||||
def __unicode__(self):
|
||||
return self.module_type+'/'+self.student.username+"/"+self.module_id+'/'+str(self.state)[:20]
|
||||
|
||||
@classmethod
|
||||
def get_from_cache(cls, student, module_ids):
|
||||
k = cls.key_for(student, module_ids)
|
||||
student_modules = k.get(k)
|
||||
if student_modules is None:
|
||||
student_modules = StudentModule.objects.filter(student=student, module_id__in=module_ids)
|
||||
# It's possible it really doesn't exist...
|
||||
if student_modules is not None:
|
||||
k.set(k, student_modules, CACHE_TIMEOUT)
|
||||
|
||||
return student_modules
|
||||
|
||||
|
||||
@classmethod
|
||||
def clear_cache_for(cls, student, module_ids):
|
||||
k = cls.key_for(student_id, module_ids)
|
||||
cache.delete(k)
|
||||
|
||||
@classmethod
|
||||
def key_for(cls, student, module_ids):
|
||||
module_ids_hash = md5(",".join(sorted(modules_ids))).hexdigest()
|
||||
return "StudentModule-student_id:{0};module_ids_hash:{1}".format(student.id, module_ids_hash)
|
||||
|
||||
|
||||
cache_model(StudentModule)
|
||||
Reference in New Issue
Block a user