17 import(
'lib.pkp.classes.form.Form');
38 parent::__construct(
'controllers/grid/users/reviewer/form/defaultReviewerForm.tpl');
43 $this->
addCheck(
new FormValidator($this,
'responseDueDate',
'required',
'editor.review.errorAddingReviewer'));
44 $this->
addCheck(
new FormValidator($this,
'reviewDueDate',
'required',
'editor.review.errorAddingReviewer'));
49 import(
'lib.pkp.classes.mail.SubmissionMailTemplate');
61 return $submission->getId();
85 $this->_submission = $submission;
93 $this->_reviewRound = $reviewRound;
101 $this->_reviewerFormActions[$action->getId()] = $action;
109 $this->_userRoles = $userRoles;
135 $reviewerId = (int) $request->getUserVar(
'reviewerId');
136 $context = $request->getContext();
141 if (!empty($reviewerId)) {
142 if ($this->
_isValidReviewer($context, $submission, $reviewRound, $reviewerId)) {
144 $reviewer = $userDao->getById($reviewerId);
145 $this->
setData(
'userNameString', sprintf(
'%s (%s)', $reviewer->getFullname(), $reviewer->getUsername()));
151 $reviewAssignment = $reviewAssignmentDao->getReviewAssignment($reviewRound->getId(), $reviewerId, $reviewRound->getRound());
154 if (isset($reviewAssignment) && $reviewAssignment->getReviewMethod() !=
false) {
155 $reviewMethod = $reviewAssignment->getReviewMethod();
156 $reviewFormId = $reviewAssignment->getReviewFormId();
159 $reviewMethod = $context->getData(
'defaultReviewMode');
160 if (!$reviewMethod) $reviewMethod = SUBMISSION_REVIEW_METHOD_DOUBLEBLIND;
165 $section = $sectionDao->getById($submission->getSectionId(), $context->getId());
166 if ($section) $reviewFormId = $section->getReviewFormId();
167 else $reviewFormId =
null;
171 if (isset($reviewAssignment) && $reviewAssignment->getDueDate() !=
null) {
172 $reviewDueDate = strtotime($reviewAssignment->getDueDate());
174 $numWeeks = (int) $context->getData(
'numWeeksPerReview');
175 if ($numWeeks<=0) $numWeeks=4;
176 $reviewDueDate = strtotime(
'+' . $numWeeks .
' week');
178 if (isset($reviewAssignment) && $reviewAssignment->getResponseDueDate() !=
null) {
179 $responseDueDate = strtotime($reviewAssignment->getResponseDueDate());
181 $numWeeks = (int) $context->getData(
'numWeeksPerResponse');
182 if ($numWeeks<=0) $numWeeks=3;
183 $responseDueDate = strtotime(
'+' . $numWeeks .
' week');
187 $selectionType = (int) $request->getUserVar(
'selectionType');
188 $stageId = $reviewRound->getStageId();
191 $this->
setData(
'stageId', $stageId);
192 $this->
setData(
'reviewMethod', $reviewMethod);
193 $this->
setData(
'reviewFormId', $reviewFormId);
194 $this->
setData(
'reviewRoundId', $reviewRound->getId());
195 $this->
setData(
'reviewerId', $reviewerId);
197 $context = $request->getContext();
201 $user = $request->getUser();
202 $dispatcher = $request->getDispatcher();
204 $template->assignParams(array(
205 'contextUrl' => $dispatcher->url($request, ROUTE_PAGE, $context->getPath()),
206 'editorialContactSignature' => $user->getContactSignature(),
207 'signatureFullName' => $user->getFullname(),
208 'passwordResetUrl' => $dispatcher->url($request, ROUTE_PAGE, $context->getPath(),
'login',
'lostPassword'),
209 'messageToReviewer' => __(
'reviewer.step1.requestBoilerplate'),
210 'abstractTermIfEnabled' => ($submission->getLocalizedAbstract() ==
'' ?
'' : __(
'common.abstract')),
212 $template->replaceParams();
214 $this->
setData(
'personalMessage', $template->getBody());
215 $this->
setData(
'responseDueDate', $responseDueDate);
216 $this->
setData(
'reviewDueDate', $reviewDueDate);
217 $this->
setData(
'selectionType', $selectionType);
223 function fetch($request, $template =
null, $display =
false) {
224 $context = $request->getContext();
228 $reviewMethods = $reviewAssignmentDao->getReviewMethodsTranslationKeys();
232 $templateMgr->assign(
'reviewMethods', $reviewMethods);
237 $reviewForms = array();
238 while ($reviewForm = $reviewFormsIterator->next()) {
239 $reviewForms[$reviewForm->getId()] = $reviewForm->getLocalizedTitle();
242 $templateMgr->assign(
'reviewForms', $reviewForms);
243 $templateMgr->assign(
'emailVariables', array(
244 'reviewerName' => __(
'user.name'),
245 'responseDueDate' => __(
'reviewer.submission.responseDueDate'),
246 'reviewDueDate' => __(
'reviewer.submission.reviewDueDate'),
247 'submissionReviewUrl' => __(
'common.url'),
248 'reviewerUserName' => __(
'user.username'),
254 $user = $request->getUser();
257 $userRoles = $roleDao->getByUserId($user->getId(), $submission->getData(
'contextId'));
258 foreach ($userRoles as $userRole) {
259 if (in_array($userRole->getId(), array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT))) {
260 $emailTemplatesIterator =
Services::get(
'emailTemplate')->getMany([
261 'contextId' => $submission->getData(
'contextId'),
264 $customTemplateKeys = [];
265 foreach ($emailTemplatesIterator as $emailTemplate) {
266 $customTemplateKeys[] = $emailTemplate->getData(
'key');
268 $templateKeys = array_merge($templateKeys, $customTemplateKeys);
273 $templates = array();
274 foreach ($templateKeys as $templateKey) {
276 $thisTemplate->assignParams(array());
277 $templates[$templateKey] = $thisTemplate->getSubject();
280 $templateMgr->assign(
'templates', $templates);
283 $context = $request->getContext();
286 $reviewerUserGroups = $userGroupDao->getUserGroupsByStage($context->getId(), $reviewRound->getStageId(), ROLE_ID_REVIEWER);
287 $userGroups = array();
288 while($userGroup = $reviewerUserGroups->next()) {
289 $userGroups[$userGroup->getId()] = $userGroup->getLocalizedName();
292 $this->
setData(
'userGroups', $userGroups);
293 return parent::fetch($request, $template, $display);
323 parent::execute(...$functionParams);
327 $context = $request->getContext();
330 $stageId = $currentReviewRound->getStageId();
331 $reviewDueDate = $this->
getData(
'reviewDueDate');
332 $responseDueDate = $this->
getData(
'responseDueDate');
335 $reviewerId = (int) $this->
getData(
'reviewerId');
337 if (!$this->
_isValidReviewer($context, $submission, $currentReviewRound, $reviewerId)) {
341 $reviewMethod = (int) $this->
getData(
'reviewMethod');
343 import(
'lib.pkp.classes.submission.action.EditorAction');
345 $editorAction->addReviewer($request, $submission, $reviewerId, $currentReviewRound, $reviewDueDate, $responseDueDate, $reviewMethod);
349 $reviewAssignment = $reviewAssignmentDao->getReviewAssignment($currentReviewRound->getId(), $reviewerId, $currentReviewRound->getRound(), $stageId);
351 $reviewAssignment->stampModified();
354 $reviewFormId = (int) $this->
getData(
'reviewFormId');
357 $reviewAssignment->setReviewFormId($reviewForm?$reviewFormId:
null);
359 $reviewAssignmentDao->updateObject($reviewAssignment);
363 import(
'lib.pkp.classes.submission.SubmissionFile');
364 $submissionFiles = $submissionFileDao->getLatestRevisionsByReviewRound($currentReviewRound, SUBMISSION_FILE_REVIEW_FILE);
365 $selectedFiles = (array) $this->
getData(
'selectedFiles');
367 foreach ($submissionFiles as $submissionFile) {
368 if (in_array($submissionFile->getFileId(), $selectedFiles)) {
369 $reviewFilesDao->grant($reviewAssignment->getId(), $submissionFile->getFileId());
374 import(
'lib.pkp.classes.mail.SubmissionMailTemplate');
375 $templateKey = $this->
getData(
'template');
378 $reviewer = $userDao->getById($reviewerId);
380 if ($mail->isEnabled() && !$this->getData(
'skipEmail')) {
381 $user = $request->getUser();
382 $mail->addRecipient($reviewer->getEmail(), $reviewer->getFullName());
383 $mail->setBody($this->
getData(
'personalMessage'));
384 $dispatcher = $request->getDispatcher();
388 if ($context->getData(
'reviewerAccessKeysEnabled')) {
389 import(
'lib.pkp.classes.security.AccessKeyManager');
391 $expiryDays = ($context->getData(
'numWeeksPerReview') + 4) * 7;
392 $accessKey = $accessKeyManager->createKey($context->getId(), $reviewerId, $reviewAssignment->getId(), $expiryDays);
393 $reviewUrlArgs = array_merge($reviewUrlArgs, array(
'reviewId' => $reviewAssignment->getId(),
'key' => $accessKey));
397 $mail->assignParams(array(
398 'reviewerName' => $reviewer->getFullName(),
399 'responseDueDate' => $responseDueDate,
400 'reviewDueDate' => $reviewDueDate,
401 'reviewerUserName' => $reviewer->getUsername(),
402 'submissionReviewUrl' => $dispatcher->url($request, ROUTE_PAGE,
null,
'reviewer',
'submission',
null, $reviewUrlArgs)
404 if (!$mail->send($request)) {
405 import(
'classes.notification.NotificationManager');
407 $notificationMgr->createTrivialNotification($request->getUser()->getId(), NOTIFICATION_TYPE_ERROR, array(
'contents' => __(
'email.compose.error')));
412 $currentUser = $request->getUser();
414 $msgKey = $this->
getData(
'skipEmail') ?
'notification.addedReviewerNoEmail' :
'notification.addedReviewer';
415 $notificationMgr->createTrivialNotification(
416 $currentUser->getId(),
417 NOTIFICATION_TYPE_SUCCESS,
418 array(
'contents' => __($msgKey, array(
'reviewerName' => $reviewer->getFullName())))
421 return $reviewAssignment;
437 new AjaxAction($request->url(
null,
null,
'reloadReviewerForm',
null, array(
439 'stageId' => $reviewRound->getStageId(),
440 'reviewRoundId' => $reviewRound->getId(),
441 'selectionType' => REVIEWER_SELECT_ADVANCED_SEARCH,
443 __(
'editor.submission.backToSearch'),
462 $reviewerFactory = $userDao->getReviewersNotAssignedToSubmission($context->getId(), $submission->getId(), $reviewRound);
463 $reviewersArray = $reviewerFactory->toAssociativeArray();
464 if (array_key_exists($reviewerId, $reviewersArray)) {
479 $reviewerAccessKeysEnabled = $context->getData(
'reviewerAccessKeysEnabled');
483 case $reviewerAccessKeysEnabled && $round == 1:
return 'REVIEW_REQUEST_ONECLICK';
484 case $reviewerAccessKeysEnabled:
return 'REVIEW_REQUEST_ONECLICK_SUBSEQUENT';
485 case $round == 1:
return 'REVIEW_REQUEST';
486 default:
return 'REVIEW_REQUEST_SUBSEQUENT';