Open Journal Systems  3.3.0
PKPAuthorDashboardHandler.inc.php
1 <?php
2 
16 // Import base class
17 import('classes.handler.Handler');
18 import('lib.pkp.classes.submission.SubmissionFile'); // SUBMISSION_FILE_REVIEW_...
19 
20 abstract class PKPAuthorDashboardHandler extends Handler {
21 
23  var $_isBackendPage = true;
24 
28  function __construct() {
29  parent::__construct();
30  $this->addRoleAssignment(
31  array(ROLE_ID_AUTHOR),
32  array(
33  'submission',
34  'readSubmissionEmail',
35  )
36  );
37  }
38 
39 
40  //
41  // Implement template methods from PKPHandler
42  //
46  function authorize($request, &$args, $roleAssignments) {
47 
48  import('lib.pkp.classes.security.authorization.AuthorDashboardAccessPolicy');
49  $this->addPolicy(new AuthorDashboardAccessPolicy($request, $args, $roleAssignments), true);
50 
51  return parent::authorize($request, $args, $roleAssignments);
52  }
53 
54 
55  //
56  // Public handler operations
57  //
63  function submission($args, $request) {
64  // Pass the authorized submission on to the template.
65  $this->setupTemplate($request);
66 
67  $templateMgr = TemplateManager::getManager($request);
68  return $templateMgr->display('authorDashboard/authorDashboard.tpl');
69  }
70 
71 
78  function readSubmissionEmail($args, $request) {
79  $submissionEmailLogDao = DAORegistry::getDAO('SubmissionEmailLogDAO'); /* @var $submissionEmailLogDao SubmissionEmailLogDAO */
80  $user = $request->getUser();
81  $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
82  $submissionEmailId = $request->getUserVar('submissionEmailId');
83 
84  $submissionEmailFactory = $submissionEmailLogDao->getByEventType($submission->getId(), SUBMISSION_EMAIL_EDITOR_NOTIFY_AUTHOR, $user->getId());
85  while ($email = $submissionEmailFactory->next()) { // validate the email id for this user.
86  if ($email->getId() == $submissionEmailId) {
87  $templateMgr = TemplateManager::getManager($request);
88  $templateMgr->assign('submissionEmail', $email);
89  return $templateMgr->fetchJson('authorDashboard/submissionEmail.tpl');
90  }
91  }
92  }
93 
100  protected function _fileStageFromWorkflowStage($currentStage) {
101  switch ($currentStage) {
102  case WORKFLOW_STAGE_ID_SUBMISSION:
103  return SUBMISSION_FILE_SUBMISSION;
104  case WORKFLOW_STAGE_ID_EXTERNAL_REVIEW:
105  return SUBMISSION_FILE_REVIEW_REVISION;
106  case WORKFLOW_STAGE_ID_EDITING:
107  return SUBMISSION_FILE_FINAL;
108  default:
109  return null;
110  }
111  }
112 
113 
114  //
115  // Protected helper methods
116  //
120  function setupTemplate($request) {
121  parent::setupTemplate($request);
123  LOCALE_COMPONENT_PKP_ADMIN,
124  LOCALE_COMPONENT_PKP_MANAGER,
125  LOCALE_COMPONENT_PKP_SUBMISSION,
126  LOCALE_COMPONENT_APP_SUBMISSION,
127  LOCALE_COMPONENT_PKP_EDITOR,
128  LOCALE_COMPONENT_APP_EDITOR,
129  LOCALE_COMPONENT_PKP_GRID
130  );
131 
132  $templateMgr = TemplateManager::getManager($request);
133  $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
134  $user = $request->getUser();
135  $submissionContext = $request->getContext();
136  if ($submission->getContextId() !== $submissionContext->getId()) {
137  $submissionContext = Services::get('context')->get($submission->getContextId());
138  }
139 
140  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
141  $contextUserGroups = $userGroupDao->getByRoleId($submission->getData('contextId'), ROLE_ID_AUTHOR)->toArray();
143 
144  $stageNotifications = array();
145  foreach (array_keys($workflowStages) as $stageId) {
146  $stageNotifications[$stageId] = false;
147  }
148 
149  $editDecisionDao = DAORegistry::getDAO('EditDecisionDAO'); /* @var $editDecisionDao EditDecisionDAO */
150  $stageDecisions = $editDecisionDao->getEditorDecisions($submission->getId());
151 
152  // Add an upload revisions button when in the review stage
153  // and the last decision is to request revisions
154  $uploadFileUrl = '';
155  if (in_array($submission->getData('stageId'), [WORKFLOW_STAGE_ID_INTERNAL_REVIEW, WORKFLOW_STAGE_ID_EXTERNAL_REVIEW])) {
156  $fileStage = $this->_fileStageFromWorkflowStage($submission->getData('stageId'));
157  $reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); /* @var $reviewRoundDao ReviewRoundDAO */
158  $lastReviewRound = $reviewRoundDao->getLastReviewRoundBySubmissionId($submission->getId(), $submission->getData('stageId'));
159  if ($fileStage && is_a($lastReviewRound, 'ReviewRound')) {
160  $editDecisionDao = DAORegistry::getDAO('EditDecisionDAO'); /* @var $editDecisionDao EditDecisionDAO */
161  $editorDecisions = $editDecisionDao->getEditorDecisions($submission->getId(), $submission->getData('stageId'), $lastReviewRound->getRound());
162  $lastDecision = array_last($editorDecisions)['decision'];
163  $revisionDecisions = [SUBMISSION_EDITOR_DECISION_PENDING_REVISIONS, SUBMISSION_EDITOR_DECISION_RESUBMIT];
164  if (!empty($editorDecisions) && in_array($lastDecision, $revisionDecisions)) {
165  $actionArgs['submissionId'] = $submission->getId();
166  $actionArgs['stageId'] = $submission->getData('stageId');
167  $actionArgs['uploaderRoles'] = ROLE_ID_AUTHOR;
168  $actionArgs['fileStage'] = $fileStage;
169  $actionArgs['reviewRoundId'] = $lastReviewRound->getId();
170  $uploadFileUrl = $request->getDispatcher()->url(
171  $request,
172  ROUTE_COMPONENT,
173  null,
174  'wizard.fileUpload.FileUploadWizardHandler',
175  'startWizard',
176  null,
177  $actionArgs
178  );
179  }
180  }
181  }
182 
183  $supportedFormLocales = $submissionContext->getSupportedFormLocales();
184  $localeNames = AppLocale::getAllLocales();
185  $locales = array_map(function($localeKey) use ($localeNames) {
186  return ['key' => $localeKey, 'label' => $localeNames[$localeKey]];
187  }, $supportedFormLocales);
188 
189  $latestPublication = $submission->getLatestPublication();
190 
191  $submissionApiUrl = $request->getDispatcher()->url($request, ROUTE_API, $submissionContext->getData('urlPath'), 'submissions/' . $submission->getId());
192  $latestPublicationApiUrl = $request->getDispatcher()->url($request, ROUTE_API, $submissionContext->getData('urlPath'), 'submissions/' . $submission->getId() . '/publications/' . $latestPublication->getId());
193 
194  $contributorsGridUrl = $request->getDispatcher()->url(
195  $request,
196  ROUTE_COMPONENT,
197  null,
198  'grid.users.author.AuthorGridHandler',
199  'fetchGrid',
200  null,
201  [
202  'submissionId' => $submission->getId(),
203  'publicationId' => '__publicationId__',
204  ]
205  );
206 
207  $submissionLibraryUrl = $request->getDispatcher()->url(
208  $request,
209  ROUTE_COMPONENT,
210  null,
211  'modals.documentLibrary.DocumentLibraryHandler',
212  'documentLibrary',
213  null,
214  array('submissionId' => $submission->getId())
215  );
216 
217  $titleAbstractForm = new PKP\components\forms\publication\PKPTitleAbstractForm($latestPublicationApiUrl, $locales, $latestPublication);
218  $citationsForm = new PKP\components\forms\publication\PKPCitationsForm($latestPublicationApiUrl, $latestPublication);
219 
220  // Import constants
221  import('classes.submission.Submission');
222  import('classes.components.forms.publication.PublishForm');
223 
224  $templateMgr->setConstants([
225  'STATUS_QUEUED',
226  'STATUS_PUBLISHED',
227  'STATUS_DECLINED',
228  'STATUS_SCHEDULED',
229  'FORM_TITLE_ABSTRACT',
230  'FORM_CITATIONS',
231  ]);
232 
233  // Get the submission props without the full publication details. We'll
234  // retrieve just the publication information that we need separately to
235  // reduce the amount of data passed to the browser
236  $propNames = Services::get('schema')->getSummaryProps(SCHEMA_SUBMISSION);
237  $propNames = array_filter($propNames, function($propName) { return $propName !== 'publications'; });
238  $submissionProps = Services::get('submission')->getProperties(
239  $submission,
240  $propNames,
241  [
242  'request' => $request,
243  'userGroups' => $contextUserGroups,
244  ]
245  );
246 
247  // Get an array of publication identifiers
248  $publicationList = [];
249  foreach ($submission->getData('publications') as $publication) {
250  $publicationList[] = Services::get('publication')->getProperties(
251  $publication,
252  ['id', 'datePublished', 'status', 'version'],
253  [
254  'context' => $submissionContext,
255  'submission' => $submission,
256  'request' => $request,
257  ]
258  );
259  }
260 
261  // Get full details of the working publication and the currently published publication
262  $workingPublicationProps = Services::get('publication')->getFullProperties(
263  $submission->getLatestPublication(),
264  [
265  'context' => $submissionContext,
266  'submission' => $submission,
267  'request' => $request,
268  'userGroups' => $contextUserGroups,
269  ]
270  );
271  if ($submission->getLatestPublication()->getId() === $submission->getCurrentPublication()->getId()) {
272  $currentPublicationProps = $workingPublicationProps;
273  } else {
274  $currentPublicationProps = Services::get('publication')->getFullProperties(
275  $submission->getCurrentPublication(),
276  [
277  'context' => $submissionContext,
278  'submission' => $submission,
279  'request' => $request,
280  'userGroups' => $contextUserGroups,
281  ]
282  );
283  }
284 
285  // Check if current author can edit metadata
286  $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES);
287  $canEditPublication = true;
288  if (!in_array(ROLE_ID_SITE_ADMIN, $userRoles) && !Services::get('submission')->canEditPublication($submission->getId(), $user->getId())) {
289  $canEditPublication = false;
290  }
291 
292  // Check if current author can access ArticleGalleyGrid within production stage
293  $canAccessProductionStage = true;
294  $userAllowedStages = $this->getAuthorizedContextObject(ASSOC_TYPE_ACCESSIBLE_WORKFLOW_STAGES);
295  if(!array_key_exists(WORKFLOW_STAGE_ID_PRODUCTION, $userAllowedStages)) {
296  $canAccessProductionStage = false;
297  }
298 
299  $state = [
300  'canEditPublication' => $canEditPublication,
301  'components' => [
302  FORM_TITLE_ABSTRACT => $titleAbstractForm->getConfig(),
303  FORM_CITATIONS => $citationsForm->getConfig(),
304  ],
305  'contributorsGridUrl' => $contributorsGridUrl,
306  'currentPublication' => $currentPublicationProps,
307  'publicationFormIds' => [
308  FORM_TITLE_ABSTRACT,
309  FORM_CITATIONS,
310  ],
311  'representationsGridUrl' => $canAccessProductionStage ? $this->_getRepresentationsGridUrl($request, $submission) : '',
312  'submission' => $submissionProps,
313  'publicationList' => $publicationList,
314  'workingPublication' => $workingPublicationProps,
315  'submissionApiUrl' => $submissionApiUrl,
316  'submissionLibraryLabel' => __('grid.libraryFiles.submission.title'),
317  'submissionLibraryUrl' => $submissionLibraryUrl,
318  'supportsReferences' => !!$submissionContext->getData('citations'),
319  'statusLabel' => __('semicolon', ['label' => __('common.status')]),
320  'uploadFileModalLabel' => __('editor.submissionReview.uploadFile'),
321  'uploadFileUrl' => $uploadFileUrl,
322  'versionLabel' => __('semicolon', ['label' => __('admin.version')]),
323  ];
324 
325  // Add the metadata form if one or more metadata fields are enabled
326  $metadataFields = ['coverage', 'disciplines', 'keywords', 'languages', 'rights', 'source', 'subjects', 'agencies', 'type'];
327  $metadataEnabled = false;
328  foreach ($metadataFields as $metadataField) {
329  if ($submissionContext->getData($metadataField)) {
330  $metadataEnabled = true;
331  break;
332  }
333  }
334  if ($metadataEnabled) {
335  $vocabSuggestionUrlBase =$request->getDispatcher()->url($request, ROUTE_API, $submissionContext->getData('urlPath'), 'vocabs', null, null, ['vocab' => '__vocab__']);
336  $metadataForm = new PKP\components\forms\publication\PKPMetadataForm($latestPublicationApiUrl, $locales, $latestPublication, $submissionContext, $vocabSuggestionUrlBase);
337  $templateMgr->setConstants(['FORM_METADATA']);
338  $state['components'][FORM_METADATA] = $metadataForm->getConfig();
339  $state['publicationFormIds'][] = FORM_METADATA;
340  }
341 
342  $templateMgr->setState($state);
343 
344  $templateMgr->assign([
345  'metadataEnabled' => $metadataEnabled,
346  'pageComponent' => 'WorkflowPage',
347  'pageTitle' => join(__('common.titleSeparator'), [
348  $submission->getShortAuthorString(),
349  $submission->getLocalizedTitle()
350  ]),
351  'submission' => $submission,
352  'workflowStages' => $workflowStages,
353  'canAccessProductionStage' => $canAccessProductionStage,
354  ]);
355  }
356 
365  abstract protected function _getRepresentationsGridUrl($request, $submission);
366 }
367 
368 
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
PKPLocale\getAllLocales
static & getAllLocales()
Definition: PKPLocale.inc.php:537
PKPAuthorDashboardHandler\_getRepresentationsGridUrl
_getRepresentationsGridUrl($request, $submission)
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PKPAuthorDashboardHandler
Handle requests for the author dashboard.
Definition: PKPAuthorDashboardHandler.inc.php:20
PKPAuthorDashboardHandler\$_isBackendPage
$_isBackendPage
Definition: PKPAuthorDashboardHandler.inc.php:23
PKPAuthorDashboardHandler\_fileStageFromWorkflowStage
_fileStageFromWorkflowStage($currentStage)
Definition: PKPAuthorDashboardHandler.inc.php:100
PKPAuthorDashboardHandler\__construct
__construct()
Definition: PKPAuthorDashboardHandler.inc.php:28
PKPAuthorDashboardHandler\setupTemplate
setupTemplate($request)
Definition: PKPAuthorDashboardHandler.inc.php:120
PKPAuthorDashboardHandler\readSubmissionEmail
readSubmissionEmail($args, $request)
Definition: PKPAuthorDashboardHandler.inc.php:78
PKPAuthorDashboardHandler\submission
submission($args, $request)
Definition: PKPAuthorDashboardHandler.inc.php:63
AuthorDashboardAccessPolicy
Class to control access to author dashboard.
Definition: AuthorDashboardAccessPolicy.inc.php:18
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
PKPAuthorDashboardHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: PKPAuthorDashboardHandler.inc.php:46
WorkflowStageDAO\getWorkflowStageKeysAndPaths
static getWorkflowStageKeysAndPaths()
Definition: WorkflowStageDAO.inc.php:92
PKP\components\forms\publication\PKPTitleAbstractForm
Definition: PKPTitleAbstractForm.inc.php:21
PKP\components\forms\publication\PKPCitationsForm
Definition: PKPCitationsForm.inc.php:20
PKP\components\forms\publication\PKPMetadataForm
Definition: PKPMetadataForm.inc.php:21
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
Handler
Base request handler application class.
Definition: Handler.inc.php:18
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49