Coverage for src / mesh / ojs / import_review.py: 0%
48 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-08-11 09:47 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-08-11 09:47 +0000
1import logging
2from typing import TYPE_CHECKING
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)
14if TYPE_CHECKING:
15 from lxml import etree
17 from mesh.models import SubmissionVersion
19logger = logging.getLogger(__name__)
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 )
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
54 date_confirmed = review_assignment.get("date_confirmed")
55 if not date_confirmed:
56 continue
58 answer_date = str_to_datetime(date_confirmed)
59 review_accepted = get_or_raise(review_assignment, "declined") == "0"
60 review.accept(
61 review_accepted,
62 accept_comment="",
63 user=reviewer,
64 date=answer_date,
65 )
67 if not review_accepted:
68 continue
70 review_files = review_assignment.findall("workflow_file", NSMAP)
72 for file in review_files:
73 import_ojs_file(
74 file,
75 review_file_factory(review),
76 reviewer,
77 path,
78 )
79 recommendation_int = review_assignment.get("recommendation")
80 if recommendation_int is None:
81 continue
83 try:
84 review.recommendation = OJS_RECOMMENDATION_MAPPING[
85 get_or_raise(review_assignment, "recommendation")
86 ].value
87 except KeyError:
88 if recommendation_int == "6":
89 logger.info(
90 f"Review assignment : {recommendation_int} is not a review but associated with an overdue review."
91 )
92 continue
93 else:
94 raise ValueError(f"Unknown recommendation value {recommendation_int}")
95 date = str_to_datetime(get_or_raise(review_assignment, "date_completed"))
96 review.submit(
97 user=reviewer,
98 date=date,
99 )
101 review.override_saved_date(date_last_modified=date, last_modified_by_user=reviewer)
102 review.save()