Open Journal Systems  3.3.0
PKPManageFileApiHandler.inc.php
1 <?php
2 
16 // Import the base handler.
17 import('classes.handler.Handler');
18 import('lib.pkp.classes.core.JSONMessage');
19 
20 abstract class PKPManageFileApiHandler extends Handler {
21 
25  function __construct() {
26  parent::__construct();
27  $this->addRoleAssignment(
28  array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT, ROLE_ID_REVIEWER, ROLE_ID_AUTHOR),
29  array('deleteFile', 'editMetadata', 'editMetadataTab', 'saveMetadata')
30  );
31  // Load submission-specific translations
32  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_SUBMISSION);
33  }
34 
35  //
36  // Implement methods from PKPHandler
37  //
38  function authorize($request, &$args, $roleAssignments) {
39  import('lib.pkp.classes.security.authorization.SubmissionFileAccessPolicy');
40  $this->addPolicy(new SubmissionFileAccessPolicy($request, $args, $roleAssignments, SUBMISSION_FILE_ACCESS_MODIFY));
41 
42  return parent::authorize($request, $args, $roleAssignments);
43  }
44 
45  //
46  // Public handler methods
47  //
54  function deleteFile($args, $request) {
55  if (!$request->checkCSRF()) return new JSONMessage(false);
56 
57  $submissionFile = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION_FILE);
58  $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
59  $stageId = $request->getUserVar('stageId');
60 
61  assert(isset($submissionFile) && isset($submission)); // Should have been validated already
62 
63  $noteDao = DAORegistry::getDAO('NoteDAO'); /* @var $noteDao NoteDAO */
64  $noteDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION_FILE, $submissionFile->getFileId());
65 
66  // Retrieve the review round so it can be updated after the file is
67  // deleted
68  if ($submissionFile->getFileStage() == SUBMISSION_FILE_REVIEW_REVISION) {
69  import('lib.pkp.classes.submission.reviewRound.ReviewRoundDAO');
70  $reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); /* @var $reviewRoundDao ReviewRoundDAO */
71  $reviewRound = $reviewRoundDao->getBySubmissionFileId($submissionFile->getFileId());
72  }
73 
74  // Detach any dependent entities to this file deletion.
75  $this->detachEntities($submissionFile, $submission->getId(), $stageId);
76 
77  // Delete the submission file.
78  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
79  if (!$submissionFileDao->deleteRevisionById($submissionFile->getFileId(), $submissionFile->getRevision(), $submissionFile->getFileStage(), $submission->getId())) return new JSONMessage(false);
80 
81  $notificationMgr = new NotificationManager();
82  switch ($submissionFile->getFileStage()) {
83  case SUBMISSION_FILE_REVIEW_REVISION:
84  // Get a list of author user IDs
85  $authorUserIds = array();
86  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmentDao StageAssignmentDAO */
87  $submitterAssignments = $stageAssignmentDao->getBySubmissionAndRoleId($submission->getId(), ROLE_ID_AUTHOR);
88  while ($assignment = $submitterAssignments->next()) {
89  $authorUserIds[] = $assignment->getUserId();
90  }
91 
92  // Update the notifications
93  $notificationMgr->updateNotification(
94  $request,
95  array(NOTIFICATION_TYPE_PENDING_INTERNAL_REVISIONS, NOTIFICATION_TYPE_PENDING_EXTERNAL_REVISIONS),
96  $authorUserIds,
97  ASSOC_TYPE_SUBMISSION,
98  $submission->getId()
99  );
100 
101  // Update the ReviewRound status when revision is submitted
102  $reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); /* @var $reviewRoundDao ReviewRoundDAO */
103  $reviewRoundDao->updateStatus($reviewRound);
104  break;
105 
106  case SUBMISSION_FILE_COPYEDIT:
107  $notificationMgr->updateNotification(
108  $request,
109  array(NOTIFICATION_TYPE_ASSIGN_COPYEDITOR, NOTIFICATION_TYPE_AWAITING_COPYEDITS),
110  null,
111  ASSOC_TYPE_SUBMISSION,
112  $submission->getId()
113  );
114  break;
115  }
116 
117  $this->removeFileIndex($submission, $submissionFile);
118  $fileManager = $this->getFileManager($submission->getContextId(), $submission->getId());
119  $fileManager->deleteById($submissionFile->getFileId(), $submissionFile->getRevision());
120 
121  $this->setupTemplate($request);
122  $user = $request->getUser();
123  if (!$request->getUserVar('suppressNotification')) NotificationManager::createTrivialNotification($user->getId(), NOTIFICATION_TYPE_SUCCESS, array('contents' => __('notification.removedFile')));
124 
125  $this->logDeletionEvent($request, $submission, $submissionFile, $user);
126 
127  return DAO::getDataChangedEvent();
128  }
129 
136  function editMetadata($args, $request) {
137  $submissionFile = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION_FILE);
138  if ($submissionFile->getFileStage() == SUBMISSION_FILE_PROOF) {
139  $templateMgr = TemplateManager::getManager($request);
140  $templateMgr->assign('submissionFile', $submissionFile);
141  $templateMgr->assign('stageId', $request->getUserVar('stageId'));
142  return new JSONMessage(true, $templateMgr->fetch('controllers/api/file/editMetadata.tpl'));
143  } else {
144  return $this->editMetadataTab($args, $request);
145  }
146  }
147 
154  function editMetadataTab($args, $request) {
155  $submissionFile = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION_FILE);
156  $reviewRound = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ROUND);
157  $stageId = $request->getUserVar('stageId');
158  $metadataForm = $submissionFile->getMetadataForm($stageId, $reviewRound);
159  $metadataForm->setShowButtons(true);
160  return new JSONMessage(true, $metadataForm->fetch($request));
161  }
162 
170  function saveMetadata($args, $request) {
171  $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
172  $submissionFile = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION_FILE);
173  $reviewRound = $this->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ROUND);
174  $stageId = $request->getUserVar('stageId');
175  $metadataForm = $submissionFile->getMetadataForm($stageId, $reviewRound);
176  $metadataForm->readInputData();
177  if ($metadataForm->validate()) {
178  $metadataForm->execute();
179  $submissionFile = $metadataForm->getSubmissionFile();
180 
181  // Get a list of author user IDs
182  $authorUserIds = array();
183  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmentDao StageAssignmentDAO */
184  $submitterAssignments = $stageAssignmentDao->getBySubmissionAndRoleId($submission->getId(), ROLE_ID_AUTHOR);
185  while ($assignment = $submitterAssignments->next()) {
186  $authorUserIds[] = $assignment->getUserId();
187  }
188 
189  // Update the notifications
190  $notificationMgr = new NotificationManager(); /* @var $notificationMgr NotificationManager */
191  $notificationMgr->updateNotification(
192  $request,
193  $this->getUpdateNotifications(),
194  $authorUserIds,
195  ASSOC_TYPE_SUBMISSION,
196  $submission->getId()
197  );
198 
199  if ($reviewRound) {
200 
201  // Delete any 'revision requested' notifications since revisions are now in.
202  $context = $request->getContext();
203  $notificationDao = DAORegistry::getDAO('NotificationDAO'); /* @var $notificationDao NotificationDAO */
204  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmentDao StageAssignmentDAO */
205  $submitterAssignments = $stageAssignmentDao->getBySubmissionAndRoleId($submission->getId(), ROLE_ID_AUTHOR);
206  while ($assignment = $submitterAssignments->next()) {
207  $notificationDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submission->getId(), $assignment->getUserId(), NOTIFICATION_TYPE_EDITOR_DECISION_PENDING_REVISIONS, $context->getId());
208  }
209  }
210 
211  // Log the upload event
212  import('lib.pkp.classes.log.SubmissionLog');
213  import('classes.log.SubmissionEventLogEntry');
214  import('lib.pkp.classes.log.SubmissionFileEventLogEntry'); // constants
215  $user = $request->getUser();
217  $request, $submission,
218  $submissionFile->getRevision()>1?SUBMISSION_LOG_FILE_REVISION_UPLOAD:SUBMISSION_LOG_FILE_UPLOAD,
219  $submissionFile->getRevision()>1?'submission.event.fileRevised':'submission.event.fileUploaded',
220  array('fileStage' => $submissionFile->getFileStage(), 'fileId' => $submissionFile->getFileId(), 'fileRevision' => $submissionFile->getRevision(), 'originalFileName' => $submissionFile->getOriginalFileName(), 'submissionId' => $submissionFile->getSubmissionId(), 'username' => $user->getUsername(), 'name' => $submissionFile->getLocalizedName())
221  );
222 
223  // Inform SearchIndex of changes
224  $articleSearchIndex = Application::getSubmissionSearchIndex();
225  $articleSearchIndex->submissionFilesChanged($submission);
226  $articleSearchIndex->submissionChangesFinished();
227 
228  return DAO::getDataChangedEvent();
229  } else {
230  return new JSONMessage(true, $metadataForm->fetch($request));
231  }
232  }
233 
239  abstract function removeFileIndex($submission, $submissionFile);
240 
247  function getFileManager($contextId, $submissionId) {
248  import('lib.pkp.classes.file.SubmissionFileManager');
249  return new SubmissionFileManager($contextId, $submissionId);
250  }
251 
260  abstract function logDeletionEvent($request, $submission, $submissionFile, $user);
261 
266  protected function getUpdateNotifications() {
267  return array(NOTIFICATION_TYPE_PENDING_EXTERNAL_REVISIONS);
268  }
269 
276  function detachEntities($submissionFile, $submissionId, $stageId) {
277  switch ($submissionFile->getFileStage()) {
278  case SUBMISSION_FILE_REVIEW_FILE:
279  case SUBMISSION_FILE_REVIEW_ATTACHMENT:
280  case SUBMISSION_FILE_REVIEW_REVISION:
281  // check to see if we need to remove review_round_file associations
282  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
283  $submissionFileDao->deleteReviewRoundAssignment($submissionId, $stageId, $submissionFile->getFileId(), $submissionFile->getRevision());
284  }
285  }
286 
287 }
288 
289 
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
SubmissionFileManager
Helper class for database-backed submission file management tasks.
Definition: SubmissionFileManager.inc.php:30
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
PKPManageFileApiHandler\logDeletionEvent
logDeletionEvent($request, $submission, $submissionFile, $user)
PKPManageFileApiHandler\getUpdateNotifications
getUpdateNotifications()
Definition: PKPManageFileApiHandler.inc.php:266
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
SubmissionLog\logEvent
static logEvent($request, $submission, $eventType, $messageKey, $params=array())
Definition: SubmissionLog.inc.php:34
PKPManageFileApiHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: PKPManageFileApiHandler.inc.php:38
PKPManageFileApiHandler
Class defining an AJAX API for file manipulation.
Definition: PKPManageFileApiHandler.inc.php:20
PKPNotificationOperationManager\createTrivialNotification
createTrivialNotification($userId, $notificationType=NOTIFICATION_TYPE_SUCCESS, $params=null)
Definition: PKPNotificationOperationManager.inc.php:193
DAO\getDataChangedEvent
static getDataChangedEvent($elementId=null, $parentElementId=null, $content='')
Definition: DAO.inc.php:647
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
PKPManageFileApiHandler\editMetadataTab
editMetadataTab($args, $request)
Definition: PKPManageFileApiHandler.inc.php:154
PKPManageFileApiHandler\deleteFile
deleteFile($args, $request)
Definition: PKPManageFileApiHandler.inc.php:54
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
PKPManageFileApiHandler\detachEntities
detachEntities($submissionFile, $submissionId, $stageId)
Definition: PKPManageFileApiHandler.inc.php:276
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
PKPManageFileApiHandler\removeFileIndex
removeFileIndex($submission, $submissionFile)
PKPManageFileApiHandler\getFileManager
getFileManager($contextId, $submissionId)
Definition: PKPManageFileApiHandler.inc.php:247
SubmissionFileAccessPolicy
Base class to control (write) access to submissions and (read) access to submission files.
Definition: SubmissionFileAccessPolicy.inc.php:23
PKPHandler\setupTemplate
setupTemplate($request)
Definition: PKPHandler.inc.php:466
PKPManageFileApiHandler\editMetadata
editMetadata($args, $request)
Definition: PKPManageFileApiHandler.inc.php:136
PKPManageFileApiHandler\__construct
__construct()
Definition: PKPManageFileApiHandler.inc.php:25
PKPManageFileApiHandler\saveMetadata
saveMetadata($args, $request)
Definition: PKPManageFileApiHandler.inc.php:170
NotificationManager
Definition: NotificationManager.inc.php:19
Application\getSubmissionSearchIndex
static getSubmissionSearchIndex()
Definition: Application.inc.php:169
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
Handler
Base request handler application class.
Definition: Handler.inc.php:18