Coverage for jutil/redis_admin_helpers.py: 0%
34 statements
« prev ^ index » next coverage.py v6.5.0, created at 2022-10-07 16:40 -0500
« prev ^ index » next coverage.py v6.5.0, created at 2022-10-07 16:40 -0500
1import logging
2from typing import List, Tuple
3from django.utils.translation import get_language
4from django.contrib.admin import SimpleListFilter
5from jutil.redis_helpers import redis_get_json, redis_set_json
7logger = logging.getLogger(__name__)
10class RedisCachedSimpleListFilter(SimpleListFilter):
11 """
12 Simple list filter which caches lookup-options to Redis.
13 Use as SimpleListFilter but implement lookups() method in generate_lookups() instead (both have same signature).
14 """
16 redis_key_name = "" # Redis key to store data. Default is class name.
17 redis_key_expires = 3600 # Redis data expiration in seconds
18 parameter_value_refresh_trigger = "_refresh" # special querystring parameter name which causes cache to be refreshed by force
20 def generate_lookups(self, request, model_admin):
21 """
22 Implement this method in derived class.
23 :return: Same format return as lookups(), i.e. list of filter option (value, label) pairs.
24 """
25 raise Exception("generate_lookups() must be implemented in RedisCachedSimpleListFilter derived class")
27 def get_redis_key_name(self) -> str:
28 base_name = self.redis_key_name if self.redis_key_name else str(self.__class__.__name__)
29 return base_name + "." + (get_language() or "")
31 def refresh_lookups(self, request, model_admin) -> List[Tuple[str, str]]:
32 out: List[Tuple[str, str]] = []
33 try:
34 out = self.generate_lookups(request, model_admin)
35 key_name = self.get_redis_key_name()
36 redis_set_json(key_name, out, ex=self.redis_key_expires)
37 logger.debug("%s cache refreshed", key_name)
38 except Exception as exc:
39 logger.error(exc)
40 return out
42 def lookups(self, request, model_admin):
43 try:
44 parameter_value = request.GET.get(self.parameter_name)
45 if parameter_value and str(parameter_value) == self.parameter_value_refresh_trigger:
46 return self.refresh_lookups(request, model_admin)
47 return redis_get_json(self.get_redis_key_name())
48 except Exception as exc:
49 logger.error(exc)
50 return self.refresh_lookups(request, model_admin)