96 lines
2.9 KiB
Python
96 lines
2.9 KiB
Python
from __future__ import unicode_literals
|
|
|
|
import hashlib
|
|
|
|
from django.core.cache import caches
|
|
from django.utils.encoding import force_bytes
|
|
|
|
from .settings import (
|
|
setting_document_lookup_cache_timeout, setting_node_lookup_cache_timeout
|
|
)
|
|
|
|
|
|
class IndexFilesystemCache(object):
|
|
@staticmethod
|
|
def get_key_hash(key):
|
|
return hashlib.sha256(force_bytes(key)).hexdigest()
|
|
|
|
@staticmethod
|
|
def get_document_key(document):
|
|
return IndexFilesystemCache.get_key_hash(
|
|
key='document_pk_{}'.format(document.pk)
|
|
)
|
|
|
|
@staticmethod
|
|
def get_node_key(node):
|
|
return IndexFilesystemCache.get_key_hash(
|
|
key='node_pk_{}'.format(node.pk)
|
|
)
|
|
|
|
@staticmethod
|
|
def get_path_key(path):
|
|
return IndexFilesystemCache.get_key_hash(
|
|
key='path_{}'.format(path)
|
|
)
|
|
|
|
def __init__(self, name='default'):
|
|
self.cache = caches[name]
|
|
|
|
def clear_node(self, node):
|
|
node_key = IndexFilesystemCache.get_node_key(node=node)
|
|
path_cache = self.cache.get(key=node_key)
|
|
if path_cache:
|
|
path = path_cache.get('path')
|
|
if path:
|
|
self.clean_path(path=path)
|
|
|
|
self.cache.delete(key=node_key)
|
|
|
|
def clear_document(self, document):
|
|
document_key = IndexFilesystemCache.get_document_key(document=document)
|
|
path_cache = self.cache.get(key=document_key)
|
|
if path_cache:
|
|
path = path_cache.get('path')
|
|
if path:
|
|
self.clean_path(path=path)
|
|
|
|
self.cache.delete(key=document_key)
|
|
|
|
def clean_path(self, path):
|
|
self.cache.delete(
|
|
key=IndexFilesystemCache.get_path_key(path=path)
|
|
)
|
|
|
|
def get_path(self, path):
|
|
return self.cache.get(
|
|
key=IndexFilesystemCache.get_path_key(path=path)
|
|
)
|
|
|
|
def set_path(self, path, document=None, node=None):
|
|
# Must provide a document_pk or a node_pk
|
|
# Not both
|
|
# Providing both is also not correct
|
|
|
|
if document:
|
|
self.cache.set(
|
|
key=IndexFilesystemCache.get_path_key(path=path),
|
|
value={'document_pk': document.pk},
|
|
timeout=setting_document_lookup_cache_timeout.value
|
|
)
|
|
self.cache.set(
|
|
key=IndexFilesystemCache.get_document_key(document=document),
|
|
value={'path': path},
|
|
timeout=setting_document_lookup_cache_timeout.value
|
|
)
|
|
elif node:
|
|
self.cache.set(
|
|
key=IndexFilesystemCache.get_path_key(path=path),
|
|
value={'node_pk': node.pk},
|
|
timeout=setting_node_lookup_cache_timeout.value
|
|
)
|
|
self.cache.set(
|
|
key=IndexFilesystemCache.get_node_key(node=node),
|
|
value={'path': path},
|
|
timeout=setting_node_lookup_cache_timeout.value
|
|
)
|