From 5aa8f6193ee23c32da940c483d55e3b5327c966a Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Sat, 24 Feb 2018 17:54:59 +0100 Subject: [PATCH] Add methods to delete the restricted_data_cache --- openslides/users/models.py | 1 - openslides/utils/autoupdate.py | 2 +- openslides/utils/cache.py | 28 ++++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/openslides/users/models.py b/openslides/users/models.py index a28f33719..f9e173f35 100644 --- a/openslides/users/models.py +++ b/openslides/users/models.py @@ -1,5 +1,4 @@ import smtplib - from random import choice from django.contrib.auth.hashers import make_password diff --git a/openslides/utils/autoupdate.py b/openslides/utils/autoupdate.py index 06aaa8b7a..65aed3244 100644 --- a/openslides/utils/autoupdate.py +++ b/openslides/utils/autoupdate.py @@ -3,7 +3,7 @@ import threading import time import warnings from collections import OrderedDict, defaultdict -from typing import Any, Dict, Generator, Iterable, List, Tuple, Union, Optional +from typing import Any, Dict, Generator, Iterable, List, Optional, Tuple, Union from channels import Channel, Group from channels.asgi import get_channel_layer diff --git a/openslides/utils/cache.py b/openslides/utils/cache.py index 1cb16d31f..9e2e6ebc4 100644 --- a/openslides/utils/cache.py +++ b/openslides/utils/cache.py @@ -396,6 +396,34 @@ class RestrictedDataCache: self.get_cache_key(user_id), "{}/{}".format(collection_string, id)) + def del_user(self, user_id: int) -> None: + """ + Removes all elements for one user from the cache. + """ + redis = get_redis_connection() + redis.delete(self.get_cache_key(user_id)) + + def del_all(self) -> None: + """ + Deletes all elements from the cache. + + This method uses the redis command SCAN. See + https://redis.io/commands/scan#scan-guarantees for its limitations. If + an element is added to the cache while del_all() is in process, it is + possible, that it is not deleted. + """ + redis = get_redis_connection() + + # Get all keys that start with self.base_cache_key and delete them + match = cache.make_key('{}:*'.format(self.base_cache_key)) + cursor = 0 + while True: + cursor, keys = redis.scan(cursor, match) + for key in keys: + redis.delete(key) + if cursor == 0: + return + def exists_for_user(self, user_id: int) -> bool: """ Returns True if the cache for the user exists, else False.