Coverage for portality / bll / services / huey_job.py: 0%

46 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-05-04 09:41 +0100

1""" 

2some function for huey background job 

3""" 

4import itertools 

5import pickle 

6import re 

7from typing import Iterator 

8 

9import redis 

10 

11from portality.core import app 

12 

13 

14class HueyJobData: 

15 

16 def __init__(self, data: tuple): 

17 self.data = data 

18 self.huey_id, self.queue_name, self.schedule_time, self.retries, self.retry_delay, self.args, *_ = data 

19 

20 @property 

21 def is_scheduled(self): 

22 return self.schedule_time is None 

23 

24 @property 

25 def bgjob_action(self): 

26 return re.sub(r'^queue_task_(scheduled_)?', '', self.queue_name) 

27 

28 @property 

29 def bgjob_id(self): 

30 if self.args: 

31 return self.args[0][0] 

32 return None 

33 

34 @classmethod 

35 def from_redis(cls, redis_row): 

36 return HueyJobData(pickle.loads(redis_row)) 

37 

38 def as_redis(self): 

39 return pickle.dumps(self.data) 

40 

41 

42HUEY_REDIS_DOAJMAINQUEUE = 'huey.redis.doajmainqueue' 

43HUEY_REDIS_DOAJLONGRUNNING = 'huey.redis.doajlongrunning' 

44HUEY_REDIS_KEYS = [HUEY_REDIS_DOAJMAINQUEUE, HUEY_REDIS_DOAJLONGRUNNING] 

45 

46 

47class HueyJobService: 

48 

49 def create_redis_client(self): 

50 client = redis.StrictRedis(host=app.config['REDIS_HOST'], port=app.config['REDIS_PORT'], db=0) 

51 return client 

52 

53 def find_all_huey_jobs(self, client=None) -> Iterator[HueyJobData]: 

54 client = client or self.create_redis_client() 

55 huey_rows = itertools.chain.from_iterable((client.lrange(k, 0, -1) 

56 for k in HUEY_REDIS_KEYS)) 

57 huey_rows = (HueyJobData.from_redis(r) for r in huey_rows) 

58 return huey_rows 

59 

60 def find_queued_huey_jobs(self, client=None) -> Iterator[HueyJobData]: 

61 client = client or self.create_redis_client() 

62 return (r for r in self.find_all_huey_jobs(client=client) if not r.is_scheduled) 

63 

64 def rm_huey_job_from_redis(self, huey_job_data: 'HueyJobData', client=None): 

65 client = client or self.create_redis_client() 

66 for key in ['huey.redis.doajmainqueue', 'huey.redis.doajlongrunning']: 

67 if client.lrem(key, 1, huey_job_data.as_redis()): 

68 break