Open Journal Systems  3.3.0
PKPReviewerGridHandler.inc.php
1 <?php
2 
16 // import grid base classes
17 import('lib.pkp.classes.controllers.grid.GridHandler');
18 
19 // import reviewer grid specific classes
20 import('lib.pkp.controllers.grid.users.reviewer.ReviewerGridCellProvider');
21 import('lib.pkp.controllers.grid.users.reviewer.ReviewerGridRow');
22 
23 // Reviewer selection types
24 define('REVIEWER_SELECT_ADVANCED_SEARCH', 0x00000001);
25 define('REVIEWER_SELECT_CREATE', 0x00000002);
26 define('REVIEWER_SELECT_ENROLL_EXISTING', 0x00000003);
27 
29 
31  var $_submission;
32 
34  var $_stageId;
35 
38 
39 
43  function __construct() {
44  parent::__construct();
45 
46  $allOperations = array_merge($this->_getReviewAssignmentOps(), $this->_getReviewRoundOps());
47 
48  $this->addRoleAssignment(
49  array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR),
50  $allOperations
51  );
52 
53  // Remove operations related to creation and enrollment of users.
54  $assistantOperations = array_flip($allOperations);
55  unset($assistantOperations['createReviewer']);
56  unset($assistantOperations['enrollReviewer']);
57  unset($assistantOperations['gossip']);
58  $assistantOperations = array_flip($assistantOperations);
59 
60  $this->addRoleAssignment(
61  array(ROLE_ID_ASSISTANT),
62  $assistantOperations
63  );
64 
65  $this->isAuthorGrid = false;
66  }
67 
71  function authorize($request, &$args, $roleAssignments) {
72 
73  if (!$this->isAuthorGrid) {
74 
75  $stageId = $request->getUserVar('stageId'); // This is being validated in WorkflowStageAccessPolicy
76 
77  // Not all actions need a stageId. Some work off the reviewAssignment which has the type and round.
78  $this->_stageId = (int)$stageId;
79 
80  // Get the stage access policy
81  import('lib.pkp.classes.security.authorization.WorkflowStageAccessPolicy');
82  $workflowStageAccessPolicy = new WorkflowStageAccessPolicy($request, $args, $roleAssignments, 'submissionId', $stageId, WORKFLOW_TYPE_EDITORIAL);
83 
84  // Add policy to ensure there is a review round id.
85  import('lib.pkp.classes.security.authorization.internal.ReviewRoundRequiredPolicy');
86  $workflowStageAccessPolicy->addPolicy(new ReviewRoundRequiredPolicy($request, $args, 'reviewRoundId', $this->_getReviewRoundOps()));
87 
88  // Add policy to ensure there is a review assignment for certain operations.
89  import('lib.pkp.classes.security.authorization.internal.ReviewAssignmentRequiredPolicy');
90  $workflowStageAccessPolicy->addPolicy(new ReviewAssignmentRequiredPolicy($request, $args, 'reviewAssignmentId', $this->_getReviewAssignmentOps()));
91  $this->addPolicy($workflowStageAccessPolicy);
92 
93  $success = parent::authorize($request, $args, $roleAssignments);
94 
95  // Prevent authors from accessing review details, even if they are also
96  // assigned as an editor, sub-editor or assistant.
97  $userAssignedRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_ACCESSIBLE_WORKFLOW_STAGES);
98  $this->_isCurrentUserAssignedAuthor = false;
99  foreach ($userAssignedRoles as $stageId => $roles) {
100  if (in_array(ROLE_ID_AUTHOR, $roles)) {
101  $this->_isCurrentUserAssignedAuthor = true;
102  break;
103  }
104  }
105 
106  if ($this->_isCurrentUserAssignedAuthor) {
107  $operation = $request->getRouter()->getRequestedOp($request);
108 
109  if (in_array($operation, $this->_getAuthorDeniedOps())) {
110  return false;
111  }
112 
113  if (in_array($operation, $this->_getAuthorDeniedBlindOps())) {
114  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
115  if ($reviewAssignment && in_array($reviewAssignment->getReviewMethod(), array(SUBMISSION_REVIEW_METHOD_BLIND, SUBMISSION_REVIEW_METHOD_DOUBLEBLIND))) {
116  return false;
117  }
118  }
119  }
120 
121  return $success;
122 
123  } else {
124  return parent::authorize($request, $args, $roleAssignments);
125  }
126 
127  }
128 
129 
130  //
131  // Getters and Setters
132  //
137  function getSubmission() {
138  return $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
139  }
140 
145  function getStageId() {
147  }
148 
153  function getReviewRound() {
154  $reviewRound = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ROUND);
155  if (is_a($reviewRound, 'ReviewRound')) {
156  return $reviewRound;
157  } else {
158  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
159  $reviewRoundId = $reviewAssignment->getReviewRoundId();
160  $reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); /* @var $reviewRoundDao ReviewRoundDAO */
161  $reviewRound = $reviewRoundDao->getById($reviewRoundId);
162  return $reviewRound;
163  }
164  }
165 
166 
167  //
168  // Overridden methods from PKPHandler
169  //
173  function initialize($request, $args = null) {
174  parent::initialize($request, $args);
175 
176  // Load submission-specific translations
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
184  );
185 
186  $this->setTitle('user.role.reviewers');
187 
188  // Grid actions
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));
193  $this->addAction(
194  new LinkAction(
195  'addReviewer',
196  new AjaxModal(
197  $router->url($request, null, null, 'showReviewerForm', null, $actionArgs),
198  __('editor.submission.addReviewer'),
199  'modal_add_user'
200  ),
201  __('editor.submission.addReviewer'),
202  'add_user'
203  )
204  );
205  }
206 
207  // Columns
208  $cellProvider = new ReviewerGridCellProvider($this->_isCurrentUserAssignedAuthor);
209  $this->addColumn(
210  new GridColumn(
211  'name',
212  'user.name',
213  null,
214  null,
215  $cellProvider
216  )
217  );
218 
219  // Add a column for the status of the review.
220  $this->addColumn(
221  new GridColumn(
222  'considered',
223  'common.status',
224  null,
225  null,
226  $cellProvider,
227  array('anyhtml' => true)
228  )
229  );
230 
231  // Add a column for the review method
232  $this->addColumn(
233  new GridColumn(
234  'method',
235  'common.type',
236  null,
237  null,
238  $cellProvider
239  )
240  );
241 
242  // Add a column for the status of the review.
243  $this->addColumn(
244  new GridColumn(
245  'actions',
246  'grid.columns.actions',
247  null,
248  null,
249  $cellProvider
250  )
251  );
252  }
253 
254 
255  //
256  // Overridden methods from GridHandler
257  //
262  protected function getRowInstance() {
263  return new ReviewerGridRow($this->_isCurrentUserAssignedAuthor);
264  }
265 
269  function getRequestArgs() {
270  $submission = $this->getSubmission();
271  $reviewRound = $this->getReviewRound();
272  return array(
273  'submissionId' => $submission->getId(),
274  'stageId' => $this->getStageId(),
275  'reviewRoundId' => $reviewRound->getId()
276  );
277  }
278 
282  protected function loadData($request, $filter) {
283  // Get the existing review assignments for this submission
284  $reviewRound = $this->getReviewRound();
285  $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); /* @var $reviewAssignmentDao ReviewAssignmentDAO */
286  return $reviewAssignmentDao->getByReviewRoundId($reviewRound->getId());
287  }
288 
289 
290  //
291  // Public actions
292  //
299  function showReviewerForm($args, $request) {
300  return new JSONMessage(true, $this->_fetchReviewerForm($args, $request));
301  }
302 
309  function reloadReviewerForm($args, $request) {
310  $json = new JSONMessage(true);
311  $json->setEvent('refreshForm', $this->_fetchReviewerForm($args, $request));
312  return $json;
313  }
314 
321  function createReviewer($args, $request) {
322  return $this->updateReviewer($args, $request);
323  }
324 
331  function enrollReviewer($args, $request) {
332  return $this->updateReviewer($args, $request);
333  }
334 
341  function updateReviewer($args, $request) {
342  $selectionType = $request->getUserVar('selectionType');
343  $formClassName = $this->_getReviewerFormClassName($selectionType);
344 
345  // Form handling
346  import('lib.pkp.controllers.grid.users.reviewer.form.' . $formClassName );
347  $reviewerForm = new $formClassName($this->getSubmission(), $this->getReviewRound());
348  $reviewerForm->readInputData();
349  if ($reviewerForm->validate()) {
350  $reviewAssignment = $reviewerForm->execute();
351  return DAO::getDataChangedEvent($reviewAssignment->getId());
352  } else {
353  // There was an error, redisplay the form
354  return new JSONMessage(true, $reviewerForm->fetch($request));
355  }
356  }
357 
364  function editReview($args, $request) {
365  import('lib.pkp.controllers.grid.users.reviewer.form.EditReviewForm');
366  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
367  $editReviewForm = new EditReviewForm($reviewAssignment);
368  $editReviewForm->initData();
369  return new JSONMessage(true, $editReviewForm->fetch($request));
370  }
371 
378  function updateReview($args, $request) {
379  import('lib.pkp.controllers.grid.users.reviewer.form.EditReviewForm');
380  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
381  $editReviewForm = new EditReviewForm($reviewAssignment);
382  $editReviewForm->readInputData();
383  if ($editReviewForm->validate()) {
384  $editReviewForm->execute();
385  return DAO::getDataChangedEvent($reviewAssignment->getId());
386  } else {
387  return new JSONMessage(false);
388  }
389  }
390 
397  function getUsersNotAssignedAsReviewers($args, $request) {
398  $context = $request->getContext();
399  $term = $request->getUserVar('term');
400 
401  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
402  $users = $userGroupDao->getUsersNotInRole(ROLE_ID_REVIEWER, $context->getId(), $term);
403 
404  $userList = array();
405  while ($user = $users->next()) {
406  $label = $user->getFullName() . " (" . $user->getEmail() . ")";
407  $userList[] = array('label' => $label, 'value' => $user->getId());
408  }
409 
410  if (count($userList) == 0) {
411  return $this->noAutocompleteResults();
412  }
413 
414  return new JSONMessage(true, $userList);
415  }
416 
423  function unassignReviewer($args, $request) {
424  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
425  $reviewRound = $this->getReviewRound();
426  $submission = $this->getSubmission();
427 
428  import('lib.pkp.controllers.grid.users.reviewer.form.UnassignReviewerForm');
429  $unassignReviewerForm = new UnassignReviewerForm($reviewAssignment, $reviewRound, $submission);
430  $unassignReviewerForm->initData();
431 
432  return new JSONMessage(true, $unassignReviewerForm->fetch($request));
433  }
434 
441  public function reinstateReviewer($args, $request) {
442  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
443  $reviewRound = $this->getReviewRound();
444  $submission = $this->getSubmission();
445 
446  import('lib.pkp.controllers.grid.users.reviewer.form.ReinstateReviewerForm');
447  $reinstateReviewerForm = new ReinstateReviewerForm($reviewAssignment, $reviewRound, $submission);
448  $reinstateReviewerForm->initData();
449 
450  return new JSONMessage(true, $reinstateReviewerForm->fetch($request));
451  }
452 
459  public function updateReinstateReviewer($args, $request) {
460  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
461  $reviewRound = $this->getReviewRound();
462  $submission = $this->getSubmission();
463 
464  import('lib.pkp.controllers.grid.users.reviewer.form.ReinstateReviewerForm');
465  $reinstateReviewerForm = new ReinstateReviewerForm($reviewAssignment, $reviewRound, $submission);
466  $reinstateReviewerForm->readInputData();
467 
468  // Reinstate the reviewer and return status message
469  if (!$reinstateReviewerForm->validate()) {
470  return new JSONMessage(false, __('editor.review.errorReinstatingReviewer'));
471  }
472 
473  $reinstateReviewerForm->execute();
474  return DAO::getDataChangedEvent($reviewAssignment->getId());
475  }
476 
484  function updateUnassignReviewer($args, $request) {
485  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
486  $reviewRound = $this->getReviewRound();
487  $submission = $this->getSubmission();
488 
489  import('lib.pkp.controllers.grid.users.reviewer.form.UnassignReviewerForm');
490  $unassignReviewerForm = new UnassignReviewerForm($reviewAssignment, $reviewRound, $submission);
491  $unassignReviewerForm->readInputData();
492 
493  // Unassign the reviewer and return status message
494  if (!$unassignReviewerForm->validate()) {
495  return new JSONMessage(false, __('editor.review.errorDeletingReviewer'));
496  }
497 
498  $unassignReviewerForm->execute();
499  return DAO::getDataChangedEvent($reviewAssignment->getId());
500  }
501 
508  function unconsiderReview($args, $request) {
509  if (!$request->checkCSRF()) return new JSONMessage(false);
510 
511  // This resets the state of the review to 'unread', but does not delete note history.
512  $submission = $this->getSubmission();
513  $user = $request->getUser();
514  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
515  $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); /* @var $reviewAssignmentDao ReviewAssignmentDAO */
516 
517  $reviewAssignment->setUnconsidered(REVIEW_ASSIGNMENT_UNCONSIDERED);
518  $reviewAssignmentDao->updateObject($reviewAssignment);
519 
520  // log the unconsider.
521  import('lib.pkp.classes.log.SubmissionLog');
522  import('classes.log.SubmissionEventLogEntry');
523 
524  $entry = new SubmissionEventLogEntry();
525  $entry->setSubmissionId($reviewAssignment->getSubmissionId());
526  $entry->setUserId($user->getId());
527  $entry->setDateLogged(Core::getCurrentDate());
528  $entry->setEventType(SUBMISSION_LOG_REVIEW_UNCONSIDERED);
529 
531  $request,
532  $submission,
533  SUBMISSION_LOG_REVIEW_UNCONSIDERED,
534  'log.review.reviewUnconsidered',
535  array(
536  'editorName' => $user->getFullName(),
537  'submissionId' => $submission->getId(),
538  'round' => $reviewAssignment->getRound(),
539  )
540  );
541 
542  return DAO::getDataChangedEvent($reviewAssignment->getId());
543  }
544 
551  function reviewRead($args, $request) {
552  // Retrieve review assignment.
553  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT); /* @var $reviewAssignment ReviewAssignment */
554 
555  // Rate the reviewer's performance on this assignment
556  $quality = $request->getUserVar('quality');
557  if ($quality) {
558  $reviewAssignment->setQuality((int) $quality);
559  $reviewAssignment->setDateRated(Core::getCurrentDate());
560  } else {
561  $reviewAssignment->setQuality(null);
562  $reviewAssignment->setDateRated(null);
563  }
564 
565  // Mark the latest read date of the review by the editor.
566  $user = $request->getUser();
567  $viewsDao = DAORegistry::getDAO('ViewsDAO'); /* @var $viewsDao ViewsDAO */
568  $viewsDao->recordView(ASSOC_TYPE_REVIEW_RESPONSE, $reviewAssignment->getId(), $user->getId());
569 
570  // if the review assignment had been unconsidered, update the flag.
571  if ($reviewAssignment->getUnconsidered() == REVIEW_ASSIGNMENT_UNCONSIDERED) {
572  $reviewAssignment->setUnconsidered(REVIEW_ASSIGNMENT_UNCONSIDERED_READ);
573  }
574 
575  if (!$reviewAssignment->getDateCompleted()) {
576  // Editor completes the review.
577  $reviewAssignment->setDateConfirmed(Core::getCurrentDate());
578  $reviewAssignment->setDateCompleted(Core::getCurrentDate());
579  }
580 
581  // Trigger an update of the review round status
582  $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); /* @var $reviewAssignmentDao ReviewAssignmentDAO */
583  $reviewAssignmentDao->updateObject($reviewAssignment);
584 
585  //if the review was read by an editor, log event
586  if ($reviewAssignment->isRead()) {
587  import('lib.pkp.classes.log.SubmissionLog');
588  import('classes.log.SubmissionEventLogEntry');
589 
590  $submissionId = $reviewAssignment->getSubmissionId();
591  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
592  $submission = $submissionDao->getById($submissionId);
593 
595  $request,
596  $submission,
597  SUBMISSION_LOG_REVIEW_CONFIRMED,
598  'log.review.reviewConfirmed',
599  array(
600  'userName' => $user->getFullName(),
601  'submissionId' => $reviewAssignment->getSubmissionId(),
602  'round' => $reviewAssignment->getRound()
603  )
604  );
605  }
606  // Remove the reviewer task.
607  $notificationDao = DAORegistry::getDAO('NotificationDAO'); /* @var $notificationDao NotificationDAO */
608  $notificationDao->deleteByAssoc(
609  ASSOC_TYPE_REVIEW_ASSIGNMENT,
610  $reviewAssignment->getId(),
611  $reviewAssignment->getReviewerId(),
612  NOTIFICATION_TYPE_REVIEW_ASSIGNMENT
613  );
614 
615  return DAO::getDataChangedEvent($reviewAssignment->getId());
616  }
617 
624  function editThankReviewer($args, $request) {
625  // Identify the review assignment being updated.
626  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
627 
628  // Initialize form.
629  import('lib.pkp.controllers.grid.users.reviewer.form.ThankReviewerForm');
630  $thankReviewerForm = new ThankReviewerForm($reviewAssignment);
631  $thankReviewerForm->initData();
632 
633  // Render form.
634  return new JSONMessage(true, $thankReviewerForm->fetch($request));
635  }
636 
644  function readReview($args, $request) {
645  $templateMgr = TemplateManager::getManager($request);
646  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
647  $starHtml = '<span class="fa fa-star"></span>';
648  $templateMgr->assign(array(
649  'submission' => $this->getSubmission(),
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),
658  ),
659  'reviewerRecommendationOptions' => ReviewAssignment::getReviewerRecommendationOptions(),
660  ));
661 
662  if ($reviewAssignment->getReviewFormId()) {
663  // Retrieve review form
664  $context = $request->getContext();
665  $reviewFormElementDao = DAORegistry::getDAO('ReviewFormElementDAO'); /* @var $reviewFormElementDao ReviewFormElementDAO */
666  $reviewFormElements = $reviewFormElementDao->getByReviewFormId($reviewAssignment->getReviewFormId());
667  $reviewFormResponseDao = DAORegistry::getDAO('ReviewFormResponseDAO'); /* @var $reviewFormResponseDao ReviewFormResponseDAO */
668  $reviewFormResponses = $reviewFormResponseDao->getReviewReviewFormResponseValues($reviewAssignment->getId());
669  $reviewFormDao = DAORegistry::getDAO('ReviewFormDAO'); /* @var $reviewFormDao ReviewFormDAO */
670  $reviewformid = $reviewAssignment->getReviewFormId();
671  $reviewForm = $reviewFormDao->getById($reviewAssignment->getReviewFormId(), Application::getContextAssocType(), $context->getId());
672  $templateMgr->assign(array(
673  'reviewForm' => $reviewForm,
674  'reviewFormElements' => $reviewFormElements,
675  'reviewFormResponses' => $reviewFormResponses,
676  'disabled' => true,
677  ));
678  } else {
679  // Retrieve reviewer comments.
680  $submissionCommentDao = DAORegistry::getDAO('SubmissionCommentDAO'); /* @var $submissionCommentDao SubmissionCommentDAO */
681  $templateMgr->assign(array(
682  'comments' => $submissionCommentDao->getReviewerCommentsByReviewerId($reviewAssignment->getSubmissionId(), null, $reviewAssignment->getId(), true),
683  'commentsPrivate' => $submissionCommentDao->getReviewerCommentsByReviewerId($reviewAssignment->getSubmissionId(), null, $reviewAssignment->getId(), false),
684  ));
685  }
686 
687 
688  // Render the response.
689  return $templateMgr->fetchJson('controllers/grid/users/reviewer/readReview.tpl');
690  }
691 
698  function thankReviewer($args, $request) {
699  // Identify the review assignment being updated.
700  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
701 
702  // Form handling
703  import('lib.pkp.controllers.grid.users.reviewer.form.ThankReviewerForm');
704  $thankReviewerForm = new ThankReviewerForm($reviewAssignment);
705  $thankReviewerForm->readInputData();
706  if ($thankReviewerForm->validate()) {
707  $thankReviewerForm->execute();
708  $json = DAO::getDataChangedEvent($reviewAssignment->getId());
709  // Insert a trivial notification to indicate the reviewer was reminded successfully.
710  $currentUser = $request->getUser();
711  $notificationMgr = new NotificationManager();
712  $messageKey = $thankReviewerForm->getData('skipEmail') ? __('notification.reviewAcknowledged') : __('notification.reviewerThankedEmail');
713  $notificationMgr->createTrivialNotification($currentUser->getId(), NOTIFICATION_TYPE_SUCCESS, array('contents' => $messageKey));
714  } else {
715  $json = new JSONMessage(false, __('editor.review.thankReviewerError'));
716  }
717 
718  return $json;
719  }
720 
727  function editReminder($args, $request) {
728  // Identify the review assignment being updated.
729  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
730 
731  // Initialize form.
732  import('lib.pkp.controllers.grid.users.reviewer.form.ReviewReminderForm');
733  $reviewReminderForm = new ReviewReminderForm($reviewAssignment);
734  $reviewReminderForm->initData();
735 
736  // Render form.
737  return new JSONMessage(true, $reviewReminderForm->fetch($request));
738  }
739 
746  function sendReminder($args, $request) {
747  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
748 
749  // Form handling
750  import('lib.pkp.controllers.grid.users.reviewer.form.ReviewReminderForm');
751  $reviewReminderForm = new ReviewReminderForm($reviewAssignment);
752  $reviewReminderForm->readInputData();
753  if ($reviewReminderForm->validate()) {
754  $reviewReminderForm->execute();
755  // Insert a trivial notification to indicate the reviewer was reminded successfully.
756  $currentUser = $request->getUser();
757  $notificationMgr = new NotificationManager();
758  $notificationMgr->createTrivialNotification($currentUser->getId(), NOTIFICATION_TYPE_SUCCESS, array('contents' => __('notification.sentNotification')));
759  return new JSONMessage(true);
760  } else {
761  return new JSONMessage(false, __('editor.review.reminderError'));
762  }
763  }
764 
771  function sendEmail($args, $request) {
772  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
773  $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
774 
775  // Form handling.
776  import('lib.pkp.controllers.grid.users.reviewer.form.EmailReviewerForm');
777  $emailReviewerForm = new EmailReviewerForm($reviewAssignment);
778  if (!$request->isPost()) {
779  $emailReviewerForm->initData();
780  return new JSONMessage(
781  true,
782  $emailReviewerForm->fetch(
783  $request,
784  null,
785  false,
786  $this->getRequestArgs()
787  )
788  );
789  }
790  $emailReviewerForm->readInputData();
791  $emailReviewerForm->execute($submission);
792  return new JSONMessage(true);
793  }
794 
795 
802  function reviewHistory($args, $request) {
803  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
804 
805  $templateMgr = TemplateManager::getManager($request);
806  $dates = array(
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(),
813  );
814  asort($dates);
815  $templateMgr->assign('dates', $dates);
816 
817  return $templateMgr->fetchJson('workflow/reviewHistory.tpl');
818  }
819 
820 
827  function gossip($args, $request) {
828  $reviewAssignment = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT);
829  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
830  $user = $userDao->getById($reviewAssignment->getReviewerId());
831 
832  // Check that the current user is specifically allowed to access gossip for
833  // this user
834  import('classes.core.Services');
835  $canCurrentUserGossip = Services::get('user')->canCurrentUserGossip($user->getId());
836  if (!$canCurrentUserGossip) {
837  return new JSONMessage(false, __('user.authorization.roleBasedAccessDenied'));
838  }
839 
840  $requestArgs = array_merge($this->getRequestArgs(), array('reviewAssignmentId' => $reviewAssignment->getId()));
841  import('lib.pkp.controllers.grid.users.reviewer.form.ReviewerGossipForm');
842  $reviewerGossipForm = new ReviewerGossipForm($user, $requestArgs);
843 
844  // View form
845  if (!$request->isPost()) {
846  return new JSONMessage(true, $reviewerGossipForm->fetch($request));
847  }
848 
849  // Execute form
850  $reviewerGossipForm->readInputData();
851  if ($reviewerGossipForm->validate()) {
852  $reviewerGossipForm->execute();
853  return new JSONMessage(true);
854  }
855 
856  return new JSONMessage(false, __('user.authorization.roleBasedAccessDenied'));
857  }
858 
859 
866  function fetchTemplateBody($args, $request) {
867  import('lib.pkp.classes.mail.SubmissionMailTemplate');
868  $template = new SubmissionMailTemplate($this->getSubmission(), $request->getUserVar('template'));
869  if (!$template) return;
870 
871  $user = $request->getUser();
872  $dispatcher = $request->getDispatcher();
873  $context = $request->getContext();
874 
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')), // Deprecated; for OJS 2.x templates
882  ));
883  $template->replaceParams();
884 
885  return new JSONMessage(true, $template->getBody());
886  }
887 
888 
889  //
890  // Private helper methods
891  //
898  function _fetchReviewerForm($args, $request) {
899  $selectionType = $request->getUserVar('selectionType');
900  assert(!empty($selectionType));
901  $formClassName = $this->_getReviewerFormClassName($selectionType);
902  $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES);
903 
904  // Form handling.
905  import('lib.pkp.controllers.grid.users.reviewer.form.' . $formClassName );
906  $reviewerForm = new $formClassName($this->getSubmission(), $this->getReviewRound());
907  $reviewerForm->initData();
908  $reviewerForm->setUserRoles($userRoles);
909 
910  return $reviewerForm->fetch($request);
911  }
912 
918  function _getReviewerFormClassName($selectionType) {
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';
926  }
927  assert(false);
928  }
929 
934  function _getReviewAssignmentOps() {
935  // Define operations that need a review assignment policy.
936  return array('readReview', 'reviewHistory', 'reviewRead', 'editThankReviewer', 'thankReviewer', 'editReminder', 'sendReminder', 'unassignReviewer', 'updateUnassignReviewer', 'reinstateReviewer', 'updateReinstateReviewer', 'sendEmail', 'unconsiderReview', 'editReview', 'updateReview', 'gossip');
937 
938  }
939 
944  function _getReviewRoundOps() {
945  // Define operations that need a review round policy.
946  return array(
947  'fetchGrid', 'fetchRow', 'showReviewerForm', 'reloadReviewerForm',
948  'createReviewer', 'enrollReviewer', 'updateReviewer',
949  'getUsersNotAssignedAsReviewers',
950  'fetchTemplateBody'
951  );
952  }
953 
959  protected function _getAuthorDeniedOps() {
960  return array(
961  'showReviewerForm',
962  'reloadReviewerForm',
963  'createReviewer',
964  'enrollReviewer',
965  'updateReviewer',
966  'getUsersNotAssignedAsReviewers',
967  'fetchTemplateBody',
968  'editThankReviewer',
969  'thankReviewer',
970  'editReminder',
971  'sendReminder',
972  'unassignReviewer', 'updateUnassignReviewer',
973  'reinstateReviewer', 'updateReinstateReviewer',
974  'unconsiderReview',
975  'editReview', 'updateReview',
976  );
977  }
978 
984  protected function _getAuthorDeniedBlindOps() {
985  return array(
986  'readReview',
987  'reviewHistory',
988  'reviewRead',
989  'sendEmail',
990  'gossip',
991  );
992  }
993 }
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
PKPReviewerGridHandler\sendReminder
sendReminder($args, $request)
Definition: PKPReviewerGridHandler.inc.php:755
GridColumn
The GridColumn class represents a column within a grid. It is used to format the data presented in a ...
Definition: GridColumn.inc.php:27
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
PKPReviewerGridHandler\reviewRead
reviewRead($args, $request)
Definition: PKPReviewerGridHandler.inc.php:560
PKPReviewerGridHandler\unconsiderReview
unconsiderReview($args, $request)
Definition: PKPReviewerGridHandler.inc.php:517
PKPReviewerGridHandler\updateReview
updateReview($args, $request)
Definition: PKPReviewerGridHandler.inc.php:387
PKPReviewerGridHandler\reinstateReviewer
reinstateReviewer($args, $request)
Definition: PKPReviewerGridHandler.inc.php:450
PKPReviewerGridHandler\__construct
__construct()
Definition: PKPReviewerGridHandler.inc.php:52
ThankReviewerForm
Form for sending a thank you to a reviewer.
Definition: ThankReviewerForm.inc.php:18
PKPReviewerGridHandler\updateReviewer
updateReviewer($args, $request)
Definition: PKPReviewerGridHandler.inc.php:350
PKPReviewerGridHandler\_getReviewerFormClassName
_getReviewerFormClassName($selectionType)
Definition: PKPReviewerGridHandler.inc.php:927
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PKPReviewerGridHandler\initialize
initialize($request, $args=null)
Definition: PKPReviewerGridHandler.inc.php:182
ReviewRoundRequiredPolicy
Policy that ensures that the request contains a valid review round.
Definition: ReviewRoundRequiredPolicy.inc.php:17
SubmissionMailTemplate
Subclass of MailTemplate for sending emails related to submissions.
Definition: SubmissionMailTemplate.inc.php:20
PKPReviewerGridHandler\showReviewerForm
showReviewerForm($args, $request)
Definition: PKPReviewerGridHandler.inc.php:308
PKPReviewerGridHandler\sendEmail
sendEmail($args, $request)
Definition: PKPReviewerGridHandler.inc.php:780
PKPReviewerGridHandler\_getReviewRoundOps
_getReviewRoundOps()
Definition: PKPReviewerGridHandler.inc.php:953
SubmissionLog\logEvent
static logEvent($request, $submission, $eventType, $messageKey, $params=array())
Definition: SubmissionLog.inc.php:34
PKPReviewerGridHandler\editThankReviewer
editThankReviewer($args, $request)
Definition: PKPReviewerGridHandler.inc.php:633
PKPReviewerGridHandler\editReminder
editReminder($args, $request)
Definition: PKPReviewerGridHandler.inc.php:736
EmailReviewerForm
Form for sending an email to a user.
Definition: EmailReviewerForm.inc.php:18
PKPReviewerGridHandler\reviewHistory
reviewHistory($args, $request)
Definition: PKPReviewerGridHandler.inc.php:811
PKPReviewerGridHandler\createReviewer
createReviewer($args, $request)
Definition: PKPReviewerGridHandler.inc.php:330
EditReviewForm
Allow the editor to limit the available files to an assigned reviewer after the assignment has taken ...
Definition: EditReviewForm.inc.php:19
GridHandler\addAction
addAction($action, $position=GRID_ACTION_POSITION_ABOVE)
Definition: GridHandler.inc.php:266
PKPReviewerGridHandler\fetchTemplateBody
fetchTemplateBody($args, $request)
Definition: PKPReviewerGridHandler.inc.php:875
GridHandler\addColumn
addColumn($column)
Definition: GridHandler.inc.php:335
SubmissionEventLogEntry
Describes an entry in the submission history log.
Definition: SubmissionEventLogEntry.inc.php:70
PKPReviewerGridHandler\updateReinstateReviewer
updateReinstateReviewer($args, $request)
Definition: PKPReviewerGridHandler.inc.php:468
PKPReviewerGridHandler\loadData
loadData($request, $filter)
Definition: PKPReviewerGridHandler.inc.php:291
PKPReviewerGridHandler
Handle reviewer grid requests.
Definition: PKPReviewerGridHandler.inc.php:28
PKPReviewerGridHandler\getSubmission
getSubmission()
Definition: PKPReviewerGridHandler.inc.php:146
PKPReviewerGridHandler\reloadReviewerForm
reloadReviewerForm($args, $request)
Definition: PKPReviewerGridHandler.inc.php:318
PKPReviewerGridHandler\_getReviewAssignmentOps
_getReviewAssignmentOps()
Definition: PKPReviewerGridHandler.inc.php:943
PKPReviewerGridHandler\enrollReviewer
enrollReviewer($args, $request)
Definition: PKPReviewerGridHandler.inc.php:340
DAO\getDataChangedEvent
static getDataChangedEvent($elementId=null, $parentElementId=null, $content='')
Definition: DAO.inc.php:647
PKPReviewerGridHandler\thankReviewer
thankReviewer($args, $request)
Definition: PKPReviewerGridHandler.inc.php:707
PKPReviewerGridHandler\getReviewRound
getReviewRound()
Definition: PKPReviewerGridHandler.inc.php:162
ReviewReminderForm
Form for sending a review reminder to a reviewer.
Definition: ReviewReminderForm.inc.php:18
Application\getContextAssocType
static getContextAssocType()
Definition: Application.inc.php:199
GridHandler\noAutocompleteResults
noAutocompleteResults()
Definition: GridHandler.inc.php:942
ReinstateReviewerForm
Allow the editor to reinstate a cancelled review assignment.
Definition: ReinstateReviewerForm.inc.php:17
ReviewerGridRow
Reviewer grid row definition.
Definition: ReviewerGridRow.inc.php:18
PKPReviewerGridHandler\editReview
editReview($args, $request)
Definition: PKPReviewerGridHandler.inc.php:373
PKPReviewerGridHandler\$_isCurrentUserAssignedAuthor
$_isCurrentUserAssignedAuthor
Definition: PKPReviewerGridHandler.inc.php:46
PKPReviewerGridHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: PKPReviewerGridHandler.inc.php:80
ReviewerGossipForm
Form for viewing and editing gossip about a reviewer.
Definition: ReviewerGossipForm.inc.php:18
PKPReviewerGridHandler\getStageId
getStageId()
Definition: PKPReviewerGridHandler.inc.php:154
PKPReviewerGridHandler\getRowInstance
getRowInstance()
Definition: PKPReviewerGridHandler.inc.php:271
ReviewerGridCellProvider
Base class for a cell provider that can retrieve labels for reviewer grid rows.
Definition: ReviewerGridCellProvider.inc.php:21
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
AjaxModal
A modal that retrieves its content from via AJAX.
Definition: AjaxModal.inc.php:18
LinkAction
Base class defining an action that can be performed by the user in the user interface.
Definition: LinkAction.inc.php:22
PKPReviewerGridHandler\updateUnassignReviewer
updateUnassignReviewer($args, $request)
Definition: PKPReviewerGridHandler.inc.php:493
PKPReviewerGridHandler\getUsersNotAssignedAsReviewers
getUsersNotAssignedAsReviewers($args, $request)
Definition: PKPReviewerGridHandler.inc.php:406
GridHandler\setTitle
setTitle($title)
Definition: GridHandler.inc.php:215
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
PKPReviewerGridHandler\getRequestArgs
getRequestArgs()
Definition: PKPReviewerGridHandler.inc.php:278
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
WorkflowStageAccessPolicy
Class to control access to OMP's submission workflow stage components.
Definition: WorkflowStageAccessPolicy.inc.php:19
PKPReviewerGridHandler\_getAuthorDeniedOps
_getAuthorDeniedOps()
Definition: PKPReviewerGridHandler.inc.php:968
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
GridHandler
This class defines basic operations for handling HTML grids. Grids are used to implement a standardiz...
Definition: GridHandler.inc.php:58
PKPReviewerGridHandler\gossip
gossip($args, $request)
Definition: PKPReviewerGridHandler.inc.php:836
PKPReviewerGridHandler\readReview
readReview($args, $request)
Definition: PKPReviewerGridHandler.inc.php:653
PKPReviewerGridHandler\$_stageId
$_stageId
Definition: PKPReviewerGridHandler.inc.php:40
PKPReviewerGridHandler\$_submission
$_submission
Definition: PKPReviewerGridHandler.inc.php:34
PKPReviewerGridHandler\_getAuthorDeniedBlindOps
_getAuthorDeniedBlindOps()
Definition: PKPReviewerGridHandler.inc.php:993
NotificationManager
Definition: NotificationManager.inc.php:19
ReviewAssignment\getReviewerRecommendationOptions
static getReviewerRecommendationOptions()
Definition: ReviewAssignment.inc.php:656
PKPReviewerGridHandler\unassignReviewer
unassignReviewer($args, $request)
Definition: PKPReviewerGridHandler.inc.php:432
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
PKPReviewerGridHandler\_fetchReviewerForm
_fetchReviewerForm($args, $request)
Definition: PKPReviewerGridHandler.inc.php:907
ReviewAssignmentRequiredPolicy
Policy that ensures that the request contains a valid review assignment.
Definition: ReviewAssignmentRequiredPolicy.inc.php:17
UnassignReviewerForm
Allow the editor to remove a review assignment.
Definition: UnassignReviewerForm.inc.php:17
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49