Coverage for portality / bll / services / autochecks.py: 71%
84 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.crosswalks.application_form import ApplicationFormXWalk, JournalFormXWalk
2from portality.autocheck.resource_bundle import ResourceBundle
3from portality import models
5from portality.autocheck.checkers.issn_active import ISSNActive
6from portality.autocheck.checkers.keepers_registry import KeepersRegistry
8AUTOCHECK_PLUGINS = [
9 # (Active on Journal?, Active on Application?, Plugin Class)
10 (True, True, ISSNActive),
11 (True, True, KeepersRegistry)
12]
15class AutocheckService(object):
16 """
17 ~~Autochecks:Service->DOAJ:Service~~
18 """
20 def __init__(self, autocheck_plugins=None):
21 self._autocheck_plugins = autocheck_plugins if autocheck_plugins is not None else AUTOCHECK_PLUGINS
23 def autocheck_applications(self, application_ids=None, logger=None):
24 """
25 ~~Autochecks:Service->DOAJ:Service~~
26 """
27 resource_bundle = ResourceBundle()
28 if application_ids is None:
29 for application in models.Application.iterate():
30 self.autocheck_application(application, logger=logger, resource_bundle=resource_bundle)
31 else:
32 for application_id in application_ids:
33 application = models.Application.pull(application_id)
34 if application is None:
35 continue
36 self.autocheck_application(application, logger=logger, resource_bundle=resource_bundle)
38 def autocheck_application(self, application: models.Application, created_date=None, logger=None, resource_bundle=None):
39 if logger is None:
40 logger = lambda x: x # does nothing, just swallows the logs
42 if resource_bundle is None:
43 resource_bundle = ResourceBundle()
45 application_form = ApplicationFormXWalk.obj2form(application)
46 new_autochecks = models.Autocheck()
47 new_autochecks.application = application.id
49 if created_date is not None:
50 new_autochecks.set_created(created_date)
52 for j, a, klazz in self._autocheck_plugins:
53 if not a:
54 continue
56 checker = klazz()
57 logger("Running autocheck plugin {x}".format(x=checker.name()))
58 try:
59 checker.check(application_form, application, new_autochecks, resource_bundle, logger)
60 except Exception as e:
61 logger("Plugin {x} failed with error: {y}".format(x=checker.name(), y=str(e)))
63 new_autochecks.save()
64 logger("Saved new autocheck document {id}".format(id=new_autochecks.id))
66 models.Autocheck.delete_all_but_latest(application_id=application.id)
68 return new_autochecks
70 def autocheck_journals(self, journal_ids=None, logger=None):
71 """
72 ~~autochecks:Service->DOAJ:Service~~
73 """
74 resource_bundle = ResourceBundle()
75 if journal_ids is None:
76 for journal in models.Journal.iterate():
77 self.autocheck_journal(journal, logger=logger, resource_bundle=resource_bundle)
78 else:
79 for journal_id in journal_ids:
80 journal = models.Journal.pull(journal_id)
81 if journal is None:
82 continue
83 self.autocheck_journal(journal, logger=logger, resource_bundle=resource_bundle)
85 def autocheck_journal(self, journal: models.Journal, logger=None, resource_bundle=None):
86 if logger is None:
87 logger = lambda x: x # does nothing, just swallows the logs
89 if resource_bundle is None:
90 resource_bundle = ResourceBundle()
92 journal_form = JournalFormXWalk.obj2form(journal)
93 new_autochecks = models.Autocheck()
94 new_autochecks.journal = journal.id
96 for j, a, klazz in self._autocheck_plugins:
97 if not j:
98 continue
100 checker = klazz()
101 logger("Running autocheck plugin {x}".format(x=checker.name()))
102 checker.check(journal_form, journal, new_autochecks, resource_bundle, logger)
104 new_autochecks.save()
105 logger("Saved new autocheck document {id}".format(id=new_autochecks.id))
107 models.Autocheck.delete_all_but_latest(journal_id=journal.id)
109 return new_autochecks
111 def dismiss(self, autocheck_set_id, autocheck_id):
112 autochecks = models.Autocheck.pull(autocheck_set_id)
113 if autochecks is None:
114 return False
115 autochecks.dismiss(autocheck_id)
116 autochecks.save()
117 return True
119 def undismiss(self, autocheck_set_id, autocheck_id):
120 autochecks = models.Autocheck.pull(autocheck_set_id)
121 if autochecks is None:
122 return False
123 autochecks.undismiss(autocheck_id)
124 autochecks.save()
125 return True