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
« 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
6from portality.tasks.redis_huey import scheduled_short_queue as queue
8from portality.background import BackgroundTask, BackgroundApi
9from portality.tasks.helpers import background_helper
10from portality.ui.messages import Messages
11from portality import constants
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)
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 }
36# ~~FindDiscontinuedSoonBackgroundTask:Task~~
37class FindDiscontinuedSoonBackgroundTask(BackgroundTask):
38 __action__ = "find_discontinued_soon"
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)
45 def find_journals_discontinuing_soon(self):
46 jdata = []
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))
53 return jdata
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)
70 def cleanup(self):
71 """
72 Cleanup after a successful OR failed run of the task
73 :return:
74 """
75 pass
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
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 """
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
93 @classmethod
94 def submit(cls, background_job):
95 """
96 Submit the specified BackgroundJob to the background queue
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))
105huey_helper = FindDiscontinuedSoonBackgroundTask.create_huey_helper(queue)
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)
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)