Open Journal Systems  3.3.0
SwordPlugin.inc.php
1 <?php
2 
14 import('lib.pkp.classes.plugins.GenericPlugin');
15 
16 define('SWORD_DEPOSIT_TYPE_AUTOMATIC', 1);
17 define('SWORD_DEPOSIT_TYPE_OPTIONAL_SELECTION', 2);
18 define('SWORD_DEPOSIT_TYPE_OPTIONAL_FIXED', 3);
19 define('SWORD_DEPOSIT_TYPE_MANAGER', 4);
20 
21 define('SWORD_PASSWORD_SLUG', '******');
22 
23 class SwordPlugin extends GenericPlugin {
27  public function register($category, $path, $mainContextId = null) {
28  if (parent::register($category, $path, $mainContextId)) {
29  HookRegistry::register('PluginRegistry::loadCategory', array(&$this, 'callbackLoadCategory'));
30  if ($this->getEnabled()) {
31  $this->import('classes.DepositPointDAO');
32  $depositPointDao = new DepositPointDAO($this);
33  DAORegistry::registerDAO('DepositPointDAO', $depositPointDao);
34 
35  HookRegistry::register('LoadHandler', array($this, 'callbackSwordLoadHandler'));
36  HookRegistry::register('Template::Settings::website', array($this, 'callbackSettingsTab'));
37  HookRegistry::register('LoadComponentHandler', array($this, 'setupGridHandler'));
38  HookRegistry::register('EditorAction::recordDecision', array($this, 'callbackAuthorDeposits'));
39  // Preprints
40  HookRegistry::register('Publication::publish', array($this, 'callbackPublish'));
41  }
42  return true;
43  }
44  return false;
45  }
46 
52  public function callbackPublish($hookName, $args) {
53  $newPublication =& $args[0];
54 
55  if ($newPublication->getData('status') != STATUS_PUBLISHED) return false;
56  $submission = Services::get('submission')->get($newPublication->getData('submissionId'));
57 
58  $this->performAutomaticDeposits($submission);
59  }
60 
66  public function callbackAuthorDeposits($hookName, $args) {
67  $submission =& $args[0];
68  $editorDecision =& $args[1];
69  $decision = $editorDecision['decision'];
70  // Determine if the decision was an "Accept"
71  if ($decision != SUBMISSION_EDITOR_DECISION_ACCEPT) return false;
72 
73  $this->performAutomaticDeposits($submission);
74  }
75 
80  function performAutomaticDeposits(Submission $submission) {
81  // Perform Automatic deposits
82  $request =& Registry::get('request');
83  $user = $request->getUser();
84  $context = $request->getContext();
85  $dispatcher = $request->getDispatcher();
86  $this->import('classes.PKPSwordDeposit');
87  $depositPointDao = DAORegistry::getDAO('DepositPointDAO');
88  $depositPoints = $depositPointDao->getByContextId($context->getId());
89  $sendDepositNotification = $this->getSetting($context->getId(), 'allowAuthorSpecify') ? true : false;
90  while ($depositPoint = $depositPoints->next()) {
91  $depositType = $depositPoint->getType();
92  if (($depositType == SWORD_DEPOSIT_TYPE_OPTIONAL_SELECTION)
93  || $depositType == SWORD_DEPOSIT_TYPE_OPTIONAL_FIXED) {
94  $sendDepositNotification = true;
95  }
96  if ($depositType != SWORD_DEPOSIT_TYPE_AUTOMATIC)
97  continue;
98 
99  try {
100  $deposit = new PKPSwordDeposit($submission);
101  $deposit->setMetadata($request);
102  $deposit->addEditorial();
103  $deposit->createPackage();
104  $deposit->deposit(
105  $depositPoint->getSwordUrl(),
106  $depositPoint->getSwordUsername(),
107  $depositPoint->getSwordPassword(),
108  $depositPoint->getSwordApikey()
109  );
110  $deposit->cleanup();
111  }
112  catch (Exception $e) {
113  $contents = __('plugins.importexport.sword.depositFailed') . ': ' . $e->getMessage();
114  $notificationMgr = new NotificationManager();
115  $notificationMgr->createTrivialNotification(
116  $user->getId(),
117  NOTIFICATION_TYPE_ERROR,
118  array('contents' => $contents)
119  );
120  error_log($e->getTraceAsString());
121  }
122 
123  $user = $request->getUser();
124  $params = array(
125  'itemTitle' => $submission->getLocalizedTitle(),
126  'repositoryName' => $depositPoint->getLocalizedName()
127  );
128  $notificationMgr = new NotificationManager();
129  $notificationMgr->createTrivialNotification(
130  $user->getId(),
131  NOTIFICATION_TYPE_SUCCESS,
132  array('contents' => __('plugins.generic.sword.automaticDepositComplete', $params))
133  );
134  }
135 
136  if ($sendDepositNotification) {
137  $submissionAuthors = [];
138  $dao = new StageAssignmentDAO();
139  $daoResult = $dao->getBySubmissionAndRoleId($submission->getId(), ROLE_ID_AUTHOR);
140  while ($record = $daoResult->next()) {
141  $userId = $record->getData('userId');
142  if (!in_array($userId, $submissionAuthors)) {
143  array_push($submissionAuthors, $userId);
144  }
145  }
146 
147  $userDao = new UserDao();
148 
149  foreach ($submissionAuthors as $userId) {
150  $submittingUser = $userDao->getById($userId);
151  $contactName = $context->getSetting('contactName');
152  $contactEmail = $context->getSetting('contactEmail');
153 
154  import('lib.pkp.classes.mail.SubmissionMailTemplate');
155  $mail = new SubmissionMailTemplate($submission, 'SWORD_DEPOSIT_NOTIFICATION', null, $context, true);
156 
157  $mail->setFrom($contactEmail, $contactName);
158  $mail->addRecipient($submittingUser->getEmail(), $submittingUser->getFullName());
159 
160  $mail->assignParams(array(
161  'contextName' => $context->getLocalizedName(),
162  'submissionTitle' => $submission->getLocalizedTitle(),
163  'swordDepositUrl' => $dispatcher->url(
164  $request, ROUTE_PAGE, null, 'sword', 'index', $submission->getId()
165  )
166  ));
167 
168  $mail->send($request);
169  }
170  }
171 
172  return false;
173  }
174 
178  public function callbackLoadCategory($hookName, $args) {
179  $category =& $args[0];
180  $plugins =& $args[1];
181  switch ($category) {
182  case 'importexport':
183  $this->import('SwordImportExportPlugin');
184  $importExportPlugin = new SwordImportExportPlugin($this);
185  $plugins[$importExportPlugin->getSeq()][$importExportPlugin->getPluginPath()] =& $importExportPlugin;
186  break;
187  }
188  return false;
189  }
190 
194  public function callbackSwordLoadHandler($hookName, $args) {
195  // Check the page.
196  $page = $args[0];
197  if ($page !== 'sword') return;
198 
199  // Check the operation.
200  $op = $args[1];
201 
202  if ($op == 'swordSettings') { // settings tab
203  define('HANDLER_CLASS', 'SwordSettingsTabHandler');
204  $args[2] = $this->getPluginPath() . '/' . 'SwordSettingsTabHandler.inc.php';
205  }
206  else {
207  $publicOps = array(
208  'depositPoints',
209  'performManagerOnlyDeposit',
210  'index',
211  );
212 
213  if (!in_array($op, $publicOps)) return;
214 
215  define('HANDLER_CLASS', 'SwordHandler');
216  $args[2] = $this->getPluginPath() . '/' . 'SwordHandler.inc.php';
217  }
218  }
219 
226  public function callbackSettingsTab($hookName, $args) {
227  $output =& $args[2];
228  $request =& Registry::get('request');
229  $templateMgr = TemplateManager::getManager($request);
230  $dispatcher = $request->getDispatcher();
231  $tabLabel = __('plugins.generic.sword.settingsTabLabel');
232  $templateMgr->assign(['sourceUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'sword', 'swordSettings')]);
233  $output .= $templateMgr->fetch($this->getTemplateResource('swordSettingsTab.tpl'));
234  return false;
235  }
236 
242  public function setupGridHandler($hookName, $params) {
243  $component = $params[0];
244  if ($component == 'plugins.generic.sword.controllers.grid.SwordDepositPointsGridHandler') {
245  import($component);
247  return true;
248  }
249  if ($component == 'plugins.generic.sword.controllers.grid.SubmissionListGridHandler') {
250  import($component);
251  SubmissionListGridHandler::setPlugin($this);
252  return true;
253  }
254  return false;
255  }
256 
261  public function getDisplayName() {
262  return __('plugins.generic.sword.displayName');
263  }
264 
269  public function getDescription() {
270  return __('plugins.generic.sword.description');
271  }
272 
276  public function getActions($request, $verb) {
277  $router = $request->getRouter();
278  $dispatcher = $request->getDispatcher();
279  import('lib.pkp.classes.linkAction.request.RedirectAction');
280  return array_merge(
281  // Settings
282  $this->getEnabled()?array(
283  new LinkAction(
284  'swordSettings',
285  new RedirectAction($dispatcher->url(
286  $request, ROUTE_PAGE,
287  null, 'management', 'settings', 'website',
288  array('uid' => uniqid()),
289  'swordSettings'
290  )),
291  __('manager.plugins.settings'),
292  null
293  ),
294  ):array(),
295  parent::getActions($request, $verb)
296  );
297  }
298 
304  public function getJsUrl($request) {
305  return $request->getBaseUrl() . '/' . $this->getPluginPath() . '/js';
306  }
307 
308  public function getTypeMap() {
309  return array(
310  SWORD_DEPOSIT_TYPE_AUTOMATIC => __('plugins.generic.sword.depositPoints.type.automatic'),
311  SWORD_DEPOSIT_TYPE_OPTIONAL_SELECTION => __('plugins.generic.sword.depositPoints.type.optionalSelection'),
312  SWORD_DEPOSIT_TYPE_OPTIONAL_FIXED => __('plugins.generic.sword.depositPoints.type.optionalFixed'),
313  SWORD_DEPOSIT_TYPE_MANAGER => __('plugins.generic.sword.depositPoints.type.manager'),
314  );
315  }
316 
320  public function getInstallSchemaFile() {
321  return $this->getPluginPath() . '/schema.xml';
322  }
323 
328  return ($this->getPluginPath() . '/emailTemplates.xml');
329  }
330 }
$op
$op
Definition: lib/pkp/pages/help/index.php:18
SwordPlugin
SWORD deposit plugin class.
Definition: SwordPlugin.inc.php:23
SwordPlugin\getInstallSchemaFile
getInstallSchemaFile()
Definition: SwordPlugin.inc.php:320
StageAssignmentDAO
Operations for retrieving and modifying StageAssignment objects.
Definition: StageAssignmentDAO.inc.php:19
SwordPlugin\callbackLoadCategory
callbackLoadCategory($hookName, $args)
Definition: SwordPlugin.inc.php:178
Submission
Article class.
Definition: Submission.inc.php:34
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PKPSwordDeposit
Class providing a SWORD deposit wrapper for submissions.
Definition: PKPSwordDeposit.inc.php:20
SubmissionMailTemplate
Subclass of MailTemplate for sending emails related to submissions.
Definition: SubmissionMailTemplate.inc.php:20
PKPSubmission\getLocalizedTitle
getLocalizedTitle($preferredLocale=null, $includePrefix=true)
Definition: PKPSubmission.inc.php:480
DepositPointDAO
Operations for retrieving and modifying DepositPoint objects.
Definition: DepositPointDAO.inc.php:16
SwordPlugin\callbackPublish
callbackPublish($hookName, $args)
Definition: SwordPlugin.inc.php:52
SwordPlugin\getDescription
getDescription()
Definition: SwordPlugin.inc.php:269
SwordPlugin\callbackSettingsTab
callbackSettingsTab($hookName, $args)
Definition: SwordPlugin.inc.php:226
Plugin\getEnabled
getEnabled()
Definition: Plugin.inc.php:868
Registry\get
static & get($key, $createIfEmpty=false, $createWithDefault=null)
Definition: Registry.inc.php:35
Plugin\getSetting
getSetting($contextId, $name)
Definition: Plugin.inc.php:473
DAORegistry\registerDAO
static registerDAO($name, $dao)
Definition: DAORegistry.inc.php:40
SwordPlugin\getActions
getActions($request, $verb)
Definition: SwordPlugin.inc.php:276
LinkAction
Base class defining an action that can be performed by the user in the user interface.
Definition: LinkAction.inc.php:22
SwordPlugin\getTypeMap
getTypeMap()
Definition: SwordPlugin.inc.php:308
SwordPlugin\setupGridHandler
setupGridHandler($hookName, $params)
Definition: SwordPlugin.inc.php:242
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
RedirectAction
This action request redirects to another page.
Definition: RedirectAction.inc.php:18
SwordDepositPointsGridHandler\setPlugin
static setPlugin($plugin)
Definition: SwordDepositPointsGridHandler.inc.php:26
Plugin\getTemplateResource
getTemplateResource($template=null, $inCore=false)
Definition: Plugin.inc.php:349
SwordPlugin\performAutomaticDeposits
performAutomaticDeposits(Submission $submission)
Definition: SwordPlugin.inc.php:80
SwordPlugin\getDisplayName
getDisplayName()
Definition: SwordPlugin.inc.php:261
Plugin\getPluginPath
getPluginPath()
Definition: Plugin.inc.php:330
Plugin\$request
$request
Definition: Plugin.inc.php:68
DataObject\getId
getId()
Definition: DataObject.inc.php:206
HookRegistry\register
static register($hookName, $callback, $hookSequence=HOOK_SEQUENCE_NORMAL)
Definition: HookRegistry.inc.php:70
SwordPlugin\getInstallEmailTemplatesFile
getInstallEmailTemplatesFile()
Definition: SwordPlugin.inc.php:327
SwordImportExportPlugin
Sword deposit plugin.
Definition: SwordImportExportPlugin.inc.php:16
NotificationManager
Definition: NotificationManager.inc.php:19
SwordPlugin\callbackSwordLoadHandler
callbackSwordLoadHandler($hookName, $args)
Definition: SwordPlugin.inc.php:194
GenericPlugin
Abstract class for generic plugins.
Definition: GenericPlugin.inc.php:18
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49
SwordPlugin\callbackAuthorDeposits
callbackAuthorDeposits($hookName, $args)
Definition: SwordPlugin.inc.php:66
SwordPlugin\getJsUrl
getJsUrl($request)
Definition: SwordPlugin.inc.php:304