Open Journal Systems  2.4.3
 All Classes Namespaces Functions Variables Groups Pages
AuthorAction.inc.php
1 <?php
2 
16 import('classes.submission.common.Action');
17 
18 class AuthorAction extends Action {
19 
23  function AuthorAction() {
24  parent::Action();
25  }
26 
36  function designateReviewVersion($authorSubmission, $designate = false) {
37  import('classes.file.ArticleFileManager');
38  $articleFileManager = new ArticleFileManager($authorSubmission->getId());
39  $authorSubmissionDao =& DAORegistry::getDAO('AuthorSubmissionDAO');
40 
41  if ($designate && !HookRegistry::call('AuthorAction::designateReviewVersion', array(&$authorSubmission))) {
42  $submissionFile =& $authorSubmission->getSubmissionFile();
43  if ($submissionFile) {
44  $reviewFileId = $articleFileManager->copyToReviewFile($submissionFile->getFileId());
45 
46  $authorSubmission->setReviewFileId($reviewFileId);
47 
48  $authorSubmissionDao->updateAuthorSubmission($authorSubmission);
49 
50  $sectionEditorSubmissionDao =& DAORegistry::getDAO('SectionEditorSubmissionDAO');
51  $sectionEditorSubmissionDao->createReviewRound($authorSubmission->getId(), 1, 1);
52  }
53  }
54  }
55 
62  function deleteArticleFile($article, $fileId, $revisionId) {
63  import('classes.file.ArticleFileManager');
64 
65  $articleFileManager = new ArticleFileManager($article->getId());
66  $articleFileDao =& DAORegistry::getDAO('ArticleFileDAO');
67  $authorSubmissionDao =& DAORegistry::getDAO('AuthorSubmissionDAO');
68 
69  $articleFile =& $articleFileDao->getArticleFile($fileId, $revisionId, $article->getId());
70  $authorSubmission = $authorSubmissionDao->getAuthorSubmission($article->getId());
71  $authorRevisions = $authorSubmission->getAuthorFileRevisions();
72 
73  // Ensure that this is actually an author file.
74  if (isset($articleFile)) {
75  HookRegistry::call('AuthorAction::deleteArticleFile', array(&$articleFile, &$authorRevisions));
76  foreach ($authorRevisions as $round) {
77  foreach ($round as $revision) {
78  if ($revision->getFileId() == $articleFile->getFileId() &&
79  $revision->getRevision() == $articleFile->getRevision()) {
80  $articleFileManager->deleteFile($articleFile->getFileId(), $articleFile->getRevision());
81  }
82  }
83  }
84  }
85  }
86 
92  function uploadRevisedVersion($authorSubmission, $request) {
93  import('classes.file.ArticleFileManager');
94  $articleFileManager = new ArticleFileManager($authorSubmission->getId());
95  $authorSubmissionDao =& DAORegistry::getDAO('AuthorSubmissionDAO');
96 
97  $fileName = 'upload';
98  if ($articleFileManager->uploadedFileExists($fileName)) {
99  HookRegistry::call('AuthorAction::uploadRevisedVersion', array(&$authorSubmission));
100  if ($authorSubmission->getRevisedFileId() != null) {
101  $fileId = $articleFileManager->uploadEditorDecisionFile($fileName, $authorSubmission->getRevisedFileId());
102  } else {
103  $fileId = $articleFileManager->uploadEditorDecisionFile($fileName);
104  }
105  }
106 
107  if (isset($fileId) && $fileId != 0) {
108  $authorSubmission->setRevisedFileId($fileId);
109 
110  $authorSubmissionDao->updateAuthorSubmission($authorSubmission);
111 
112  $user =& $request->getUser();
113  $journal =& $request->getJournal();
114  import('classes.mail.ArticleMailTemplate');
115  $email = new ArticleMailTemplate($authorSubmission, 'REVISED_VERSION_NOTIFY');
116  if ($email->isEnabled()) {
117  $isEditor = false;
118  $assignedSectionEditors = $email->toAssignedEditingSectionEditors($authorSubmission->getId());
119  $editor = array_shift($assignedSectionEditors);
120  if (!$editor) {
121  $isEditor = true;
122  $assignedEditors = $email->toAssignedEditors($authorSubmission->getId());
123  $editor = array_shift($assignedEditors);
124  }
125  if (!$editor) {
126  $email->addRecipient($journal->getSetting('contactEmail'), $journal->getSetting('contactName'));
127  $editorName = $journal->getSetting('contactName');
128  } else {
129  $editorName = $editor->getEditorFullName();
130  }
131 
132  $paramArray = array(
133  'editorialContactName' => $editorName,
134  'articleTitle' => $authorSubmission->getLocalizedTitle(),
135  'authorName' => $user->getFullName(),
136  'submissionUrl' => $request->url(null, $isEditor?'editor':'sectionEditor', 'submissionReview', $authorSubmission->getId()),
137  'editorialContactSignature' => $journal->getSetting('contactName') . "\n" . $journal->getLocalizedTitle()
138  );
139  $email->assignParams($paramArray);
140  $email->send($request);
141  }
142  // Add log entry
143  import('classes.article.log.ArticleLog');
144  ArticleLog::logEvent($request, $authorSubmission, ARTICLE_LOG_AUTHOR_REVISION, 'log.author.documentRevised', array('authorName' => $user->getFullName(), 'fileId' => $fileId));
145  }
146  }
147 
154  function completeAuthorCopyedit($authorSubmission, $send, $request) {
155  $authorSubmissionDao =& DAORegistry::getDAO('AuthorSubmissionDAO');
156  $signoffDao =& DAORegistry::getDAO('SignoffDAO');
157  $userDao =& DAORegistry::getDAO('UserDAO');
158  $journal =& $request->getJournal();
159 
160  $authorSignoff = $signoffDao->build('SIGNOFF_COPYEDITING_AUTHOR', ASSOC_TYPE_ARTICLE, $authorSubmission->getId());
161  if ($authorSignoff->getDateCompleted() != null) {
162  return true;
163  }
164 
165  $user =& $request->getUser();
166  import('classes.mail.ArticleMailTemplate');
167  $email = new ArticleMailTemplate($authorSubmission, 'COPYEDIT_AUTHOR_COMPLETE');
168 
169  $editAssignments = $authorSubmission->getEditAssignments();
170 
171  $copyeditor = $authorSubmission->getUserBySignoffType('SIGNOFF_COPYEDITING_INITIAL');
172 
173  if (!$email->isEnabled() || ($send && !$email->hasErrors())) {
174  HookRegistry::call('AuthorAction::completeAuthorCopyedit', array(&$authorSubmission, &$email));
175  if ($email->isEnabled()) {
176  $email->send($request);
177  }
178 
179  $authorSignoff->setDateCompleted(Core::getCurrentDate());
180 
181  $finalSignoff = $signoffDao->build('SIGNOFF_COPYEDITING_FINAL', ASSOC_TYPE_ARTICLE, $authorSubmission->getId());
182  if ($copyeditor) $finalSignoff->setUserId($copyeditor->getId());
183  $finalSignoff->setDateNotified(Core::getCurrentDate());
184 
185  $signoffDao->updateObject($authorSignoff);
186  $signoffDao->updateObject($finalSignoff);
187 
188  // Add log entry
189  import('classes.article.log.ArticleLog');
190  ArticleLog::logEvent($request, $authorSubmission, ARTICLE_LOG_COPYEDIT_REVISION, 'log.copyedit.authorFile');
191 
192  return true;
193  } else {
194  if (!$request->getUserVar('continued')) {
195  if (isset($copyeditor)) {
196  $email->addRecipient($copyeditor->getEmail(), $copyeditor->getFullName());
197  $assignedSectionEditors = $email->ccAssignedEditingSectionEditors($authorSubmission->getId());
198  $assignedEditors = $email->ccAssignedEditors($authorSubmission->getId());
199  if (empty($assignedSectionEditors) && empty($assignedEditors)) {
200  $email->addCc($journal->getSetting('contactEmail'), $journal->getSetting('contactName'));
201  $editorName = $journal->getSetting('contactName');
202  } else {
203  $editor = array_shift($assignedSectionEditors);
204  if (!$editor) $editor = array_shift($assignedEditors);
205  $editorName = $editor->getEditorFullName();
206  }
207  } else {
208  $assignedSectionEditors = $email->toAssignedEditingSectionEditors($authorSubmission->getId());
209  $assignedEditors = $email->ccAssignedEditors($authorSubmission->getId());
210  if (empty($assignedSectionEditors) && empty($assignedEditors)) {
211  $email->addRecipient($journal->getSetting('contactEmail'), $journal->getSetting('contactName'));
212  $editorName = $journal->getSetting('contactName');
213  } else {
214  $editor = array_shift($assignedSectionEditors);
215  if (!$editor) $editor = array_shift($assignedEditors);
216  $editorName = $editor->getEditorFullName();
217  }
218  }
219 
220  $paramArray = array(
221  'editorialContactName' => isset($copyeditor)?$copyeditor->getFullName():$editorName,
222  'authorName' => $user->getFullName()
223  );
224  $email->assignParams($paramArray);
225  }
226  $email->displayEditForm($request->url(null, 'author', 'completeAuthorCopyedit', 'send'), array('articleId' => $authorSubmission->getId()));
227 
228  return false;
229  }
230  }
231 
235  function copyeditUnderway($authorSubmission) {
236  $authorSubmissionDao =& DAORegistry::getDAO('AuthorSubmissionDAO');
237  $signoffDao =& DAORegistry::getDAO('SignoffDAO');
238 
239  $authorSignoff = $signoffDao->build('SIGNOFF_COPYEDITING_AUTHOR', ASSOC_TYPE_ARTICLE, $authorSubmission->getId());
240  if ($authorSignoff->getDateNotified() != null && $authorSignoff->getDateUnderway() == null) {
241  HookRegistry::call('AuthorAction::copyeditUnderway', array(&$authorSubmission));
242  $authorSignoff->setDateUnderway(Core::getCurrentDate());
243  $signoffDao->updateObject($authorSignoff);
244  }
245  }
246 
252  function uploadCopyeditVersion($authorSubmission, $copyeditStage) {
253  import('classes.file.ArticleFileManager');
254  $articleFileManager = new ArticleFileManager($authorSubmission->getId());
255  $authorSubmissionDao =& DAORegistry::getDAO('AuthorSubmissionDAO');
256  $articleFileDao =& DAORegistry::getDAO('ArticleFileDAO');
257  $signoffDao =& DAORegistry::getDAO('SignoffDAO');
258 
259  // Authors cannot upload if the assignment is not active, i.e.
260  // they haven't been notified or the assignment is already complete.
261  $authorSignoff = $signoffDao->build('SIGNOFF_COPYEDITING_AUTHOR', ASSOC_TYPE_ARTICLE, $authorSubmission->getId());
262  if (!$authorSignoff->getDateNotified() || $authorSignoff->getDateCompleted()) return;
263 
264  $fileName = 'upload';
265  if ($articleFileManager->uploadedFileExists($fileName)) {
266  HookRegistry::call('AuthorAction::uploadCopyeditVersion', array(&$authorSubmission, &$copyeditStage));
267  if ($authorSignoff->getFileId() != null) {
268  $fileId = $articleFileManager->uploadCopyeditFile($fileName, $authorSignoff->getFileId());
269  } else {
270  $fileId = $articleFileManager->uploadCopyeditFile($fileName);
271  }
272  }
273 
274  $authorSignoff->setFileId($fileId);
275 
276  if ($copyeditStage == 'author') {
277  $authorSignoff->setFileRevision($articleFileDao->getRevisionNumber($fileId));
278  }
279 
280  $signoffDao->updateObject($authorSignoff);
281  }
282 
283  //
284  // Comments
285  //
286 
291  function viewLayoutComments($article) {
292  if (!HookRegistry::call('AuthorAction::viewLayoutComments', array(&$article))) {
293  import('classes.submission.form.comment.LayoutCommentForm');
294  $commentForm = new LayoutCommentForm($article, ROLE_ID_EDITOR);
295  $commentForm->initData();
296  $commentForm->display();
297  }
298  }
299 
305  function postLayoutComment($article, $emailComment, $request) {
306  if (!HookRegistry::call('AuthorAction::postLayoutComment', array(&$article, &$emailComment))) {
307  import('classes.submission.form.comment.LayoutCommentForm');
308 
309  $commentForm = new LayoutCommentForm($article, ROLE_ID_AUTHOR);
310  $commentForm->readInputData();
311 
312  if ($commentForm->validate()) {
313  $commentForm->execute();
314 
315  // Send a notification to associated users
316  import('classes.notification.NotificationManager');
317  $notificationManager = new NotificationManager();
318  $notificationUsers = $article->getAssociatedUserIds(true, false);
319  foreach ($notificationUsers as $userRole) {
320  $notificationManager->createNotification(
321  $request, $userRole['id'], NOTIFICATION_TYPE_LAYOUT_COMMENT,
322  $article->getJournalId(), ASSOC_TYPE_ARTICLE, $article->getId()
323  );
324  }
325 
326  if ($emailComment) {
327  $commentForm->email($request);
328  }
329  } else {
330  $commentForm->display();
331  return false;
332  }
333  return true;
334  }
335  }
336 
341  function viewEditorDecisionComments($article) {
342  if (!HookRegistry::call('AuthorAction::viewEditorDecisionComments', array(&$article))) {
343  import('classes.submission.form.comment.EditorDecisionCommentForm');
344 
345  $commentForm = new EditorDecisionCommentForm($article, ROLE_ID_AUTHOR);
346  $commentForm->initData();
347  $commentForm->display();
348  }
349  }
350 
357  function emailEditorDecisionComment($authorSubmission, $send, $request) {
358  $userDao =& DAORegistry::getDAO('UserDAO');
359 
360  $journal =& $request->getJournal();
361  $user =& $request->getUser();
362 
363  import('classes.mail.ArticleMailTemplate');
364  $email = new ArticleMailTemplate($authorSubmission);
365 
366  $editAssignments = $authorSubmission->getEditAssignments();
367  $editors = array();
368  foreach ($editAssignments as $editAssignment) {
369  array_push($editors, $userDao->getUser($editAssignment->getEditorId()));
370  }
371 
372  if ($send && !$email->hasErrors()) {
373  HookRegistry::call('AuthorAction::emailEditorDecisionComment', array(&$authorSubmission, &$email));
374  $email->send($request);
375 
376  $articleCommentDao =& DAORegistry::getDAO('ArticleCommentDAO');
377  $articleComment = new ArticleComment();
378  $articleComment->setCommentType(COMMENT_TYPE_EDITOR_DECISION);
379  $articleComment->setRoleId(ROLE_ID_AUTHOR);
380  $articleComment->setArticleId($authorSubmission->getId());
381  $articleComment->setAuthorId($authorSubmission->getUserId());
382  $articleComment->setCommentTitle($email->getSubject());
383  $articleComment->setComments($email->getBody());
384  $articleComment->setDatePosted(Core::getCurrentDate());
385  $articleComment->setViewable(true);
386  $articleComment->setAssocId($authorSubmission->getId());
387  $articleCommentDao->insertArticleComment($articleComment);
388 
389  return true;
390  } else {
391  if (!$request->getUserVar('continued')) {
392  $email->setSubject($authorSubmission->getLocalizedTitle());
393  if (!empty($editors)) {
394  foreach ($editors as $editor) {
395  $email->addRecipient($editor->getEmail(), $editor->getFullName());
396  }
397  } else {
398  $email->addRecipient($journal->getSetting('contactEmail'), $journal->getSetting('contactName'));
399  }
400  }
401 
402  $email->displayEditForm(Request::url(null, null, 'emailEditorDecisionComment', 'send'), array('articleId' => $authorSubmission->getId()), 'submission/comment/editorDecisionEmail.tpl');
403 
404  return false;
405  }
406  }
407 
412  function viewCopyeditComments($article) {
413  if (!HookRegistry::call('AuthorAction::viewCopyeditComments', array(&$article))) {
414  import('classes.submission.form.comment.CopyeditCommentForm');
415 
416  $commentForm = new CopyeditCommentForm($article, ROLE_ID_AUTHOR);
417  $commentForm->initData();
418  $commentForm->display();
419  }
420  }
421 
428  function postCopyeditComment($article, $emailComment, $request) {
429  if (!HookRegistry::call('AuthorAction::postCopyeditComment', array(&$article, &$emailComment))) {
430  import('classes.submission.form.comment.CopyeditCommentForm');
431 
432  $commentForm = new CopyeditCommentForm($article, ROLE_ID_AUTHOR);
433  $commentForm->readInputData();
434 
435  if ($commentForm->validate()) {
436  $commentForm->execute();
437 
438  // Send a notification to associated users
439  import('classes.notification.NotificationManager');
440  $notificationManager = new NotificationManager();
441  $notificationUsers = $article->getAssociatedUserIds(true, false);
442  foreach ($notificationUsers as $userRole) {
443  $notificationManager->createNotification(
444  $request, $userRole['id'], NOTIFICATION_TYPE_COPYEDIT_COMMENT,
445  $article->getJournalId(), ASSOC_TYPE_ARTICLE, $article->getId()
446  );
447  }
448 
449  if ($emailComment) {
450  $commentForm->email($request);
451  }
452  } else {
453  $commentForm->display();
454  return false;
455  }
456  return true;
457  }
458  }
459 
464  function viewProofreadComments($article) {
465  if (!HookRegistry::call('AuthorAction::viewProofreadComments', array(&$article))) {
466  import('classes.submission.form.comment.ProofreadCommentForm');
467 
468  $commentForm = new ProofreadCommentForm($article, ROLE_ID_AUTHOR);
469  $commentForm->initData();
470  $commentForm->display();
471  }
472  }
473 
480  function postProofreadComment($article, $emailComment, $request) {
481  if (!HookRegistry::call('AuthorAction::postProofreadComment', array(&$article, &$emailComment))) {
482  import('classes.submission.form.comment.ProofreadCommentForm');
483 
484  $commentForm = new ProofreadCommentForm($article, ROLE_ID_AUTHOR);
485  $commentForm->readInputData();
486 
487  if ($commentForm->validate()) {
488  $commentForm->execute();
489 
490  // Send a notification to associated users
491  import('classes.notification.NotificationManager');
492  $notificationManager = new NotificationManager();
493  $notificationUsers = $article->getAssociatedUserIds(true, false);
494  foreach ($notificationUsers as $userRole) {
495  $notificationManager->createNotification(
496  $request, $userRole['id'], NOTIFICATION_TYPE_PROOFREAD_COMMENT,
497  $article->getJournalId(), ASSOC_TYPE_ARTICLE, $article->getId()
498  );
499  }
500 
501  if ($emailComment) {
502  $commentForm->email($request);
503  }
504 
505  } else {
506  $commentForm->display();
507  return false;
508  }
509  return true;
510  }
511  }
512 
513  //
514  // Misc
515  //
516 
525  function downloadAuthorFile($article, $fileId, $revision = null) {
526  $signoffDao =& DAORegistry::getDAO('SignoffDAO');
527  $authorSubmissionDao =& DAORegistry::getDAO('AuthorSubmissionDAO');
528 
529  $authorSubmission =& $authorSubmissionDao->getAuthorSubmission($article->getId());
530  $layoutSignoff = $signoffDao->getBySymbolic('SIGNOFF_LAYOUT', ASSOC_TYPE_ARTICLE, $authorSubmission->getId());
531 
532  $canDownload = false;
533 
534  // Authors have access to:
535  // 1) The original submission file.
536  // 2) Any files uploaded by the reviewers that are "viewable",
537  // although only after a decision has been made by the editor.
538  // 3) The initial and final copyedit files, after initial copyedit is complete.
539  // 4) Any of the author-revised files.
540  // 5) The layout version of the file.
541  // 6) Any supplementary file
542  // 7) Any galley file
543  // 8) All review versions of the file
544  // 9) Current editor versions of the file
545  // THIS LIST SHOULD NOW BE COMPLETE.
546  if ($authorSubmission->getSubmissionFileId() == $fileId) {
547  $canDownload = true;
548  } else if ($authorSubmission->getFileBySignoffType('SIGNOFF_COPYEDITING_INITIAL', true) == $fileId) {
549  if ($revision != null) {
550  $initialSignoff = $signoffDao->getBySymbolic('SIGNOFF_COPYEDITING_INITIAL', ASSOC_TYPE_ARTICLE, $authorSubmission->getId());
551  $authorSignoff = $signoffDao->getBySymbolic('SIGNOFF_COPYEDITING_AUTHOR', ASSOC_TYPE_ARTICLE, $authorSubmission->getId());
552  $finalSignoff = $signoffDao->getBySymbolic('SIGNOFF_COPYEDITING_FINAL', ASSOC_TYPE_ARTICLE, $authorSubmission->getId());
553 
554  if ($initialSignoff && $initialSignoff->getFileRevision()==$revision && $initialSignoff->getDateCompleted()!=null) $canDownload = true;
555  else if ($finalSignoff && $finalSignoff->getFileRevision()==$revision && $finalSignoff->getDateCompleted()!=null) $canDownload = true;
556  else if ($authorSignoff && $authorSignoff->getFileRevision()==$revision) $canDownload = true;
557  } else {
558  $canDownload = false;
559  }
560  } else if ($authorSubmission->getFileBySignoffType('SIGNOFF_COPYEDITING_AUTHOR', true) == $fileId){
561  $canDownload = true;
562  } else if ($authorSubmission->getRevisedFileId() == $fileId) {
563  $canDownload = true;
564  } else if ($layoutSignoff->getFileId() == $fileId) {
565  $canDownload = true;
566  } else {
567  // Check reviewer files
568  foreach ($authorSubmission->getReviewAssignments() as $roundReviewAssignments) {
569  foreach ($roundReviewAssignments as $reviewAssignment) {
570  if ($reviewAssignment->getReviewerFileId() == $fileId) {
571  $articleFileDao =& DAORegistry::getDAO('ArticleFileDAO');
572 
573  $articleFile =& $articleFileDao->getArticleFile($fileId, $revision);
574 
575  if ($articleFile != null && $articleFile->getViewable()) {
576  $canDownload = true;
577  }
578  }
579  }
580  }
581 
582  // Check supplementary files
583  foreach ($authorSubmission->getSuppFiles() as $suppFile) {
584  if ($suppFile->getFileId() == $fileId) {
585  $canDownload = true;
586  }
587  }
588 
589  // Check galley files
590  foreach ($authorSubmission->getGalleys() as $galleyFile) {
591  if ($galleyFile->getFileId() == $fileId) {
592  $canDownload = true;
593  }
594  }
595 
596  // Check current review version
597  $reviewAssignmentDao =& DAORegistry::getDAO('ReviewAssignmentDAO');
598  $reviewFilesByRound =& $reviewAssignmentDao->getReviewFilesByRound($article->getId());
599  $reviewFile = @$reviewFilesByRound[$article->getCurrentRound()];
600  if ($reviewFile && $fileId == $reviewFile->getFileId()) {
601  $canDownload = true;
602  }
603 
604  // Check editor version
605  $editorFiles = $authorSubmission->getEditorFileRevisions($article->getCurrentRound());
606  if (is_array($editorFiles)) foreach ($editorFiles as $editorFile) {
607  if ($editorFile->getFileId() == $fileId) {
608  $canDownload = true;
609  }
610  }
611  }
612 
613  $result = false;
614  if (!HookRegistry::call('AuthorAction::downloadAuthorFile', array(&$article, &$fileId, &$revision, &$canDownload, &$result))) {
615  if ($canDownload) {
616  return Action::downloadFile($article->getId(), $fileId, $revision);
617  } else {
618  return false;
619  }
620  }
621  return $result;
622  }
623 }
624 
625 ?>
postCopyeditComment($article, $emailComment, $request)
logEvent(&$request, &$article, $eventType, $messageKey, $params=array())
emailEditorDecisionComment($authorSubmission, $send, $request)
downloadFile($articleId, $fileId, $revision=null)
Definition: Action.inc.php:180
uploadRevisedVersion($authorSubmission, $request)
viewProofreadComments($article)
deleteArticleFile($article, $fileId, $revisionId)
Subclass of MailTemplate for sending emails related to articles.
postProofreadComment($article, $emailComment, $request)
getCurrentDate($ts=null)
Definition: Core.inc.php:94
downloadAuthorFile($article, $fileId, $revision=null)
Application-specific submission actions.
Definition: Action.inc.php:44
postLayoutComment($article, $emailComment, $request)
LayoutComment form.
designateReviewVersion($authorSubmission, $designate=false)
& getDAO($name, $dbconn=null)
Class defining operations for article file management.
url($journalPath=null, $page=null, $op=null, $path=null, $params=null, $anchor=null, $escape=false)
Definition: Request.inc.php:88
ProofreadComment form.
call($hookName, $args=null)
uploadCopyeditVersion($authorSubmission, $copyeditStage)
viewCopyeditComments($article)
copyeditUnderway($authorSubmission)
CopyeditComment form.
AuthorAction class.
viewEditorDecisionComments($article)
Class for ArticleComment.
completeAuthorCopyedit($authorSubmission, $send, $request)
viewLayoutComments($article)