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

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 

6 

7logger = logging.getLogger(__name__) 

8 

9 

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 """ 

15 

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 

19 

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") 

26 

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 "") 

30 

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 

41 

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)