Coverage for portality / autocheck / checkers / issn_active.py: 100%

58 statements  

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

1from portality.models import JournalLikeObject, Autocheck 

2from portality.autocheck.checker import Checker 

3from portality.autocheck.resource_bundle import ResourceBundle, ResourceUnavailable 

4from portality.autocheck.resources.issn_org import ISSNOrg 

5from typing import Callable 

6 

7 

8class ISSNChecker(Checker): 

9 

10 UNABLE_TO_ACCESS = "unable_to_access" 

11 

12 def retrieve_from_source(self, form, resources, autochecks, logger): 

13 source = resources.resource(ISSNOrg) 

14 

15 eissn = form.get("eissn") 

16 pissn = form.get("pissn") 

17 

18 eissn_data = None 

19 pissn_data = None 

20 eissn_url = None 

21 pissn_url = None 

22 eissn_fail = False 

23 pissn_fail = False 

24 

25 if eissn is not None: 

26 eissn_url = source.reference_url(issn=eissn) 

27 logger("Looking up eissn at {x}".format(x=eissn_url)) 

28 try: 

29 eissn_data = source.fetch(issn=eissn) 

30 logger("Data received for eissn from {x}".format(x=eissn_url)) 

31 except ResourceUnavailable: 

32 logger("Unable to resolve eissn at {x}".format(x=eissn_url)) 

33 autochecks.add_check( 

34 field="eissn", 

35 original_value=eissn, 

36 advice=self.UNABLE_TO_ACCESS, 

37 reference_url=eissn_url 

38 ) 

39 eissn_fail = True 

40 

41 if pissn is not None: 

42 pissn_url = source.reference_url(issn=pissn) 

43 logger("Looking up pissn at {x}".format(x=pissn_url)) 

44 try: 

45 pissn_data = source.fetch(issn=pissn) 

46 logger("Data received for pissn from {x}".format(x=pissn_url)) 

47 except ResourceUnavailable: 

48 logger("Unable to resolve pissn at {x}".format(x=pissn_url)) 

49 autochecks.add_check( 

50 field="pissn", 

51 original_value=pissn, 

52 advice=self.UNABLE_TO_ACCESS, 

53 reference_url=pissn_url 

54 ) 

55 pissn_fail = True 

56 

57 return eissn, eissn_url, eissn_data, eissn_fail, pissn, pissn_url, pissn_data, pissn_fail 

58 

59 

60class ISSNActive(ISSNChecker): 

61 __identity__ = "issn_active" 

62 

63 NOT_FOUND = "not_found" 

64 FULLY_VALIDATED = "fully_validated" 

65 NOT_VALIDATED = "not_validated" 

66 

67 def _apply_rule(self, field, value, data, fail, url, logger, autochecks): 

68 if value is not None: 

69 if data is None: 

70 if not fail: 

71 logger("{y} not registered at {x}".format(y=field, x=url)) 

72 autochecks.add_check( 

73 field=field, 

74 original_value=value, 

75 advice=self.NOT_FOUND, 

76 reference_url=url, 

77 checked_by=self.__identity__ 

78 ) 

79 else: 

80 if data.is_registered(): 

81 logger("{y} confirmed as fully validated at {x}".format(y=value, x=url)) 

82 autochecks.add_check( 

83 field=field, 

84 original_value=value, 

85 advice=self.FULLY_VALIDATED, 

86 reference_url=url, 

87 checked_by=self.__identity__ 

88 ) 

89 else: 

90 logger("{y} is not fully validated at {x}".format(y=value, x=url)) 

91 autochecks.add_check( 

92 field=field, 

93 original_value=value, 

94 advice=self.NOT_VALIDATED, 

95 reference_url=url, 

96 checked_by=self.__identity__ 

97 ) 

98 

99 def check(self, form: dict, 

100 jla: JournalLikeObject, 

101 autochecks: Autocheck, 

102 resources: ResourceBundle, 

103 logger: Callable): 

104 

105 eissn, eissn_url, eissn_data, eissn_fail, pissn, pissn_url, pissn_data, pissn_fail = self.retrieve_from_source(form, resources, autochecks, logger) 

106 

107 self._apply_rule("eissn", eissn, eissn_data, eissn_fail, eissn_url, logger, autochecks) 

108 self._apply_rule("pissn", pissn, pissn_data, pissn_fail, pissn_url, logger, autochecks)