dynamicweb/cms/cache/permissions.py

76 lines
2.4 KiB
Python

from cms.utils.conf import get_cms_setting
PERMISSION_KEYS = [
'add_page', 'change_page', 'change_page_advanced_settings',
'change_page_permissions', 'delete_page', 'move_page',
'publish_page', 'view_page',
]
def get_cache_key(user, site, key):
"""Cache key for ``user``'s page permissions of ``key`` on ``site``.
The page permissions behind a key are computed per site, so the site has to
be part of the key: without it the value warmed for one site is served for
every other one, granting access to sites the user has no rights on.
"""
return "%s:permission:%d:%d:%s" % (
get_cms_setting('CACHE_PREFIX'), user.pk or 0, site.pk, key)
def get_cache_permission_version_key():
return "{}:permission:version".format(get_cms_setting('CACHE_PREFIX'))
def get_cache_permission_version():
from django.core.cache import cache
try:
version = int(cache.get(get_cache_permission_version_key()))
except Exception:
version = 1
return int(version)
def get_permission_cache(user, site, key):
"""
Helper for reading values from cache
"""
from django.core.cache import cache
return cache.get(get_cache_key(user, site, key), version=get_cache_permission_version())
def set_permission_cache(user, site, key, value):
"""
Helper method for storing values in cache. Stores used keys so
all of them can be cleaned when clean_permission_cache gets called.
"""
from django.core.cache import cache
# store this key, so we can clean it when required
cache_key = get_cache_key(user, site, key)
cache.set(cache_key, value,
get_cms_setting('CACHE_DURATIONS')['permissions'],
version=get_cache_permission_version())
def clear_user_permission_cache(user):
"""
Cleans permission cache for given user, on every site.
"""
from django.contrib.sites.models import Site
from django.core.cache import cache
cache.delete_many(
[get_cache_key(user, site, key) for site in Site.objects.all() for key in PERMISSION_KEYS],
version=get_cache_permission_version(),
)
def clear_permission_cache():
from django.core.cache import cache
version = get_cache_permission_version()
if version > 1:
cache.incr(get_cache_permission_version_key())
else:
cache.set(get_cache_permission_version_key(), 2,
get_cms_setting('CACHE_DURATIONS')['permissions'])