# HG changeset patch # User verrierj # Date 1323701855 -3600 # Node ID b50206f6238f44aa21dca834f574328314678004 # Parent d16ec14aaf2915526cdfa84b3c99de32cdc6d40a Add cache form ObjectPermissionChecker objects diff -r d16ec14aaf29 -r b50206f6238f src/ldt/ldt/ldt_utils/forms.py --- 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")) diff -r d16ec14aaf29 -r b50206f6238f src/ldt/ldt/ldt_utils/views.py --- 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' diff -r d16ec14aaf29 -r b50206f6238f src/ldt/ldt/security/cache.py --- /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 diff -r d16ec14aaf29 -r b50206f6238f src/ldt/ldt/security/utils.py --- 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 diff -r d16ec14aaf29 -r b50206f6238f web/ldtplatform/config.py.tmpl --- 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