17 import(
'lib.pkp.classes.controllers.grid.GridHandler');
20 import(
'lib.pkp.controllers.grid.users.reviewer.ReviewerGridCellProvider');
21 import(
'lib.pkp.controllers.grid.users.reviewer.ReviewerGridRow');
24 define(
'REVIEWER_SELECT_ADVANCED_SEARCH', 0x00000001);
25 define(
'REVIEWER_SELECT_CREATE', 0x00000002);
26 define(
'REVIEWER_SELECT_ENROLL_EXISTING', 0x00000003);
44 parent::__construct();
49 array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR),
54 $assistantOperations = array_flip($allOperations);
55 unset($assistantOperations[
'createReviewer']);
56 unset($assistantOperations[
'enrollReviewer']);
57 unset($assistantOperations[
'gossip']);
58 $assistantOperations = array_flip($assistantOperations);
61 array(ROLE_ID_ASSISTANT),
65 $this->isAuthorGrid =
false;
71 function authorize($request, &$args, $roleAssignments) {
73 if (!$this->isAuthorGrid) {
75 $stageId = $request->getUserVar(
'stageId');
78 $this->_stageId = (int)$stageId;
81 import(
'lib.pkp.classes.security.authorization.WorkflowStageAccessPolicy');
82 $workflowStageAccessPolicy =
new WorkflowStageAccessPolicy($request, $args, $roleAssignments,
'submissionId', $stageId, WORKFLOW_TYPE_EDITORIAL);
85 import(
'lib.pkp.classes.security.authorization.internal.ReviewRoundRequiredPolicy');
89 import(
'lib.pkp.classes.security.authorization.internal.ReviewAssignmentRequiredPolicy');
91 $this->
addPolicy($workflowStageAccessPolicy);
93 $success = parent::authorize($request, $args, $roleAssignments);
98 $this->_isCurrentUserAssignedAuthor =
false;
99 foreach ($userAssignedRoles as $stageId => $roles) {
100 if (in_array(ROLE_ID_AUTHOR, $roles)) {
101 $this->_isCurrentUserAssignedAuthor =
true;
106 if ($this->_isCurrentUserAssignedAuthor) {
107 $operation = $request->getRouter()->getRequestedOp($request);
115 if ($reviewAssignment && in_array($reviewAssignment->getReviewMethod(), array(SUBMISSION_REVIEW_METHOD_BLIND, SUBMISSION_REVIEW_METHOD_DOUBLEBLIND))) {
124 return parent::authorize($request, $args, $roleAssignments);
155 if (is_a($reviewRound,
'ReviewRound')) {
159 $reviewRoundId = $reviewAssignment->getReviewRoundId();
161 $reviewRound = $reviewRoundDao->getById($reviewRoundId);
174 parent::initialize($request, $args);
178 LOCALE_COMPONENT_PKP_SUBMISSION,
179 LOCALE_COMPONENT_PKP_MANAGER,
180 LOCALE_COMPONENT_PKP_USER,
181 LOCALE_COMPONENT_PKP_EDITOR,
182 LOCALE_COMPONENT_PKP_REVIEWER,
183 LOCALE_COMPONENT_APP_EDITOR
186 $this->
setTitle(
'user.role.reviewers');
189 if (!$this->_isCurrentUserAssignedAuthor) {
190 import(
'lib.pkp.classes.linkAction.request.AjaxModal');
191 $router = $request->getRouter();
192 $actionArgs = array_merge($this->
getRequestArgs(), array(
'selectionType' => REVIEWER_SELECT_ADVANCED_SEARCH));
197 $router->url($request,
null,
null,
'showReviewerForm',
null, $actionArgs),
198 __(
'editor.submission.addReviewer'),
201 __(
'editor.submission.addReviewer'),
227 array(
'anyhtml' =>
true)
246 'grid.columns.actions',
273 'submissionId' => $submission->getId(),
274 'stageId' => $this->getStageId(),
275 'reviewRoundId' => $reviewRound->getId()
282 protected function loadData($request, $filter) {
286 return $reviewAssignmentDao->getByReviewRoundId($reviewRound->getId());
342 $selectionType = $request->getUserVar(
'selectionType');
346 import(
'lib.pkp.controllers.grid.users.reviewer.form.' . $formClassName );
348 $reviewerForm->readInputData();
349 if ($reviewerForm->validate()) {
350 $reviewAssignment = $reviewerForm->execute();
354 return new JSONMessage(
true, $reviewerForm->fetch($request));
365 import(
'lib.pkp.controllers.grid.users.reviewer.form.EditReviewForm');
368 $editReviewForm->initData();
369 return new JSONMessage(
true, $editReviewForm->fetch($request));
379 import(
'lib.pkp.controllers.grid.users.reviewer.form.EditReviewForm');
382 $editReviewForm->readInputData();
383 if ($editReviewForm->validate()) {
384 $editReviewForm->execute();
398 $context = $request->getContext();
399 $term = $request->getUserVar(
'term');
402 $users = $userGroupDao->getUsersNotInRole(ROLE_ID_REVIEWER, $context->getId(), $term);
405 while ($user = $users->next()) {
406 $label = $user->getFullName() .
" (" . $user->getEmail() .
")";
407 $userList[] = array(
'label' => $label,
'value' => $user->getId());
410 if (count($userList) == 0) {
428 import(
'lib.pkp.controllers.grid.users.reviewer.form.UnassignReviewerForm');
430 $unassignReviewerForm->initData();
432 return new JSONMessage(
true, $unassignReviewerForm->fetch($request));
446 import(
'lib.pkp.controllers.grid.users.reviewer.form.ReinstateReviewerForm');
448 $reinstateReviewerForm->initData();
450 return new JSONMessage(
true, $reinstateReviewerForm->fetch($request));
464 import(
'lib.pkp.controllers.grid.users.reviewer.form.ReinstateReviewerForm');
466 $reinstateReviewerForm->readInputData();
469 if (!$reinstateReviewerForm->validate()) {
470 return new JSONMessage(
false, __(
'editor.review.errorReinstatingReviewer'));
473 $reinstateReviewerForm->execute();
489 import(
'lib.pkp.controllers.grid.users.reviewer.form.UnassignReviewerForm');
491 $unassignReviewerForm->readInputData();
494 if (!$unassignReviewerForm->validate()) {
495 return new JSONMessage(
false, __(
'editor.review.errorDeletingReviewer'));
498 $unassignReviewerForm->execute();
509 if (!$request->checkCSRF())
return new JSONMessage(
false);
513 $user = $request->getUser();
517 $reviewAssignment->setUnconsidered(REVIEW_ASSIGNMENT_UNCONSIDERED);
518 $reviewAssignmentDao->updateObject($reviewAssignment);
521 import(
'lib.pkp.classes.log.SubmissionLog');
522 import(
'classes.log.SubmissionEventLogEntry');
525 $entry->setSubmissionId($reviewAssignment->getSubmissionId());
526 $entry->setUserId($user->getId());
528 $entry->setEventType(SUBMISSION_LOG_REVIEW_UNCONSIDERED);
533 SUBMISSION_LOG_REVIEW_UNCONSIDERED,
534 'log.review.reviewUnconsidered',
536 'editorName' => $user->getFullName(),
537 'submissionId' => $submission->getId(),
538 'round' => $reviewAssignment->getRound(),
556 $quality = $request->getUserVar(
'quality');
558 $reviewAssignment->setQuality((
int) $quality);
561 $reviewAssignment->setQuality(
null);
562 $reviewAssignment->setDateRated(
null);
566 $user = $request->getUser();
568 $viewsDao->recordView(ASSOC_TYPE_REVIEW_RESPONSE, $reviewAssignment->getId(), $user->getId());
571 if ($reviewAssignment->getUnconsidered() == REVIEW_ASSIGNMENT_UNCONSIDERED) {
572 $reviewAssignment->setUnconsidered(REVIEW_ASSIGNMENT_UNCONSIDERED_READ);
575 if (!$reviewAssignment->getDateCompleted()) {
583 $reviewAssignmentDao->updateObject($reviewAssignment);
586 if ($reviewAssignment->isRead()) {
587 import(
'lib.pkp.classes.log.SubmissionLog');
588 import(
'classes.log.SubmissionEventLogEntry');
590 $submissionId = $reviewAssignment->getSubmissionId();
592 $submission = $submissionDao->getById($submissionId);
597 SUBMISSION_LOG_REVIEW_CONFIRMED,
598 'log.review.reviewConfirmed',
600 'userName' => $user->getFullName(),
601 'submissionId' => $reviewAssignment->getSubmissionId(),
602 'round' => $reviewAssignment->getRound()
608 $notificationDao->deleteByAssoc(
609 ASSOC_TYPE_REVIEW_ASSIGNMENT,
610 $reviewAssignment->getId(),
611 $reviewAssignment->getReviewerId(),
612 NOTIFICATION_TYPE_REVIEW_ASSIGNMENT
629 import(
'lib.pkp.controllers.grid.users.reviewer.form.ThankReviewerForm');
631 $thankReviewerForm->initData();
634 return new JSONMessage(
true, $thankReviewerForm->fetch($request));
647 $starHtml =
'<span class="fa fa-star"></span>';
648 $templateMgr->assign(array(
650 'reviewAssignment' => $reviewAssignment,
651 'reviewerRatingOptions' => array(
652 0 => __(
'editor.review.reviewerRating.none'),
653 SUBMISSION_REVIEWER_RATING_VERY_GOOD => str_repeat($starHtml, SUBMISSION_REVIEWER_RATING_VERY_GOOD),
654 SUBMISSION_REVIEWER_RATING_GOOD => str_repeat($starHtml, SUBMISSION_REVIEWER_RATING_GOOD),
655 SUBMISSION_REVIEWER_RATING_AVERAGE => str_repeat($starHtml, SUBMISSION_REVIEWER_RATING_AVERAGE),
656 SUBMISSION_REVIEWER_RATING_POOR => str_repeat($starHtml, SUBMISSION_REVIEWER_RATING_POOR),
657 SUBMISSION_REVIEWER_RATING_VERY_POOR => str_repeat($starHtml, SUBMISSION_REVIEWER_RATING_VERY_POOR),
662 if ($reviewAssignment->getReviewFormId()) {
664 $context = $request->getContext();
666 $reviewFormElements = $reviewFormElementDao->getByReviewFormId($reviewAssignment->getReviewFormId());
668 $reviewFormResponses = $reviewFormResponseDao->getReviewReviewFormResponseValues($reviewAssignment->getId());
670 $reviewformid = $reviewAssignment->getReviewFormId();
672 $templateMgr->assign(array(
673 'reviewForm' => $reviewForm,
674 'reviewFormElements' => $reviewFormElements,
675 'reviewFormResponses' => $reviewFormResponses,
681 $templateMgr->assign(array(
682 'comments' => $submissionCommentDao->getReviewerCommentsByReviewerId($reviewAssignment->getSubmissionId(),
null, $reviewAssignment->getId(),
true),
683 'commentsPrivate' => $submissionCommentDao->getReviewerCommentsByReviewerId($reviewAssignment->getSubmissionId(),
null, $reviewAssignment->getId(),
false),
689 return $templateMgr->fetchJson(
'controllers/grid/users/reviewer/readReview.tpl');
703 import(
'lib.pkp.controllers.grid.users.reviewer.form.ThankReviewerForm');
705 $thankReviewerForm->readInputData();
706 if ($thankReviewerForm->validate()) {
707 $thankReviewerForm->execute();
710 $currentUser = $request->getUser();
712 $messageKey = $thankReviewerForm->getData(
'skipEmail') ? __(
'notification.reviewAcknowledged') : __(
'notification.reviewerThankedEmail');
713 $notificationMgr->createTrivialNotification($currentUser->getId(), NOTIFICATION_TYPE_SUCCESS, array(
'contents' => $messageKey));
715 $json =
new JSONMessage(
false, __(
'editor.review.thankReviewerError'));
732 import(
'lib.pkp.controllers.grid.users.reviewer.form.ReviewReminderForm');
734 $reviewReminderForm->initData();
737 return new JSONMessage(
true, $reviewReminderForm->fetch($request));
750 import(
'lib.pkp.controllers.grid.users.reviewer.form.ReviewReminderForm');
752 $reviewReminderForm->readInputData();
753 if ($reviewReminderForm->validate()) {
754 $reviewReminderForm->execute();
756 $currentUser = $request->getUser();
758 $notificationMgr->createTrivialNotification($currentUser->getId(), NOTIFICATION_TYPE_SUCCESS, array(
'contents' => __(
'notification.sentNotification')));
761 return new JSONMessage(
false, __(
'editor.review.reminderError'));
776 import(
'lib.pkp.controllers.grid.users.reviewer.form.EmailReviewerForm');
778 if (!$request->isPost()) {
779 $emailReviewerForm->initData();
782 $emailReviewerForm->fetch(
786 $this->getRequestArgs()
790 $emailReviewerForm->readInputData();
791 $emailReviewerForm->execute($submission);
807 'common.assigned' => $reviewAssignment->getDateAssigned(),
808 'common.notified' => $reviewAssignment->getDateNotified(),
809 'common.reminder' => $reviewAssignment->getDateReminded(),
810 'common.confirm' => $reviewAssignment->getDateConfirmed(),
811 'common.completed' => $reviewAssignment->getDateCompleted(),
812 'common.acknowledged' => $reviewAssignment->getDateAcknowledged(),
815 $templateMgr->assign(
'dates', $dates);
817 return $templateMgr->fetchJson(
'workflow/reviewHistory.tpl');
827 function gossip($args, $request) {
830 $user = $userDao->getById($reviewAssignment->getReviewerId());
834 import(
'classes.core.Services');
835 $canCurrentUserGossip =
Services::get(
'user')->canCurrentUserGossip($user->getId());
836 if (!$canCurrentUserGossip) {
837 return new JSONMessage(
false, __(
'user.authorization.roleBasedAccessDenied'));
840 $requestArgs = array_merge($this->
getRequestArgs(), array(
'reviewAssignmentId' => $reviewAssignment->getId()));
841 import(
'lib.pkp.controllers.grid.users.reviewer.form.ReviewerGossipForm');
845 if (!$request->isPost()) {
846 return new JSONMessage(
true, $reviewerGossipForm->fetch($request));
850 $reviewerGossipForm->readInputData();
851 if ($reviewerGossipForm->validate()) {
852 $reviewerGossipForm->execute();
856 return new JSONMessage(
false, __(
'user.authorization.roleBasedAccessDenied'));
867 import(
'lib.pkp.classes.mail.SubmissionMailTemplate');
869 if (!$template)
return;
871 $user = $request->getUser();
872 $dispatcher = $request->getDispatcher();
873 $context = $request->getContext();
875 $template->assignParams(array(
876 'contextUrl' => $dispatcher->url($request, ROUTE_PAGE, $context->getPath()),
877 'editorialContactSignature' => $user->getContactSignature(),
878 'signatureFullName' => $user->getFullname(),
879 'passwordResetUrl' => $dispatcher->url($request, ROUTE_PAGE, $context->getPath(),
'login',
'lostPassword'),
880 'messageToReviewer' => __(
'reviewer.step1.requestBoilerplate'),
881 'abstractTermIfEnabled' => ($this->
getSubmission()->getLocalizedAbstract() ==
'' ?
'' : __(
'common.abstract')),
883 $template->replaceParams();
885 return new JSONMessage(
true, $template->getBody());
899 $selectionType = $request->getUserVar(
'selectionType');
900 assert(!empty($selectionType));
905 import(
'lib.pkp.controllers.grid.users.reviewer.form.' . $formClassName );
907 $reviewerForm->initData();
908 $reviewerForm->setUserRoles($userRoles);
910 return $reviewerForm->fetch($request);
919 switch ($selectionType) {
920 case REVIEWER_SELECT_ADVANCED_SEARCH:
921 return 'AdvancedSearchReviewerForm';
922 case REVIEWER_SELECT_CREATE:
923 return 'CreateReviewerForm';
924 case REVIEWER_SELECT_ENROLL_EXISTING:
925 return 'EnrollExistingReviewerForm';
936 return array(
'readReview',
'reviewHistory',
'reviewRead',
'editThankReviewer',
'thankReviewer',
'editReminder',
'sendReminder',
'unassignReviewer',
'updateUnassignReviewer',
'reinstateReviewer',
'updateReinstateReviewer',
'sendEmail',
'unconsiderReview',
'editReview',
'updateReview',
'gossip');
947 'fetchGrid',
'fetchRow',
'showReviewerForm',
'reloadReviewerForm',
948 'createReviewer',
'enrollReviewer',
'updateReviewer',
949 'getUsersNotAssignedAsReviewers',
962 'reloadReviewerForm',
966 'getUsersNotAssignedAsReviewers',
972 'unassignReviewer',
'updateUnassignReviewer',
973 'reinstateReviewer',
'updateReinstateReviewer',
975 'editReview',
'updateReview',