Coverage for src / mesh / ojs / import_review.py: 0%

47 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 mesh.models import User 

5from mesh.models.crud import create_review_request 

6from mesh.ojs import NSMAP, OJS_RECOMMENDATION_MAPPING 

7from mesh.ojs.import_file import import_ojs_file, review_file_factory 

8from mesh.ojs.lxml_utils import ( 

9 get_and_make_test_email_or_raise, 

10 get_or_raise, 

11 str_to_datetime, 

12) 

13 

14if TYPE_CHECKING: 

15 from lxml import etree 

16 

17 from mesh.models import SubmissionVersion 

18 

19logger = logging.getLogger(__name__) 

20 

21 

22def import_ojs_reviews(review_round: "etree._Element", version: "SubmissionVersion", path: str): 

23 for review_assignment in review_round.findall("review_assignment", NSMAP): 

24 # TODO : detect assigning editor ? 

25 email = get_and_make_test_email_or_raise(review_assignment, "reviewer_email") 

26 try: 

27 reviewer = User.objects.get(email=email) 

28 except User.DoesNotExist: 

29 logger.error(f"Couldn't find reviewer {email} in database") 

30 continue 

31 review = create_review_request( 

32 None, 

33 reviewer, 

34 version, 

35 date=str_to_datetime(get_or_raise(review_assignment, "date_assigned")), 

36 date_response_due=str_to_datetime( 

37 get_or_raise(review_assignment, "date_response_due") 

38 ), 

39 date_review_due=str_to_datetime(get_or_raise(review_assignment, "date_due")), 

40 ) 

41 

42 comments_search = review_assignment.findall( 

43 "submission_comment[@viewable='1']/comments", NSMAP 

44 ) 

45 if len(comments_search) > 1: 

46 raise ValueError("Multiple submission comments found") 

47 if len(comments_search) == 0: 

48 logger.warning( 

49 f"Comments not found for version {version.pk} of submission {version.submission.pk}" 

50 ) 

51 else: 

52 review.comment = comments_search[0].text 

53 

54 date_confirmed = review_assignment.get("date_confirmed") 

55 if not date_confirmed: 

56 return 

57 

58 review_accepted = get_or_raise(review_assignment, "declined") == "0" 

59 review.accept( 

60 review_accepted, 

61 accept_comment="", 

62 user=reviewer, 

63 date=str_to_datetime(date_confirmed), 

64 ) 

65 

66 if not review_accepted: 

67 return 

68 

69 review_files = review_assignment.findall("workflow_file", NSMAP) 

70 

71 for file in review_files: 

72 import_ojs_file( 

73 file, 

74 review_file_factory(review), 

75 reviewer, 

76 path, 

77 ) 

78 recommendation_int = review_assignment.get("recommendation") 

79 if recommendation_int is None: 

80 return 

81 

82 try: 

83 review.recommendation = OJS_RECOMMENDATION_MAPPING[ 

84 get_or_raise(review_assignment, "recommendation") 

85 ].value 

86 except KeyError: 

87 if recommendation_int == "6": 

88 logger.info( 

89 f"Review assignment : {recommendation_int} is not a review but associated with an overdue review." 

90 ) 

91 continue 

92 else: 

93 raise ValueError(f"Unknown recommendation value {recommendation_int}") 

94 date = str_to_datetime(get_or_raise(review_assignment, "date_completed")) 

95 review.submit( 

96 user=reviewer, 

97 date=date, 

98 ) 

99 

100 review.override_saved_date(date_last_modified=date, last_modified_by_user=reviewer) 

101 review.save()