add caching for StudentModule

--HG--
branch : dormsbee_performance
This commit is contained in:
David Ormsbee
2012-02-24 12:55:18 -05:00
parent b54ff42532
commit fd75b49bec

View File

@@ -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)