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
« 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
9import redis
11from portality.core import app
14class HueyJobData:
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
20 @property
21 def is_scheduled(self):
22 return self.schedule_time is None
24 @property
25 def bgjob_action(self):
26 return re.sub(r'^queue_task_(scheduled_)?', '', self.queue_name)
28 @property
29 def bgjob_id(self):
30 if self.args:
31 return self.args[0][0]
32 return None
34 @classmethod
35 def from_redis(cls, redis_row):
36 return HueyJobData(pickle.loads(redis_row))
38 def as_redis(self):
39 return pickle.dumps(self.data)
42HUEY_REDIS_DOAJMAINQUEUE = 'huey.redis.doajmainqueue'
43HUEY_REDIS_DOAJLONGRUNNING = 'huey.redis.doajlongrunning'
44HUEY_REDIS_KEYS = [HUEY_REDIS_DOAJMAINQUEUE, HUEY_REDIS_DOAJLONGRUNNING]
47class HueyJobService:
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
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
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)
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