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

1from portality.crosswalks.application_form import ApplicationFormXWalk, JournalFormXWalk 

2from portality.autocheck.resource_bundle import ResourceBundle 

3from portality import models 

4 

5from portality.autocheck.checkers.issn_active import ISSNActive 

6from portality.autocheck.checkers.keepers_registry import KeepersRegistry 

7 

8AUTOCHECK_PLUGINS = [ 

9 # (Active on Journal?, Active on Application?, Plugin Class) 

10 (True, True, ISSNActive), 

11 (True, True, KeepersRegistry) 

12] 

13 

14 

15class AutocheckService(object): 

16 """ 

17 ~~Autochecks:Service->DOAJ:Service~~ 

18 """ 

19 

20 def __init__(self, autocheck_plugins=None): 

21 self._autocheck_plugins = autocheck_plugins if autocheck_plugins is not None else AUTOCHECK_PLUGINS 

22 

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) 

37 

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 

41 

42 if resource_bundle is None: 

43 resource_bundle = ResourceBundle() 

44 

45 application_form = ApplicationFormXWalk.obj2form(application) 

46 new_autochecks = models.Autocheck() 

47 new_autochecks.application = application.id 

48 

49 if created_date is not None: 

50 new_autochecks.set_created(created_date) 

51 

52 for j, a, klazz in self._autocheck_plugins: 

53 if not a: 

54 continue 

55 

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))) 

62 

63 new_autochecks.save() 

64 logger("Saved new autocheck document {id}".format(id=new_autochecks.id)) 

65 

66 models.Autocheck.delete_all_but_latest(application_id=application.id) 

67 

68 return new_autochecks 

69 

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) 

84 

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 

88 

89 if resource_bundle is None: 

90 resource_bundle = ResourceBundle() 

91 

92 journal_form = JournalFormXWalk.obj2form(journal) 

93 new_autochecks = models.Autocheck() 

94 new_autochecks.journal = journal.id 

95 

96 for j, a, klazz in self._autocheck_plugins: 

97 if not j: 

98 continue 

99 

100 checker = klazz() 

101 logger("Running autocheck plugin {x}".format(x=checker.name())) 

102 checker.check(journal_form, journal, new_autochecks, resource_bundle, logger) 

103 

104 new_autochecks.save() 

105 logger("Saved new autocheck document {id}".format(id=new_autochecks.id)) 

106 

107 models.Autocheck.delete_all_but_latest(journal_id=journal.id) 

108 

109 return new_autochecks 

110 

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 

118 

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