Skip to content

Commit 7f9de49

Browse files
committed
pkp#9453 Let reviewers view their recommendations for previous rounds
1 parent 80eb1bc commit 7f9de49

File tree

9 files changed

+472
-0
lines changed

9 files changed

+472
-0
lines changed

classes/log/SubmissionEmailLogDAO.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,35 @@ public function getBySubmissionId($submissionId)
6666
return $this->getByAssoc(Application::ASSOC_TYPE_SUBMISSION, $submissionId);
6767
}
6868

69+
/**
70+
* Get submission email log entries by submission ID, event type and sender ID
71+
*
72+
* @param int $submissionId
73+
* @param int $eventType SubmissionEmailLogEntry::SUBMISSION_EMAIL_*
74+
* @param int $senderId Return only emails sent by this user.
75+
*
76+
* @return DAOResultFactory<SubmissionEmailLogEntry>
77+
*/
78+
function getBySenderId($submissionId, $eventType, $senderId) {
79+
$result = $this->retrieveRange(
80+
'SELECT e.*
81+
FROM email_log e
82+
WHERE
83+
e.assoc_type = ? AND
84+
e.assoc_id = ? AND
85+
e.event_type = ? AND
86+
e.sender_id = ?',
87+
[
88+
Application::ASSOC_TYPE_SUBMISSION,
89+
(int) $submissionId,
90+
(int) $eventType,
91+
(int) $senderId
92+
]
93+
);
94+
95+
return new DAOResultFactory($result, $this, 'build');
96+
}
97+
6998
/**
7099
* Create a log entry from data in a Mailable class
71100
*
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
<?php
2+
3+
/**
4+
* @defgroup controllers_review Review Handlers
5+
*/
6+
7+
/**
8+
* @file controllers/review/ReviewRoundModalHandler.inc.php
9+
*
10+
* Copyright (c) 2014-2021 Simon Fraser University
11+
* Copyright (c) 2003-2021 John Willinsky
12+
* Copyright (c) 2021 Université Laval
13+
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
14+
*
15+
* @class ReviewRoundModalHandler
16+
* @ingroup controllers_review
17+
*
18+
* @brief Reviewer review round info handler.
19+
*/
20+
21+
namespace PKP\controllers\review;
22+
23+
use APP\facades\Repo;
24+
use APP\handler\Handler;
25+
use APP\template\TemplateManager;
26+
use Exception;
27+
use PKP\core\JSONMessage;
28+
use PKP\core\PKPRequest;
29+
use PKP\log\SubmissionEmailLogEntry;
30+
use PKP\security\authorization\RoleBasedHandlerOperationPolicy;
31+
use PKP\db\DAORegistry;
32+
use PKP\security\Role;
33+
34+
class ReviewRoundModalHandler extends Handler
35+
{
36+
/**
37+
* Constructor
38+
*/
39+
function __construct()
40+
{
41+
parent::__construct();
42+
43+
$this->addRoleAssignment(
44+
[Role::ROLE_ID_REVIEWER],
45+
['viewRoundInfo', 'closeModal']
46+
);
47+
}
48+
49+
//
50+
// Implement template methods from PKPHandler.
51+
//
52+
53+
/**
54+
* @copydoc PKPHandler::authorize()
55+
*/
56+
function authorize($request, &$args, $roleAssignments): bool
57+
{
58+
$this->addPolicy(new RoleBasedHandlerOperationPolicy(
59+
$request,
60+
[Role::ROLE_ID_REVIEWER],
61+
['viewRoundInfo', 'close']
62+
));
63+
64+
return parent::authorize($request, $args, $roleAssignments);
65+
}
66+
67+
//
68+
// Public operations
69+
//
70+
71+
/**
72+
* Display the review round info modal.
73+
*
74+
* @param array $args
75+
* @param PKPRequest $request
76+
*
77+
* @return JSONMessage JSON object
78+
* @throws Exception
79+
*/
80+
function viewRoundInfo($args, $request)
81+
{
82+
$this->setupTemplate($request);
83+
84+
$submission = Repo::submission()->get($args['submissionId']);
85+
$submissionId = $submission->getId();
86+
$reviewerId = $request->getUser()->getId();
87+
88+
$reviewAssignments = Repo::reviewAssignment()->getCollector()
89+
->filterByReviewerIds([$reviewerId])
90+
->getMany();
91+
$declinedReviewAssignments = array();
92+
foreach ($reviewAssignments as $submissionReviewAssignment) {
93+
if ($submissionReviewAssignment->getDeclined() and $submissionId == $submissionReviewAssignment->getSubmissionId()) {
94+
$declinedReviewAssignments[] = $submissionReviewAssignment;
95+
}
96+
}
97+
98+
$reviewAssignment = Repo::reviewAssignment()->getCollector()
99+
->filterByReviewRoundIds([$args['reviewRoundId']])
100+
->filterByReviewerIds([$reviewerId])
101+
->filterByContextIds([$request->getContext()->getId()])
102+
->getMany()
103+
->first();
104+
$submissionCommentDao = DAORegistry::getDAO('SubmissionCommentDAO');
105+
$reviewComments = $submissionCommentDao->getReviewerCommentsByReviewerId($submissionId, $reviewerId, $reviewAssignment->getId());
106+
107+
$reviewRoundNumber = $args['reviewRoundNumber'];
108+
$submissionEmailLogDao = DAORegistry::getDAO('SubmissionEmailLogDAO');
109+
$emailLogs = $submissionEmailLogDao
110+
->getBySenderId($submissionId, SubmissionEmailLogEntry::SUBMISSION_EMAIL_REVIEW_DECLINE, $reviewerId)
111+
->toArray();
112+
$declineEmail = null;
113+
$i = 0;
114+
foreach ($declinedReviewAssignments as $declinedReviewAssignment) {
115+
if (isset($emailLogs[$i]) && $reviewRoundNumber == $declinedReviewAssignment->getRound()) {
116+
$declineEmail = $emailLogs[$i];
117+
}
118+
$i++;
119+
}
120+
121+
$displayFilesGrid = true;
122+
$lastReviewAssignment = Repo::reviewAssignment()->getCollector()
123+
->filterBySubmissionIds([$submissionId])
124+
->filterByReviewerIds([$reviewerId])
125+
->filterByLastReviewRound(true)
126+
->getMany()
127+
->first();
128+
if($lastReviewAssignment->getDeclined() == 1) {
129+
$displayFilesGrid = false;
130+
}
131+
132+
$templateMgr = TemplateManager::getManager($request);
133+
$templateMgr->assign([
134+
'submission' => $submission,
135+
'reviewAssignment' => $reviewAssignment,
136+
'reviewRoundNumber' => $reviewRoundNumber,
137+
'reviewRoundId' => $args['reviewRoundId'],
138+
'reviewComments' => $reviewComments,
139+
'declineEmail' => $declineEmail,
140+
'displayFilesGrid' => $displayFilesGrid
141+
]);
142+
143+
return $templateMgr->fetchJson('controllers/modals/reviewRound/reviewRound.tpl');
144+
}
145+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?php
2+
3+
/**
4+
* @file controllers/review/linkAction/ReviewRoundModalLinkAction.php
5+
*
6+
* Copyright (c) 2014-2021 Simon Fraser University
7+
* Copyright (c) 2003-2021 John Willinsky
8+
* Copyright (c) 2021 Université Laval
9+
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
10+
*
11+
* @class ReviewRoundModalLinkAction
12+
*
13+
* @ingroup controllers_review_linkAction
14+
*
15+
* @brief An action to show a modal with the information about a review round.
16+
*/
17+
18+
namespace PKP\controllers\review\linkAction;
19+
20+
use APP\core\Request;
21+
use Exception;
22+
use PKP\core\PKPApplication;
23+
use PKP\linkAction\LinkAction;
24+
use PKP\linkAction\request\AjaxModal;
25+
use APP\facades\Repo;
26+
27+
class ReviewRoundModalLinkAction extends LinkAction
28+
{
29+
/** @var int The round number */
30+
public int $_round;
31+
32+
/**
33+
* Constructor
34+
*
35+
* @param Request $request
36+
* @param int $submissionId The ID of the submission to present link for
37+
* @param int $reviewRoundId The ID of the review round
38+
* @param int $reviewRoundNumber The round number to show information about
39+
* @throws Exception
40+
*/
41+
public function __construct($request, $submissionId, $reviewRoundId, $reviewRoundNumber)
42+
{
43+
$this->_round = $reviewRoundNumber;
44+
45+
$submission = Repo::submission()->get($submissionId);
46+
$submissionTitle = $submission->getCurrentPublication()->getLocalizedTitle();
47+
$router = $request->getRouter();
48+
$actionArgs = [
49+
'submissionId' => $submissionId,
50+
'reviewRoundId' => $reviewRoundId,
51+
'reviewRoundNumber' => $reviewRoundNumber
52+
];
53+
54+
$ajaxModal = new AjaxModal(
55+
$router->getDispatcher()->url(
56+
$request,
57+
PKPApplication::ROUTE_COMPONENT,
58+
null,
59+
'review.ReviewRoundModalHandler',
60+
'viewRoundInfo',
61+
null,
62+
$actionArgs
63+
),
64+
__(
65+
'reviewer.submission.reviewRound.info.modal.title',
66+
[
67+
'reviewRoundNumber' => $reviewRoundNumber,
68+
'submissionTitle' => $submissionTitle
69+
]
70+
),
71+
'modal_information'
72+
);
73+
74+
// Configure the link action.
75+
parent::__construct('viewRoundInfo', $ajaxModal);
76+
}
77+
78+
/**
79+
* Get the review round number.
80+
*
81+
* @return int
82+
*/
83+
function getRound(): int
84+
{
85+
return $this->_round;
86+
}
87+
}

locale/en/reviewer.po

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,24 @@ msgstr ""
9494
"Upload files you would like the editor and/or author to consult, including "
9595
"revised versions of the original review file(s)."
9696

97+
msgid "reviewer.submission.reviewRound.info"
98+
msgstr "Read my former reviews: "
99+
100+
msgid "reviewer.submission.reviewRound.info.modal.title"
101+
msgstr "Evaluation cycle {$reviewRoundNumber} : {$submissionTitle}"
102+
103+
msgid "reviewer.submission.reviewRound.info.history"
104+
msgstr "Review history"
105+
106+
msgid "reviewer.submission.comments.authorAndEditor"
107+
msgstr "Author and editor"
108+
109+
msgid "reviewer.submission.comments.editorOnly"
110+
msgstr "Pour la rédaction seulement"
111+
112+
msgid "reviewer.submission.comments.review"
113+
msgstr "Review"
114+
97115
msgid "reviewer.complete"
98116
msgstr "Review Submitted"
99117

locale/fr_CA/reviewer.po

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,24 @@ msgstr ""
107107
"consulter, y compris les versions révisées des fichiers d'évaluation "
108108
"originaux."
109109

110+
msgid "reviewer.submission.reviewRound.info"
111+
msgstr "Consulter mes évaluations précédentes : "
112+
113+
msgid "reviewer.submission.reviewRound.info.modal.title"
114+
msgstr "Évaluation cycle {$reviewRoundNumber} : {$submissionTitle}"
115+
116+
msgid "reviewer.submission.reviewRound.info.history"
117+
msgstr "Historique d'évaluation"
118+
119+
msgid "reviewer.submission.comments.authorAndEditor"
120+
msgstr "Pour l'auteur et la rédaction"
121+
122+
msgid "reviewer.submission.comments.editorOnly"
123+
msgstr "Editor only"
124+
125+
msgid "reviewer.submission.comments.review"
126+
msgstr "Évaluation"
127+
110128
msgid "reviewer.complete"
111129
msgstr "Évaluation envoyée"
112130

0 commit comments

Comments
 (0)