Add cache form ObjectPermissionChecker objects
authorverrierj
Mon, 12 Dec 2011 15:57:35 +0100
changeset 279 b50206f6238f
parent 278 d16ec14aaf29
child 280 7cd0ae3c4aef
Add cache form ObjectPermissionChecker objects
src/ldt/ldt/ldt_utils/forms.py
src/ldt/ldt/ldt_utils/views.py
src/ldt/ldt/security/cache.py
src/ldt/ldt/security/utils.py
web/ldtplatform/config.py.tmpl
--- a/src/ldt/ldt/ldt_utils/forms.py	Mon Dec 12 14:48:57 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/forms.py	Mon Dec 12 15:57:35 2011 +0100
@@ -29,7 +29,7 @@
     contents = forms.ModelMultipleChoiceField(Content.objects.all())
     index_projects = forms.BooleanField(required=False, initial=False)
 
-class SearchForm(forms.ModelForm):
+class SearchForm(forms.Form):
     search = forms.CharField(label=_("Search"))
     field = forms.ChoiceField([(u"all", _("all")), (u"title", _("title")), (u"abstract", _("resume")), (u"tags", _("tags"))], label=_("Fields"))
     ldt_pres = forms.BooleanField(required=False, initial=True, label=_("Display the results in Lignes De Temps"))
--- a/src/ldt/ldt/ldt_utils/views.py	Mon Dec 12 14:48:57 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/views.py	Mon Dec 12 15:57:35 2011 +0100
@@ -1,6 +1,7 @@
 from django.conf import settings
 from django.contrib.auth.decorators import login_required
 from django.contrib.auth.models import User, Group
+from django.core.cache import cache
 from django.core.urlresolvers import reverse
 from django.core.paginator import Paginator, InvalidPage, EmptyPage
 from django.db.models import Q
@@ -18,12 +19,12 @@
 from django.utils.translation import ugettext as _, ungettext
 from forms import (LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm,
     ContentForm, MediaForm, GroupAddForm)
-from guardian.core import ObjectPermissionChecker
-from guardian.shortcuts import assign, remove_perm, get_objects_for_group
+from guardian.shortcuts import remove_perm, get_objects_for_group
 from ldt.ldt_utils.models import Content
 from ldt.ldt_utils.utils import boolean_convert, LdtUtils, LdtSearch
 from ldt.security.utils import (assign_perm_to_obj, set_forbidden_stream, 
     add_change_attr, get_userlist_model, get_userlist_group)
+from ldt.security.cache import get_checker_for, assign
 from lxml.html import fragment_fromstring
 from models import Media, Project
 from projectserializer import ProjectSerializer
@@ -66,7 +67,7 @@
 
     # get list of all published projects
     group_list = request.user.groups.exclude(name=settings.PUBLIC_GROUP_NAME)
-    checker = ObjectPermissionChecker(request.user)
+    checker = get_checker_for(request.user)
     
     group_list = sorted(group_list.all(), key=lambda group: group.name.lower())
     
@@ -231,7 +232,7 @@
         
     group_list = group_list.exclude(name=settings.PUBLIC_GROUP_NAME)
     group_list = sorted(group_list.all(), key=lambda group: group.name.lower())
-    checker = ObjectPermissionChecker(request.user)
+    checker = get_checker_for(request.user)
     for g in group_list:
         if checker.has_perm('change_group', g):
             g.change = True
@@ -292,9 +293,9 @@
             
             complete_results.sort(key=lambda k: k['score'])
                                 
-            request.session['complete_results'] = complete_results
-            request.session['search'] = search
-            request.session['field'] = field
+            cache.set('complete_results_%s' % request.user.username, complete_results)
+            cache.set('search_%s' % request.user.username, search)
+            cache.set('field_%s' % request.user.username, field)
 
             paginator = Paginator (complete_results, settings.LDT_RESULTS_PER_PAGE)
             page = 1
@@ -313,12 +314,12 @@
         
 
 def search_listing(request):
-    if not request.session.has_key('complete_results'):
+    if not cache.get('complete_results_%s' % request.user.username):
         return HttpResponseRedirect(reverse('ldt.ldt_utils.views.published_project'))
      
-    complete_results = request.session.get('complete_results')
-    search = request.session.get('search')
-    field = request.session.get('field')
+    complete_results = cache.get('complete_results_%s' % request.user.username)
+    search = cache.get('search_%s' % request.user.username)
+    field = cache.get('field_%s' % request.user.username)
     paginator = Paginator(complete_results, settings.LDT_RESULTS_PER_PAGE)
     language_code = request.LANGUAGE_CODE[:2]
 
@@ -1323,7 +1324,7 @@
 @login_required
 def update_group(request, group_id):
     group = get_object_or_404(Group, id=group_id)
-    checker = ObjectPermissionChecker(request.user)
+    checker = get_checker_for(request.user)
     
     if not checker.has_perm('change_group', group):
         form_status = 'none'
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldt/ldt/security/cache.py	Mon Dec 12 15:57:35 2011 +0100
@@ -0,0 +1,25 @@
+from django.core.cache import cache
+from guardian.core import ObjectPermissionChecker
+from guardian.shortcuts import assign
+
+def get_checker_for(user):
+    key_name = 'checker_%s' % user.username
+    
+    checker = cache.get(key_name)
+    if checker:
+        return checker
+    
+    checker = ObjectPermissionChecker(user)
+    cache.set(key_name, checker, 30)
+    return checker
+
+
+def assign(perm, user_or_group, object):
+    assign(perm, user_or_group, object)
+    
+    if hasattr('username', user_or_group):
+        key = 'checker_%s' % user_or_group.username
+    else:
+        key = 'checker_%s' % user_or_group.name
+        
+    cache.delete('checker_%s' % key)
\ No newline at end of file
--- a/src/ldt/ldt/security/utils.py	Mon Dec 12 14:48:57 2011 +0100
+++ b/src/ldt/ldt/security/utils.py	Mon Dec 12 15:57:35 2011 +0100
@@ -1,8 +1,7 @@
 from django.conf import settings
 from django.contrib.contenttypes.models import ContentType
-from guardian.core import ObjectPermissionChecker
 from guardian.shortcuts import assign, remove_perm, get_users_with_perms, get_groups_with_perms
-
+from cache import get_checker_for
 
 try:
     from threading import local
@@ -104,7 +103,7 @@
     cls = ctype.model_class()
     
     if model_name in [cls_name.lower() for cls_name in settings.USE_GROUP_PERMISSIONS]:
-        checker = ObjectPermissionChecker(user)
+        checker = get_checker_for(user)
     else:
         checker = None
         
--- a/web/ldtplatform/config.py.tmpl	Mon Dec 12 14:48:57 2011 +0100
+++ b/web/ldtplatform/config.py.tmpl	Mon Dec 12 15:57:35 2011 +0100
@@ -49,6 +49,13 @@
     }
 }
 
+CACHES = {
+    'default': {
+        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
+        'LOCATION': 'cache',
+    }
+}
+
 DEBUG = True
 TEMPLATE_DEBUG = DEBUG