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
« prev ^ index » next coverage.py v7.13.1, created at 2026-05-04 12:41 +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 return
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 )
66 if not review_accepted:
67 return
69 review_files = review_assignment.findall("workflow_file", NSMAP)
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
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 )
100 review.override_saved_date(date_last_modified=date, last_modified_by_user=reviewer)
101 review.save()