PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/ojs/ojs-2.1.0-1/classes/submission/reviewer/ReviewerAction.inc.php

https://github.com/mcrider/pkpUpgradeTestSuite
PHP | 381 lines | 240 code | 54 blank | 87 comment | 61 complexity | d0766457286729ea7b526731bcbcb896 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
  1. <?php
  2. /**
  3. * ReviewerAction.inc.php
  4. *
  5. * Copyright (c) 2003-2005 The Public Knowledge Project
  6. * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING.
  7. *
  8. * @package submission
  9. *
  10. * ReviewerAction class.
  11. *
  12. * $Id: ReviewerAction.inc.php,v 1.45 2005/12/07 19:08:14 alec Exp $
  13. */
  14. import('submission.common.Action');
  15. class ReviewerAction extends Action {
  16. /**
  17. * Constructor.
  18. */
  19. function ReviewerAction() {
  20. }
  21. /**
  22. * Actions.
  23. */
  24. /**
  25. * Records whether or not the reviewer accepts the review assignment.
  26. * @param $user object
  27. * @param $reviewerSubmission object
  28. * @param $decline boolean
  29. * @param $send boolean
  30. */
  31. function confirmReview($reviewerSubmission, $decline, $send) {
  32. $reviewAssignmentDao = &DAORegistry::getDAO('ReviewAssignmentDAO');
  33. $userDao = &DAORegistry::getDAO('UserDAO');
  34. $reviewId = $reviewerSubmission->getReviewId();
  35. $reviewAssignment = &$reviewAssignmentDao->getReviewAssignmentById($reviewId);
  36. $reviewer = &$userDao->getUser($reviewAssignment->getReviewerId());
  37. if (!isset($reviewer)) return true;
  38. // Only confirm the review for the reviewer if
  39. // he has not previously done so.
  40. if ($reviewAssignment->getDateConfirmed() == null) {
  41. import('mail.ArticleMailTemplate');
  42. $email = &new ArticleMailTemplate($reviewerSubmission, $decline?'REVIEW_DECLINE':'REVIEW_CONFIRM');
  43. if (!$email->isEnabled() || ($send && !$email->hasErrors())) {
  44. HookRegistry::call('ReviewerAction::confirmReview', array(&$reviewerSubmission, &$email, $decline));
  45. if ($email->isEnabled()) {
  46. $email->setAssoc($decline?ARTICLE_EMAIL_REVIEW_DECLINE:ARTICLE_EMAIL_REVIEW_CONFIRM, ARTICLE_EMAIL_TYPE_REVIEW, $reviewId);
  47. $email->send();
  48. }
  49. $reviewAssignment->setDeclined($decline);
  50. $reviewAssignment->setDateConfirmed(Core::getCurrentDate());
  51. $reviewAssignment->stampModified();
  52. $reviewAssignmentDao->updateReviewAssignment($reviewAssignment);
  53. // Add log
  54. import('article.log.ArticleLog');
  55. import('article.log.ArticleEventLogEntry');
  56. $entry = &new ArticleEventLogEntry();
  57. $entry->setArticleId($reviewAssignment->getArticleId());
  58. $entry->setUserId($reviewer->getUserId());
  59. $entry->setDateLogged(Core::getCurrentDate());
  60. $entry->setEventType($decline?ARTICLE_LOG_REVIEW_DECLINE:ARTICLE_LOG_REVIEW_ACCEPT);
  61. $entry->setLogMessage($decline?'log.review.reviewDeclined':'log.review.reviewAccepted', array('reviewerName' => $reviewer->getFullName(), 'articleId' => $reviewAssignment->getArticleId(), 'round' => $reviewAssignment->getRound()));
  62. $entry->setAssocType(ARTICLE_LOG_TYPE_REVIEW);
  63. $entry->setAssocId($reviewAssignment->getReviewId());
  64. ArticleLog::logEventEntry($reviewAssignment->getArticleId(), $entry);
  65. return true;
  66. } else {
  67. if (!Request::getUserVar('continued')) {
  68. $editAssignments = &$reviewerSubmission->getEditAssignments();
  69. if (!empty($editAssignments)) {
  70. // FIXME: Should be able to designate primary editorial contact.
  71. foreach ($editAssignments as $editAssignment) {
  72. $email->addRecipient($editAssignment->getEditorEmail(), $editAssignment->getEditorFullName());
  73. }
  74. $editAssignment = $editAssignments[0];
  75. $editorialContactName = $editAssignment->getEditorFullName();
  76. } else {
  77. $journal = &Request::getJournal();
  78. $email->addRecipient($journal->getSetting('contactEmail'), $journal->getSetting('contactName'));
  79. $editorialContactName = $journal->getSetting('contactName');
  80. }
  81. // Must explicitly set sender because we may be here on an access
  82. // key, in which case the user is not technically logged in
  83. $email->setFrom($reviewer->getEmail(), $reviewer->getFullName());
  84. $email->assignParams(array(
  85. 'editorialContactName' => $editorialContactName,
  86. 'reviewerName' => $reviewer->getFullName(),
  87. 'reviewDueDate' => date('Y-m-d', strtotime($reviewAssignment->getDateDue()))
  88. ));
  89. }
  90. $paramArray = array('reviewId' => $reviewId);
  91. if ($decline) $paramArray['declineReview'] = 1;
  92. $email->displayEditForm(Request::url(null, 'reviewer', 'confirmReview'), $paramArray);
  93. return false;
  94. }
  95. }
  96. return true;
  97. }
  98. /**
  99. * Records the reviewer's submission recommendation.
  100. * @param $reviewId int
  101. * @param $recommendation int
  102. * @param $send boolean
  103. */
  104. function recordRecommendation(&$reviewerSubmission, $recommendation, $send) {
  105. $reviewAssignmentDao = &DAORegistry::getDAO('ReviewAssignmentDAO');
  106. $userDao = &DAORegistry::getDAO('UserDAO');
  107. if (SUBMISSION_REVIEWER_RECOMMENDATION_ACCEPT > $recommendation || SUBMISSION_REVIEWER_RECOMMENDATION_SEE_COMMENTS < $recommendation) return true;
  108. $reviewAssignment = &$reviewAssignmentDao->getReviewAssignmentById($reviewerSubmission->getReviewId());
  109. $reviewer = &$userDao->getUser($reviewAssignment->getReviewerId());
  110. if (!isset($reviewer)) return true;
  111. // Only record the reviewers recommendation if
  112. // no recommendation has previously been submitted.
  113. if ($reviewAssignment->getRecommendation() == null) {
  114. import('mail.ArticleMailTemplate');
  115. $email = &new ArticleMailTemplate($reviewerSubmission, 'REVIEW_COMPLETE');
  116. if (!$email->isEnabled() || ($send && !$email->hasErrors())) {
  117. HookRegistry::call('ReviewerAction::recordRecommendation', array(&$reviewerSubmission, &$email, $recommendation));
  118. if ($email->isEnabled()) {
  119. $email->setAssoc(ARTICLE_EMAIL_REVIEW_COMPLETE, ARTICLE_EMAIL_TYPE_REVIEW, $reviewerSubmission->getReviewId());
  120. $email->send();
  121. }
  122. $reviewAssignment->setRecommendation($recommendation);
  123. $reviewAssignment->setDateCompleted(Core::getCurrentDate());
  124. $reviewAssignment->stampModified();
  125. $reviewAssignmentDao->updateReviewAssignment($reviewAssignment);
  126. // Add log
  127. import('article.log.ArticleLog');
  128. import('article.log.ArticleEventLogEntry');
  129. $entry = &new ArticleEventLogEntry();
  130. $entry->setArticleId($reviewAssignment->getArticleId());
  131. $entry->setUserId($reviewer->getUserId());
  132. $entry->setDateLogged(Core::getCurrentDate());
  133. $entry->setEventType(ARTICLE_LOG_REVIEW_RECOMMENDATION);
  134. $entry->setLogMessage('log.review.reviewRecommendationSet', array('reviewerName' => $reviewer->getFullName(), 'articleId' => $reviewAssignment->getArticleId(), 'round' => $reviewAssignment->getRound()));
  135. $entry->setAssocType(ARTICLE_LOG_TYPE_REVIEW);
  136. $entry->setAssocId($reviewAssignment->getReviewId());
  137. ArticleLog::logEventEntry($reviewAssignment->getArticleId(), $entry);
  138. } else {
  139. if (!Request::getUserVar('continued')) {
  140. $editAssignments = &$reviewerSubmission->getEditAssignments();
  141. if (!empty($editAssignments)) {
  142. // FIXME: Should be able to designate primary editorial contact.
  143. foreach ($editAssignments as $editAssignment) {
  144. $email->addRecipient($editAssignment->getEditorEmail(), $editAssignment->getEditorFullName());
  145. }
  146. $editAssignment = $editAssignments[0];
  147. $editorialContactName = $editAssignment->getEditorFullName();
  148. } else {
  149. $journal = &Request::getJournal();
  150. $email->addRecipient($journal->getSetting('contactEmail'), $journal->getSetting('contactName'));
  151. $editorialContactName = $journal->getSetting('contactName');
  152. }
  153. $reviewerRecommendationOptions = &ReviewAssignment::getReviewerRecommendationOptions();
  154. // Must explicitly set sender because we may be here on an access
  155. // key, in which case the user is not technically logged in
  156. $email->setFrom($reviewer->getEmail(), $reviewer->getFullName());
  157. $email->assignParams(array(
  158. 'editorialContactName' => $editorialContactName,
  159. 'reviewerName' => $reviewer->getFullName(),
  160. 'articleTitle' => strip_tags($reviewerSubmission->getArticleTitle()),
  161. 'recommendation' => Locale::translate($reviewerRecommendationOptions[$recommendation])
  162. ));
  163. }
  164. $email->displayEditForm(Request::url(null, 'reviewer', 'recordRecommendation'),
  165. array('reviewId' => $reviewerSubmission->getReviewId(), 'recommendation' => $recommendation)
  166. );
  167. return false;
  168. }
  169. }
  170. return true;
  171. }
  172. /**
  173. * Upload the annotated version of an article.
  174. * @param $reviewId int
  175. */
  176. function uploadReviewerVersion($reviewId) {
  177. import("file.ArticleFileManager");
  178. $reviewAssignmentDao = &DAORegistry::getDAO('ReviewAssignmentDAO');
  179. $reviewAssignment = &$reviewAssignmentDao->getReviewAssignmentById($reviewId);
  180. $articleFileManager = &new ArticleFileManager($reviewAssignment->getArticleId());
  181. // Only upload the file if the reviewer has yet to submit a recommendation
  182. if ($reviewAssignment->getRecommendation() == null && !$reviewAssignment->getCancelled()) {
  183. $fileName = 'upload';
  184. if ($articleFileManager->uploadedFileExists($fileName)) {
  185. HookRegistry::call('ReviewerAction::uploadReviewFile', array(&$reviewAssignment));
  186. if ($reviewAssignment->getReviewerFileId() != null) {
  187. $fileId = $articleFileManager->uploadReviewFile($fileName, $reviewAssignment->getReviewerFileId());
  188. } else {
  189. $fileId = $articleFileManager->uploadReviewFile($fileName);
  190. }
  191. }
  192. }
  193. if (isset($fileId) && $fileId != 0) {
  194. $reviewAssignment->setReviewerFileId($fileId);
  195. $reviewAssignment->stampModified();
  196. $reviewAssignmentDao->updateReviewAssignment($reviewAssignment);
  197. // Add log
  198. import('article.log.ArticleLog');
  199. import('article.log.ArticleEventLogEntry');
  200. $userDao =& DAORegistry::getDAO('UserDAO');
  201. $reviewer =& $userDao->getUser($reviewAssignment->getReviewerId());
  202. $entry = &new ArticleEventLogEntry();
  203. $entry->setArticleId($reviewAssignment->getArticleId());
  204. $entry->setUserId($reviewer->getUserId());
  205. $entry->setDateLogged(Core::getCurrentDate());
  206. $entry->setEventType(ARTICLE_LOG_REVIEW_FILE);
  207. $entry->setLogMessage('log.review.reviewerFile');
  208. $entry->setAssocType(ARTICLE_LOG_TYPE_REVIEW);
  209. $entry->setAssocId($reviewAssignment->getReviewId());
  210. ArticleLog::logEventEntry($reviewAssignment->getArticleId(), $entry);
  211. }
  212. }
  213. /**
  214. * Delete an annotated version of an article.
  215. * @param $reviewId int
  216. * @param $fileId int
  217. * @param $revision int If null, then all revisions are deleted.
  218. */
  219. function deleteReviewerVersion($reviewId, $fileId, $revision = null) {
  220. import("file.ArticleFileManager");
  221. $articleId = Request::getUserVar('articleId');
  222. $reviewAssignmentDao = &DAORegistry::getDAO('ReviewAssignmentDAO');
  223. $reviewAssignment = &$reviewAssignmentDao->getReviewAssignmentById($reviewId);
  224. if (!HookRegistry::call('ReviewerAction::deleteReviewerVersion', array(&$reviewAssignment, &$fileId, &$revision))) {
  225. $articleFileManager = &new ArticleFileManager($reviewAssignment->getArticleId());
  226. $articleFileManager->deleteFile($fileId, $revision);
  227. }
  228. }
  229. /**
  230. * View reviewer comments.
  231. * @param $user object Current user
  232. * @param $article object
  233. * @param $reviewId int
  234. */
  235. function viewPeerReviewComments(&$user, &$article, $reviewId) {
  236. if (!HookRegistry::call('ReviewerAction::viewPeerReviewComments', array(&$user, &$article, &$reviewId))) {
  237. import("submission.form.comment.PeerReviewCommentForm");
  238. $commentForm = &new PeerReviewCommentForm($article, $reviewId, ROLE_ID_REVIEWER);
  239. $commentForm->setUser($user);
  240. $commentForm->initData();
  241. $commentForm->setData('reviewId', $reviewId);
  242. $commentForm->display();
  243. }
  244. }
  245. /**
  246. * Post reviewer comments.
  247. * @param $user object Current user
  248. * @param $article object
  249. * @param $reviewId int
  250. * @param $emailComment boolean
  251. */
  252. function postPeerReviewComment(&$user, &$article, $reviewId, $emailComment) {
  253. if (!HookRegistry::call('ReviewerAction::postPeerReviewComment', array(&$user, &$article, &$reviewId, &$emailComment))) {
  254. import("submission.form.comment.PeerReviewCommentForm");
  255. $commentForm = &new PeerReviewCommentForm($article, $reviewId, ROLE_ID_REVIEWER);
  256. $commentForm->setUser($user);
  257. $commentForm->readInputData();
  258. if ($commentForm->validate()) {
  259. $commentForm->execute();
  260. if ($emailComment) {
  261. $commentForm->email();
  262. }
  263. } else {
  264. parent::setupTemplate(true);
  265. $commentForm->display();
  266. }
  267. }
  268. }
  269. //
  270. // Misc
  271. //
  272. /**
  273. * Download a file a reviewer has access to.
  274. * @param $reviewId int
  275. * @param $article object
  276. * @param $fileId int
  277. * @param $revision int
  278. */
  279. function downloadReviewerFile($reviewId, $article, $fileId, $revision = null) {
  280. $reviewAssignmentDao = &DAORegistry::getDAO('ReviewAssignmentDAO');
  281. $reviewAssignment = &$reviewAssignmentDao->getReviewAssignmentById($reviewId);
  282. $journal = &Request::getJournal();
  283. $canDownload = false;
  284. // Reviewers have access to:
  285. // 1) The current revision of the file to be reviewed.
  286. // 2) Any file that he uploads.
  287. // 3) Any supplementary file that is visible to reviewers.
  288. if ((!$reviewAssignment->getDateConfirmed() || $reviewAssignment->getDeclined()) && $journal->getSetting('restrictReviewerFileAccess')) {
  289. // Restrict files until review is accepted
  290. } else if ($reviewAssignment->getReviewFileId() == $fileId) {
  291. if ($revision != null) {
  292. $canDownload = ($reviewAssignment->getReviewRevision() == $revision);
  293. }
  294. } else if ($reviewAssignment->getReviewerFileId() == $fileId) {
  295. $canDownload = true;
  296. } else {
  297. foreach ($reviewAssignment->getSuppFiles() as $suppFile) {
  298. if ($suppFile->getFileId() == $fileId && $suppFile->getShowReviewers()) {
  299. $canDownload = true;
  300. }
  301. }
  302. }
  303. $result = false;
  304. if (!HookRegistry::call('ReviewerAction::downloadReviewerFile', array(&$article, &$fileId, &$revision, &$canDownload, &$result))) {
  305. if ($canDownload) {
  306. return Action::downloadFile($article->getArticleId(), $fileId, $revision);
  307. } else {
  308. return false;
  309. }
  310. }
  311. return $result;
  312. }
  313. /**
  314. * Edit comment.
  315. * @param $commentId int
  316. */
  317. function editComment ($article, $comment, $reviewId) {
  318. if (!HookRegistry::call('ReviewerAction::editComment', array(&$article, &$comment, &$reviewId))) {
  319. import ("submission.form.comment.EditCommentForm");
  320. $commentForm =& new EditCommentForm ($article, $comment);
  321. $commentForm->initData();
  322. $commentForm->setData('reviewId', $reviewId);
  323. $commentForm->display(array('reviewId' => $reviewId));
  324. }
  325. }
  326. }
  327. ?>