/** * Fetches an email template's message body and returns it via AJAX. * @param $args array * @param $request PKPRequest */ function fetchTemplateBody($args, $request) { $templateId = $request->getUserVar('template'); import('lib.pkp.classes.mail.SubmissionMailTemplate'); $template = new SubmissionMailTemplate($this->getSubmission(), $templateId); if ($template) { $user = $request->getUser(); $dispatcher = $request->getDispatcher(); $context = $request->getContext(); $template->assignParams(array('editorialContactSignature' => $user->getContactSignature(), 'signatureFullName' => $user->getFullname())); $json = new JSONMessage(true, $template->getBody() . "\n" . $context->getSetting('emailSignature')); return $json->getString(); } }
/** * Deletes the review assignment and notifies the reviewer via email * * @param mixed $args * @param $request PKPRequest * @return bool whether or not the review assignment was deleted successfully */ function execute($args, $request) { $submission = $this->getSubmission(); $reviewAssignment = $this->getReviewAssignment(); // Notify the reviewer via email. import('lib.pkp.classes.mail.SubmissionMailTemplate'); $mail = new SubmissionMailTemplate($submission, 'REVIEW_CANCEL', null, null, null, false); if ($mail->isEnabled() && !$this->getData('skipEmail')) { $userDao = DAORegistry::getDAO('UserDAO'); $reviewerId = (int) $this->getData('reviewerId'); $reviewer = $userDao->getById($reviewerId); $mail->addRecipient($reviewer->getEmail(), $reviewer->getFullName()); $mail->setBody($this->getData('personalMessage')); $mail->send($request); } // Delete the review assignment. // NB: EditorAction::clearReview() will check that this review // id is actually attached to the submission so no need for further // validation here. import('lib.pkp.classes.submission.action.EditorAction'); $editorAction = new EditorAction(); return $editorAction->clearReview($request, $submission->getId(), $reviewAssignment->getId()); }
/** * Send the email * @param $request PKPRequest * @param $submission Submission */ function execute($request, $submission) { $userDao = DAORegistry::getDAO('UserDAO'); $toUser = $userDao->getById($this->_reviewAssignment->getReviewerId()); $fromUser = $request->getUser(); import('lib.pkp.classes.mail.SubmissionMailTemplate'); $email = new SubmissionMailTemplate($submission); $email->addRecipient($toUser->getEmail(), $toUser->getFullName()); $email->setReplyTo($fromUser->getEmail(), $fromUser->getFullName()); $email->setSubject($this->getData('subject')); $email->setBody($this->getData('message')); $email->assignParams(); $email->send(); }
/** * Get the reviewer response email template. */ function getResponseEmail($submission, $reviewAssignment, $request, $decline) { import('lib.pkp.classes.mail.SubmissionMailTemplate'); $email = new SubmissionMailTemplate($submission, $decline ? 'REVIEW_DECLINE' : 'REVIEW_CONFIRM'); // Get reviewer $userDao = DAORegistry::getDAO('UserDAO'); $reviewer = $userDao->getById($reviewAssignment->getReviewerId()); // Get editorial contact name $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); $userDao = DAORegistry::getDAO('UserDAO'); $stageAssignments = $stageAssignmentDao->getBySubmissionAndStageId($submission->getId(), $reviewAssignment->getStageId()); $recipient = null; while ($stageAssignment = $stageAssignments->next()) { $userGroup = $userGroupDao->getById($stageAssignment->getUserGroupId()); if (!in_array($userGroup->getRoleId(), array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR))) { continue; } $recipient = $userDao->getById($stageAssignment->getUserId()); $email->addRecipient($recipient->getEmail(), $recipient->getFullName()); } if (!$recipient) { $context = $request->getContext(); $email->addRecipient($context->getSetting('contactEmail'), $context->getSetting('contactName')); } // Get due date $reviewDueDate = strtotime($reviewAssignment->getDateDue()); $dateFormatShort = Config::getVar('general', 'date_format_short'); if ($reviewDueDate == -1) { $reviewDueDate = $dateFormatShort; } else { $reviewDueDate = strftime($dateFormatShort, $reviewDueDate); } $email->setReplyTo($reviewer->getEmail(), $reviewer->getFullName()); $email->assignParams(array('reviewerName' => $reviewer->getFullName(), 'reviewDueDate' => $reviewDueDate)); $email->replaceParams(); return $email; }
/** * Get the reviewer response email template. */ function getResponseEmail($submission, $reviewAssignment, $request, $decline) { import('lib.pkp.classes.mail.SubmissionMailTemplate'); $email = new SubmissionMailTemplate($submission, $decline ? 'REVIEW_DECLINE' : 'REVIEW_CONFIRM'); // Get reviewer $userDao = DAORegistry::getDAO('UserDAO'); $reviewer = $userDao->getById($reviewAssignment->getReviewerId()); // Get editorial contact name $context = $request->getContext(); $email->addRecipient($context->getSetting('contactEmail'), $context->getSetting('contactName')); $editorialContactName = $context->getSetting('contactName'); // Get due date $reviewDueDate = strtotime($reviewAssignment->getDateDue()); $dateFormatShort = Config::getVar('general', 'date_format_short'); if ($reviewDueDate == -1) { $reviewDueDate = $dateFormatShort; } else { $reviewDueDate = strftime($dateFormatShort, $reviewDueDate); } $email->setReplyTo($reviewer->getEmail(), $reviewer->getFullName()); $email->assignParams(array('editorialContactName' => $editorialContactName, 'reviewerName' => $reviewer->getFullName(), 'reviewDueDate' => $reviewDueDate)); return $email; }
/** * Save review assignment * @param $args array * @param $request PKPRequest */ function execute($args, $request) { $userDao = DAORegistry::getDAO('UserDAO'); $submissionDao = Application::getSubmissionDAO(); $reviewAssignment = $this->getReviewAssignment(); $reviewerId = $reviewAssignment->getReviewerId(); $reviewer = $userDao->getById($reviewerId); $submission = $submissionDao->getById($reviewAssignment->getSubmissionId()); import('lib.pkp.classes.mail.SubmissionMailTemplate'); $email = new SubmissionMailTemplate($submission, 'REVIEW_REMIND', null, null, null, false); $email->addRecipient($reviewer->getEmail(), $reviewer->getFullName()); $email->setBody($this->getData('message')); $email->send($request); // update the ReviewAssignment with the reminded and modified dates $reviewAssignment->setDateReminded(Core::getCurrentDate()); $reviewAssignment->stampModified(); $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); $reviewAssignmentDao->updateObject($reviewAssignment); }
/** * Save review assignment * @param $args array * @param $request PKPRequest */ function execute($args, $request) { $userDao = DAORegistry::getDAO('UserDAO'); $submissionDao = Application::getSubmissionDAO(); $reviewAssignment = $this->getReviewAssignment(); $reviewerId = $reviewAssignment->getReviewerId(); $reviewer = $userDao->getById($reviewerId); $submission = $submissionDao->getById($reviewAssignment->getSubmissionId()); import('lib.pkp.classes.mail.SubmissionMailTemplate'); $email = new SubmissionMailTemplate($submission, 'REVIEW_ACK', null, null, null, false); $email->addRecipient($reviewer->getEmail(), $reviewer->getFullName()); $email->setBody($this->getData('message')); if (!$this->getData('skipEmail')) { HookRegistry::call('ThankReviewerForm::thankReviewer', array(&$submission, &$reviewAssignment, &$email)); $email->send($request); } // update the ReviewAssignment with the acknowledged date $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); $reviewAssignment->setDateAcknowledged(Core::getCurrentDate()); $reviewAssignment->stampModified(); $reviewAssignment->setUnconsidered(REVIEW_ASSIGNMENT_NOT_UNCONSIDERED); $reviewAssignmentDao->updateObject($reviewAssignment); }
/** * Save review assignment * @param $args array * @param $request PKPRequest */ function execute($args, $request) { $userDao = DAORegistry::getDAO('UserDAO'); $submissionDao = Application::getSubmissionDAO(); $reviewAssignment = $this->getReviewAssignment(); $reviewerId = $reviewAssignment->getReviewerId(); $reviewer = $userDao->getById($reviewerId); $submission = $submissionDao->getById($reviewAssignment->getSubmissionId()); $reviewDueDate = $this->getData('reviewDueDate'); $dispatcher = $request->getDispatcher(); $user = $request->getUser(); import('lib.pkp.classes.mail.SubmissionMailTemplate'); $email = new SubmissionMailTemplate($submission, 'REVIEW_REMIND', null, null, null, false); $email->addRecipient($reviewer->getEmail(), $reviewer->getFullName()); $email->setBody($this->getData('message')); $email->assignParams(array('reviewerName' => $reviewer->getFullName(), 'reviewDueDate' => $reviewDueDate, 'passwordResetUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'login', 'resetPassword', $reviewer->getUsername(), array('confirm' => Validation::generatePasswordResetHash($reviewer->getId()))), 'submissionReviewUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'reviewer', 'submission', null, array('submissionId' => $reviewAssignment->getSubmissionId())), 'editorialContactSignature' => $user->getContactSignature())); $email->send($request); // update the ReviewAssignment with the reminded and modified dates $reviewAssignment->setDateReminded(Core::getCurrentDate()); $reviewAssignment->stampModified(); $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); $reviewAssignmentDao->updateObject($reviewAssignment); }
/** * Sends an email with a personal message and the selected * review attachements to the author. Also marks review attachments * selected by the editor as "viewable" for the author. * @param $submission Submission * @param $emailKey string An email template. * @param $request PKPRequest */ function _sendReviewMailToAuthor($submission, $emailKey, $request) { // Send personal message to author. import('lib.pkp.classes.mail.SubmissionMailTemplate'); $email = new SubmissionMailTemplate($submission, $emailKey, null, null, null, false); $email->setBody($this->getData('personalMessage')); $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); $userDao = DAORegistry::getDAO('UserDAO'); $submitterAssignments = $stageAssignmentDao->getBySubmissionAndRoleId($submission->getId(), ROLE_ID_AUTHOR); while ($submitterAssignment = $submitterAssignments->next()) { $submitterUser = $userDao->getById($submitterAssignment->getUserId()); $email->addRecipient($submitterUser->getEmail(), $submitterUser->getFullName()); } DAORegistry::getDAO('SubmissionEmailLogDAO'); // Load constants $email->setEventType(SUBMISSION_EMAIL_EDITOR_NOTIFY_AUTHOR); // Get review round. $reviewRound = $this->getReviewRound(); if (is_a($reviewRound, 'ReviewRound')) { // Retrieve review indexes. $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); /* @var $reviewAssignmentDao ReviewAssignmentDAO */ $reviewIndexes = $reviewAssignmentDao->getReviewIndexesForRound($submission->getId(), $reviewRound->getId()); assert(is_array($reviewIndexes)); // Add a review index for review attachments not associated with // a review assignment (i.e. attachments uploaded by the editor). $lastIndex = end($reviewIndexes); $reviewIndexes[-1] = $lastIndex + 1; // Attach the selected reviewer attachments to the email. $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */ $selectedAttachments = $this->getData('selectedAttachments'); if (is_array($selectedAttachments)) { foreach ($selectedAttachments as $fileId) { // Retrieve the submission file. $submissionFile = $submissionFileDao->getLatestRevision($fileId); assert(is_a($submissionFile, 'SubmissionFile')); // Check the association information. if ($submissionFile->getAssocType() == ASSOC_TYPE_REVIEW_ASSIGNMENT) { // The review attachment has been uploaded by a reviewer. $reviewAssignmentId = $submissionFile->getAssocId(); assert(is_numeric($reviewAssignmentId)); } else { // The review attachment has been uploaded by the editor. $reviewAssignmentId = -1; } // Identify the corresponding review index. assert(isset($reviewIndexes[$reviewAssignmentId])); $reviewIndex = $reviewIndexes[$reviewAssignmentId]; assert(!is_null($reviewIndex)); // Add the attachment to the email. $email->addAttachment($submissionFile->getFilePath(), String::enumerateAlphabetically($reviewIndex) . '-' . $submissionFile->getOriginalFileName()); // Update submission file to set viewable as true, so author // can view the file on their submission summary page. $submissionFile->setViewable(true); $submissionFileDao->updateObject($submissionFile); } } } // Send the email. if (!$this->getData('skipEmail')) { $router = $request->getRouter(); $dispatcher = $router->getDispatcher(); $context = $request->getContext(); $email->assignParams(array('submissionUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'authorDashboard', 'submission', $submission->getId()), 'contextName' => $context->getLocalizedName())); $email->send($request); } }
/** * Send the automatic review reminder to the reviewer. * @param $reviewAssignment ReviewAssignment * @param $submission Submission * @param $context Context * @param $reminderType string * REVIEW_REMIND_AUTO, REVIEW_REQUEST_REMIND_AUTO */ function sendReminder($reviewAssignment, $submission, $context, $reminderType = REVIEW_REMIND_AUTO) { $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); $userDao = DAORegistry::getDAO('UserDAO'); $reviewId = $reviewAssignment->getId(); $reviewer = $userDao->getById($reviewAssignment->getReviewerId()); if (!isset($reviewer)) { return false; } import('lib.pkp.classes.mail.SubmissionMailTemplate'); $emailKey = $reminderType; $reviewerAccessKeysEnabled = $context->getSetting('reviewerAccessKeysEnabled'); switch (true) { case $reviewerAccessKeysEnabled && $reminderType == REVIEW_REMIND_AUTO: $emailKey = 'REVIEW_REMIND_AUTO_ONECLICK'; break; case $reviewerAccessKeysEnabled && $reminderType == REVIEW_REQUEST_REMIND_AUTO: $emailKey = 'REVIEW_REQUEST_REMIND_AUTO_ONECLICK'; break; } $email = new SubmissionMailTemplate($submission, $emailKey, $context->getPrimaryLocale(), $context, false); $email->setContext($context); $email->setReplyTo(null); $email->addRecipient($reviewer->getEmail(), $reviewer->getFullName()); $email->setSubject($email->getSubject($context->getPrimaryLocale())); $email->setBody($email->getBody($context->getPrimaryLocale())); $urlParams = array('submissionId' => $reviewAssignment->getSubmissionId()); if ($reviewerAccessKeysEnabled) { import('lib.pkp.classes.security.AccessKeyManager'); $accessKeyManager = new AccessKeyManager(); // Key lifetime is the typical review period plus four weeks $keyLifetime = ($context->getSetting('numWeeksPerReview') + 4) * 7; $urlParams['key'] = $accessKeyManager->createKey('ReviewerContext', $reviewer->getId(), $reviewId, $keyLifetime); } $application = PKPApplication::getApplication(); $request = $application->getRequest(); $dispatcher = $application->getDispatcher(); $submissionReviewUrl = $dispatcher->url($request, ROUTE_PAGE, $context->getPath(), 'reviewer', 'submission', null, $urlParams); // Format the review due date $reviewDueDate = strtotime($reviewAssignment->getDateDue()); $dateFormatShort = Config::getVar('general', 'date_format_short'); if ($reviewDueDate === -1 || $reviewDueDate === false) { // Default to something human-readable if no date specified $reviewDueDate = '_____'; } else { $reviewDueDate = strftime($dateFormatShort, $reviewDueDate); } // Format the review response due date $responseDueDate = strtotime($reviewAssignment->getDateResponseDue()); if ($responseDueDate === -1 || $responseDueDate === false) { // Default to something human-readable if no date specified $responseDueDate = '_____'; } else { $responseDueDate = strftime($dateFormatShort, $responseDueDate); } AppLocale::requireComponents(LOCALE_COMPONENT_PKP_REVIEWER); AppLocale::requireComponents(LOCALE_COMPONENT_PKP_COMMON); $paramArray = array('reviewerName' => $reviewer->getFullName(), 'reviewerUserName' => $reviewer->getUsername(), 'reviewDueDate' => $reviewDueDate, 'responseDueDate' => $responseDueDate, 'editorialContactSignature' => $context->getSetting('contactName') . "\n" . $context->getLocalizedName(), 'passwordResetUrl' => $dispatcher->url($request, ROUTE_PAGE, $context->getPath(), 'login', 'resetPassword', $reviewer->getUsername(), array('confirm' => Validation::generatePasswordResetHash($reviewer->getId()))), 'submissionReviewUrl' => $submissionReviewUrl, 'messageToReviewer' => __('reviewer.step1.requestBoilerplate'), 'abstractTermIfEnabled' => $submission->getLocalizedAbstract() == '' ? '' : __('common.abstract')); $email->assignParams($paramArray); $email->send(); $reviewAssignment->setDateReminded(Core::getCurrentDate()); $reviewAssignment->setReminderWasAutomatic(1); $reviewAssignmentDao->updateObject($reviewAssignment); }
function assignParams($paramArray = array()) { $paramArray['sectionName'] = strip_tags($this->submission->getSectionTitle()); parent::assignParams($paramArray); }
/** * Fetches an email template's message body and returns it via AJAX. * @param $args array * @param $request PKPRequest * @return JSONMessage JSON object */ function fetchTemplateBody($args, $request) { $templateId = $request->getUserVar('template'); import('lib.pkp.classes.mail.SubmissionMailTemplate'); $template = new SubmissionMailTemplate($this->getSubmission(), $templateId); if ($template) { $user = $request->getUser(); $dispatcher = $request->getDispatcher(); $context = $request->getContext(); $template->assignParams(array('editorialContactSignature' => $user->getContactSignature(), 'signatureFullName' => $user->getFullname())); $template->replaceParams(); import('controllers.grid.users.stageParticipant.form.StageParticipantNotifyForm'); // exists in each app. $notifyForm = new StageParticipantNotifyForm($this->getSubmission()->getId(), ASSOC_TYPE_SUBMISSION, $this->getAuthorizedContextObject(ASSOC_TYPE_WORKFLOW_STAGE)); return new JSONMessage(true, array('body' => $template->getBody(), 'variables' => $notifyForm->getEmailVariableNames($templateId))); } }
/** * Save review assignment * @param $args array * @param $request PKPRequest */ function execute($args, $request) { $submission = $this->getSubmission(); $context = $request->getContext(); $currentReviewRound = $this->getReviewRound(); $stageId = $currentReviewRound->getStageId(); $reviewDueDate = $this->getData('reviewDueDate'); $responseDueDate = $this->getData('responseDueDate'); // Get reviewer id and validate it. $reviewerId = (int) $this->getData('reviewerId'); if (!$this->_isValidReviewer($context, $submission, $currentReviewRound, $reviewerId)) { fatalError('Invalid reviewer id.'); } $reviewMethod = (int) $this->getData('reviewMethod'); import('lib.pkp.classes.submission.action.EditorAction'); $editorAction = new EditorAction(); $editorAction->addReviewer($request, $submission, $reviewerId, $currentReviewRound, $reviewDueDate, $responseDueDate, $reviewMethod); // Get the reviewAssignment object now that it has been added. $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); /* @var $reviewAssignmentDao ReviewAssignmentDAO */ $reviewAssignment = $reviewAssignmentDao->getReviewAssignment($currentReviewRound->getId(), $reviewerId, $currentReviewRound->getRound(), $stageId); $reviewAssignment->setDateNotified(Core::getCurrentDate()); $reviewAssignment->setCancelled(0); $reviewAssignment->stampModified(); // Ensure that the review form ID is valid, if specified $reviewFormId = (int) $this->getData('reviewFormId'); $reviewFormDao = DAORegistry::getDAO('ReviewFormDAO'); $reviewForm = $reviewFormDao->getById($reviewFormId, Application::getContextAssocType(), $context->getId()); $reviewAssignment->setReviewFormId($reviewForm ? $reviewFormId : null); $reviewAssignmentDao->updateObject($reviewAssignment); // Grant access for this review to all selected files. $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); import('lib.pkp.classes.submission.SubmissionFile'); // File constants $submissionFiles = $submissionFileDao->getLatestRevisionsByReviewRound($currentReviewRound, SUBMISSION_FILE_REVIEW_FILE); $selectedFiles = (array) $this->getData('selectedFiles'); $reviewFilesDao = DAORegistry::getDAO('ReviewFilesDAO'); foreach ($submissionFiles as $submissionFile) { if (in_array($submissionFile->getFileId(), $selectedFiles)) { $reviewFilesDao->grant($reviewAssignment->getId(), $submissionFile->getFileId()); } } // Notify the reviewer via email. import('lib.pkp.classes.mail.SubmissionMailTemplate'); $templateKey = $this->getData('template'); $mail = new SubmissionMailTemplate($submission, $templateKey, null, null, null, false); if ($mail->isEnabled() && !$this->getData('skipEmail')) { $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */ $reviewer = $userDao->getById($reviewerId); $user = $request->getUser(); $mail->addRecipient($reviewer->getEmail(), $reviewer->getFullName()); $mail->setBody($this->getData('personalMessage')); $dispatcher = $request->getDispatcher(); // Set the additional arguments for the one click url $reviewUrlArgs = array('submissionId' => $this->getSubmissionId()); if ($context->getSetting('reviewerAccessKeysEnabled')) { import('lib.pkp.classes.security.AccessKeyManager'); $accessKeyManager = new AccessKeyManager(); $expiryDays = $context->getSetting('numWeeksPerReview') + 4 * 7; $accessKey = $accessKeyManager->createKey($context->getId(), $reviewerId, $reviewAssignment->getId(), $expiryDays); $reviewUrlArgs = array_merge($reviewUrlArgs, array('reviewId' => $reviewAssignment->getId(), 'key' => $accessKey)); } // Assign the remaining parameters $mail->assignParams(array('reviewerName' => $reviewer->getFullName(), 'responseDueDate' => $responseDueDate, 'reviewDueDate' => $reviewDueDate, 'reviewerUserName' => $reviewer->getUsername(), 'submissionReviewUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'reviewer', 'submission', null, $reviewUrlArgs))); $mail->send($request); } return $reviewAssignment; }
function assignParams($paramArray = array()) { $submission = $this->submission; $paramArray['seriesName'] = strip_tags($submission->getSeriesTitle()); parent::assignParams($paramArray); }
/** * Assign user to copyedit the selected files * @see Form::execute() */ function execute($request) { // Decode the "files" list import('lib.pkp.classes.controllers.listbuilder.ListbuilderHandler'); ListbuilderHandler::unpack($request, $this->getData('files')); // Send the message to the user $submission = $this->getSubmission(); import('lib.pkp.classes.mail.SubmissionMailTemplate'); $email = new SubmissionMailTemplate($submission, 'AUDITOR_REQUEST', null, null, null, false); $email->setBody($this->getData('personalMessage')); $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */ // FIXME: How to validate user IDs? $user = $userDao->getById($this->getData('userId')); import('lib.pkp.controllers.grid.submissions.SubmissionsListGridCellProvider'); list($page, $operation) = SubmissionsListGridCellProvider::getPageAndOperationByUserRoles($request, $submission, $user->getId()); $dispatcher = $request->getDispatcher(); $auditUrl = $dispatcher->url($request, ROUTE_PAGE, null, $page, $operation, array('submissionId' => $submission->getId())); // Other parameters assigned above; see bug #7090. $email->assignParams(array('auditorName' => $user->getFullName(), 'auditorUserName' => $user->getUsername(), 'auditUrl' => $auditUrl)); $email->addRecipient($user->getEmail(), $user->getFullName()); $email->setEventType($this->getEventType()); if (!$this->getData('skipEmail')) { $email->send($request); } }