Coverage for portality / tasks / find_discontinued_soon.py: 84%

55 statements  

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

1from portality.core import app 

2from portality.bll import DOAJ 

3from portality.lib import dates 

4from portality import models 

5 

6from portality.tasks.redis_huey import scheduled_short_queue as queue 

7 

8from portality.background import BackgroundTask, BackgroundApi 

9from portality.tasks.helpers import background_helper 

10from portality.ui.messages import Messages 

11from portality import constants 

12 

13 

14class DiscontinuedSoonQuery: 

15 def __init__(self): 

16 self._delta = app.config.get('DISCONTINUED_DATE_DELTA', 0) 

17 self._date = dates.days_after_now(days=self._delta) 

18 

19 def query(self): 

20 return { 

21 "query": { 

22 "bool": { 

23 "filter": { 

24 "bool": { 

25 "must": [ 

26 {"term": {"bibjson.discontinued_date": dates.format(self._date, format="%Y-%m-%d")}}, 

27 {"term": {"admin.in_doaj": True}} 

28 ] 

29 } 

30 } 

31 } 

32 } 

33 } 

34 

35 

36# ~~FindDiscontinuedSoonBackgroundTask:Task~~ 

37class FindDiscontinuedSoonBackgroundTask(BackgroundTask): 

38 __action__ = "find_discontinued_soon" 

39 

40 def __init__(self, job): 

41 super(FindDiscontinuedSoonBackgroundTask, self).__init__(job) 

42 self._delta = app.config.get('DISCONTINUED_DATE_DELTA', 0) 

43 self._date = dates.days_after_now(days=self._delta) 

44 

45 def find_journals_discontinuing_soon(self): 

46 jdata = [] 

47 

48 for journal in models.Journal.iterate(q=DiscontinuedSoonQuery().query(), keepalive='5m', wrap=True): 

49 # ~~->Journal:Model~~ 

50 jdata.append(journal.id) 

51 self.background_job.add_audit_message(Messages.DISCONTINUED_JOURNAL_FOUND_LOG.format(id=journal.id)) 

52 

53 return jdata 

54 

55 def run(self): 

56 journals = self.find_journals_discontinuing_soon() 

57 if len(journals): 

58 for j in journals: 

59 DOAJ.eventsService().trigger(models.Event( 

60 constants.EVENT_JOURNAL_DISCONTINUING_SOON, 

61 self.background_job.user, 

62 { 

63 "journal": j, 

64 "discontinue_date": self._date 

65 })) 

66 self.background_job.add_audit_message(Messages.DISCONTINUED_JOURNALS_FOUND_NOTIFICATION_SENT_LOG) 

67 else: 

68 self.background_job.add_audit_message(Messages.NO_DISCONTINUED_JOURNALS_FOUND_LOG) 

69 

70 def cleanup(self): 

71 """ 

72 Cleanup after a successful OR failed run of the task 

73 :return: 

74 """ 

75 pass 

76 

77 @classmethod 

78 def prepare(cls, username, **kwargs): 

79 """ 

80 Take an arbitrary set of keyword arguments and return an instance of a BackgroundJob, 

81 or fail with a suitable exception 

82 

83 :param username: User account for this task to complete as 

84 :param kwargs: arbitrary keyword arguments pertaining to this task type 

85 :return: a BackgroundJob instance representing this task 

86 """ 

87 

88 # first prepare a job record 

89 job = background_helper.create_job(username, cls.__action__, 

90 queue_id=huey_helper.queue_id, ) 

91 return job 

92 

93 @classmethod 

94 def submit(cls, background_job): 

95 """ 

96 Submit the specified BackgroundJob to the background queue 

97 

98 :param background_job: the BackgroundJob instance 

99 :return: 

100 """ 

101 background_job.save() 

102 find_discontinued_soon.schedule(args=(background_job.id,), delay=app.config.get('HUEY_ASYNC_DELAY', 10)) 

103 

104 

105huey_helper = FindDiscontinuedSoonBackgroundTask.create_huey_helper(queue) 

106 

107 

108@huey_helper.register_schedule 

109def scheduled_find_discontinued_soon(): 

110 user = app.config.get("SYSTEM_USERNAME") 

111 job = FindDiscontinuedSoonBackgroundTask.prepare(user) 

112 FindDiscontinuedSoonBackgroundTask.submit(job) 

113 

114 

115@huey_helper.register_execute(is_load_config=False) 

116def find_discontinued_soon(job_id): 

117 job = models.BackgroundJob.pull(job_id) 

118 task = FindDiscontinuedSoonBackgroundTask(job) 

119 BackgroundApi.execute(task)