src/ldt/ldt/security/cache.py
author cavaliet
Mon, 18 Mar 2013 16:15:46 +0100
changeset 1132 026d510a3dc3
parent 1017 0897d4ffdbc9
child 1191 b6e0b1811723
permissions -rw-r--r--
Finally super useful optimization on guardian request.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
279
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
     1
from django.core.cache import cache
282
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
     2
from django.conf import settings
279
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
     3
from guardian.core import ObjectPermissionChecker
282
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
     4
from django.contrib.auth.models import User
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
     5
from django.db.models import Q
279
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
     6
from guardian.shortcuts import assign
1017
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
     7
from django.utils.encoding import smart_str
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
     8
import re
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
     9
import hashlib
279
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    10
282
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    11
def get_cached_checker(user):
1017
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    12
    key_name = get_key(user.username)
279
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    13
    
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    14
    checker = cache.get(key_name)
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    15
    if checker:
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    16
        return checker
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    17
    
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    18
    checker = ObjectPermissionChecker(user)
285
1cc364d7b298 Fix bug in project copy from group tab
verrierj
parents: 282
diff changeset
    19
    cache.set(key_name, checker)
279
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    20
    return checker
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    21
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    22
1017
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    23
def cached_assign(perm, user_or_group, object_inst):
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    24
    assign(perm, user_or_group, object_inst)
279
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    25
    
282
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    26
    if hasattr(user_or_group, 'username'):
1017
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    27
        key = get_key(user_or_group.username)
279
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    28
    else:
1017
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    29
        key = get_key(user_or_group.name)
279
b50206f6238f Add cache form ObjectPermissionChecker objects
verrierj
parents:
diff changeset
    30
        
1017
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    31
    cache.delete(key)
282
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    32
    
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    33
    
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    34
def get_cached_userlist():
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    35
    userlist = cache.get('userlist')
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    36
    if userlist:
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    37
        return userlist
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    38
    
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    39
    query = Q(id=settings.ANONYMOUS_USER_ID) | Q(is_superuser=True)
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    40
    userlist = User.objects.exclude(query)
7512c33b64be Add cache to userlist
verrierj
parents: 279
diff changeset
    41
    cache.set('userlist', userlist)
1017
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    42
    return userlist
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    43
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    44
def get_key(name):
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    45
    
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    46
    name = smart_str(name, encoding="ascii", errors="replace") 
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    47
    name = re.sub(r"[^\w\s_\-]", '', name)
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    48
    name = re.sub(r"\s+", '_', name)
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    49
    
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    50
    key = "checker_%s" % name
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    51
    if len(key) > 250:
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    52
        key = hashlib.sha512(key).hexdigest()
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    53
    
0897d4ffdbc9 correct pb on cache key + version nb
ymh <ymh.work@gmail.com>
parents: 285
diff changeset
    54
    return key