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

1import logging 

2from typing import TYPE_CHECKING 

3 

4from lxml import etree 

5 

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) 

20 

21if TYPE_CHECKING: 

22 from mesh.models import Submission 

23 

24logger = logging.getLogger(__name__) 

25 

26 

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 

50 

51 

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] 

67 

68 import_ojs_file( 

69 version_main_file, 

70 version_main_file_factory(version), 

71 user, 

72 path, 

73 ) 

74 

75 version.override_saved_date( 

76 date_created=str_to_datetime(get_or_raise(version_main_file, "created_at")) 

77 ) 

78 version.save() 

79 

80 version_additional_files = findall_xpath( 

81 round, f"ojs:workflow_file[@stage='{stage}'][not(@genre='Manuscript')]" 

82 ) 

83 

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 ) 

91 

92 version.save() 

93 

94 

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)