Coverage for portality / autocheck / checkers / issn_active.py: 100%
58 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-05 00:09 +0100
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-05 00:09 +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
8class ISSNChecker(Checker):
10 UNABLE_TO_ACCESS = "unable_to_access"
12 def retrieve_from_source(self, form, resources, autochecks, logger):
13 source = resources.resource(ISSNOrg)
15 eissn = form.get("eissn")
16 pissn = form.get("pissn")
18 eissn_data = None
19 pissn_data = None
20 eissn_url = None
21 pissn_url = None
22 eissn_fail = False
23 pissn_fail = False
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
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
57 return eissn, eissn_url, eissn_data, eissn_fail, pissn, pissn_url, pissn_data, pissn_fail
60class ISSNActive(ISSNChecker):
61 __identity__ = "issn_active"
63 NOT_FOUND = "not_found"
64 FULLY_VALIDATED = "fully_validated"
65 NOT_VALIDATED = "not_validated"
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 )
99 def check(self, form: dict,
100 jla: JournalLikeObject,
101 autochecks: Autocheck,
102 resources: ResourceBundle,
103 logger: Callable):
105 eissn, eissn_url, eissn_data, eissn_fail, pissn, pissn_url, pissn_data, pissn_fail = self.retrieve_from_source(form, resources, autochecks, logger)
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)