From fd75b49beca289c768cd67f980a4dbfcb3cccc6f Mon Sep 17 00:00:00 2001 From: David Ormsbee Date: Fri, 24 Feb 2012 12:55:18 -0500 Subject: [PATCH] add caching for StudentModule --HG-- branch : dormsbee_performance --- courseware/models.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/courseware/models.py b/courseware/models.py index 3fdaabe4d8..d02453f8d6 100644 --- a/courseware/models.py +++ b/courseware/models.py @@ -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) \ No newline at end of file