Coverage for src / mesh / ojs / import_round.py: 0%
40 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-05-04 12:41 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-05-04 12:41 +0000
1import logging
2from typing import TYPE_CHECKING
4from lxml import etree
6from mesh.models import EditorialDecision, SubmissionVersion, User
7from mesh.ojs import NSMAP, OJS_DECISION_MAPPING, OJS_STATUS_TO_DECISION
8from mesh.ojs.import_file import (
9 import_ojs_file,
10 version_additional_file_factory,
11 version_main_file_factory,
12)
13from mesh.ojs.lxml_utils import (
14 find_or_raise,
15 findall_xpath,
16 get_and_make_test_email_or_raise,
17 get_or_raise,
18 str_to_datetime,
19)
21if TYPE_CHECKING:
22 from mesh.models import Submission
24logger = logging.getLogger(__name__)
27def create_editorial_decision(round: "etree._Element"):
28 decision_str = get_or_raise(round, "status_hr")
29 if decision_str == "Pending Reviews":
30 return None, None, None
31 if decision_str == "Pending Recommendations":
32 return None, None, None
33 decision_element = find_or_raise(
34 round, f"decision[@decision_hr='{OJS_STATUS_TO_DECISION[decision_str]}']"
35 )
36 decision_date = str_to_datetime(get_or_raise(decision_element, "date_decided"))
37 decision = EditorialDecision(
38 value=OJS_DECISION_MAPPING[get_or_raise(decision_element, "decision_hr")].value
39 )
40 decision_user = User.objects.get(
41 email=get_and_make_test_email_or_raise(decision_element, "editor_email")
42 )
43 decision.override_saved_date(
44 date_created=decision_date,
45 date_last_modified=decision_date,
46 created_by_user=decision_user,
47 last_modified_by_user=decision_user,
48 )
49 return decision, decision_user, decision_date
52def import_ojs_round_files(
53 round: "etree._Element",
54 version: "SubmissionVersion",
55 path: str,
56 user: "User",
57 stage="review_file",
58):
59 version_files_search = round.findall(
60 f"workflow_file[@stage='{stage}'][@genre='Manuscript']", NSMAP
61 )
62 if len(version_files_search) > 1:
63 raise ValueError("Found multiple main file candidates")
64 if len(version_files_search) == 0:
65 raise ValueError("Couldn't find main file")
66 version_main_file = version_files_search[0]
68 import_ojs_file(
69 version_main_file,
70 version_main_file_factory(version),
71 user,
72 path,
73 )
75 version.override_saved_date(
76 date_created=str_to_datetime(get_or_raise(version_main_file, "created_at"))
77 )
78 version.save()
80 version_additional_files = findall_xpath(
81 round, f"ojs:workflow_file[@stage='{stage}'][not(@genre='Manuscript')]"
82 )
84 for version_file_element in version_additional_files:
85 import_ojs_file(
86 version_file_element,
87 version_additional_file_factory(version),
88 user,
89 path,
90 )
92 version.save()
95def import_ojs_round_decision(
96 round: "etree._Element", submission: "Submission", version: "SubmissionVersion"
97):
98 decision, decision_user, decision_date = create_editorial_decision(round)
99 if decision is not None:
100 decision.version = version
101 decision.save()
102 submission.apply_editorial_decision(decision, decision_user, date=decision_date)