Open Monograph Press  3.3.0
CSVImportExportPlugin.inc.php
1 <?php
2 
16 import('lib.pkp.classes.plugins.ImportExportPlugin');
17 
22  function __construct() {
23  parent::__construct();
24  }
25 
29  function register($category, $path, $mainContextId = null) {
30  $success = parent::register($category, $path, $mainContextId);
31  $this->addLocaleData();
32  return $success;
33  }
34 
40  function getName() {
41  return 'CSVImportExportPlugin';
42  }
43 
44  function getDisplayName() {
45  return __('plugins.importexport.csv.displayName');
46  }
47 
48  function getDescription() {
49  return __('plugins.importexport.csv.description');
50  }
51 
55  function getActions($request, $actionArgs) {
56  return array(); // Not available via the web interface
57  }
58 
64  function display($args, $request) {
65  $templateMgr = TemplateManager::getManager($request);
66  parent::display($args, $request);
67  switch (array_shift($args)) {
68  case 'index':
69  case '':
70  $templateMgr->display($this->getTemplateResource('index.tpl'));
71  break;
72  }
73  }
74 
79  function executeCLI($scriptName, &$args) {
80 
81  AppLocale::requireComponents(LOCALE_COMPONENT_APP_COMMON);
82 
83  $filename = array_shift($args);
84  $username = array_shift($args);
85 
86  if (!$filename || !$username) {
87  $this->usage($scriptName);
88  exit();
89  }
90 
91  if (!file_exists($filename)) {
92  echo __('plugins.importexport.csv.fileDoesNotExist', array('filename' => $filename)) . "\n";
93  exit();
94  }
95 
96  $data = file($filename);
97 
98  if (is_array($data) && count($data) > 0) {
99 
100  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
101  $user = $userDao->getByUsername($username);
102  if (!$user) {
103  echo __('plugins.importexport.csv.unknownUser', array('username' => $username)) . "\n";
104  exit();
105  }
106 
107  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
108  $authorDao = DAORegistry::getDAO('AuthorDAO'); /* @var $authorDao AuthorDAO */
109  $pressDao = Application::getContextDAO();
110  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
111  $seriesDao = DAORegistry::getDAO('SeriesDAO'); /* @var $seriesDao SeriesDAO */
112  $publicationFormatDao = DAORegistry::getDAO('PublicationFormatDAO'); /* @var $publicationFormatDao PublicationFormatDAO */
113  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
114  import('lib.pkp.classes.submission.SubmissionFile'); // constants.
115  $genreDao = DAORegistry::getDAO('GenreDAO'); /* @var $genreDao GenreDAO */
116  $publicationDateDao = DAORegistry::getDAO('PublicationDateDAO'); /* @var $publicationDateDao PublicationDateDAO */
117 
118  foreach ($data as $csvLine) {
119  // Format is:
120  // Press Path, Author string, title, series path, year, is_edited_volume, locale, URL to PDF, doi (optional)
121  list($pressPath, $authorString, $title, $seriesPath, $year, $isEditedVolume, $locale, $pdfUrl, $doi) = preg_split('/\t/', $csvLine);
122 
123  $press = $pressDao->getByPath($pressPath);
124 
125  if ($press) {
126 
127  $supportedLocales = $press->getSupportedSubmissionLocales();
128  if (!is_array($supportedLocales) || count($supportedLocales) < 1) $supportedLocales = array($press->getPrimaryLocale());
129  $authorGroup = $userGroupDao->getDefaultByRoleId($press->getId(), ROLE_ID_AUTHOR);
130 
131  // we need a Genre for the files. Assume a key of MANUSCRIPT as a default.
132  $genre = $genreDao->getByKey('MANUSCRIPT', $press->getId());
133 
134  if (!$genre) {
135  echo __('plugins.importexport.csv.noGenre') . "\n";
136  exit();
137  }
138  if (!$authorGroup) {
139  echo __('plugins.importexport.csv.noAuthorGroup', array('press' => $pressPath)) . "\n";
140  continue;
141  }
142  if (in_array($locale, $supportedLocales)) {
143  $submission = $submissionDao->newDataObject();
144  $submission->setContextId($press->getId());
145  $submission->setUserId($user->getId());
146  $submission->stampLastActivity();
147  $submission->setStatus(STATUS_PUBLISHED);
148  $submission->setWorkType($isEditedVolume == 1?WORK_TYPE_EDITED_VOLUME:WORK_TYPE_AUTHORED_WORK);
149  $submission->setCopyrightNotice($press->getLocalizedSetting('copyrightNotice'), $locale);
150  $submission->setLocale($locale);
151 
152  $series = $seriesDao->getByPath($seriesPath, $press->getId());
153  if ($series) {
154  $submission->setSeriesId($series->getId());
155  } else {
156  echo __('plugins.importexport.csv.noSeries', array('seriesPath' => $seriesPath)) . "\n";
157  }
158 
159  $submissionId = $submissionDao->insertObject($submission);
160 
161  $contactEmail = $press->getContactEmail();
162  $authorString = trim($authorString, '"'); // remove double quotes if present.
163  $authors = preg_split('/,\s*/', $authorString);
164  $firstAuthor = true;
165  foreach ($authors as $authorString) {
166  // Examine the author string. Best case is: Given1 Family1 <email@address.com>, Given2 Family2 <email@address.com>, etc
167  // But default to press email address based on press path if not present.
168  $givenName = $familyName = $emailAddress = null;
169  $authorString = trim($authorString); // whitespace.
170  if (preg_match('/^(\w+)(\s+\w+)?\s*(<([^>]+)>)?$/', $authorString, $matches)) {
171  $givenName = $matches[1]; // Mandatory
172  if (count($matches) > 2) {
173  $familyName = $matches[2];
174  }
175  if (count($matches) == 5) {
176  $emailAddress = $matches[4];
177  } else {
178  $emailAddress = $contactEmail;
179  }
180  }
181  $author = $authorDao->newDataObject();
182  $author->setSubmissionId($submissionId);
183  $author->setUserGroupId($authorGroup->getId());
184  $author->setGivenName($givenName, $locale);
185  $author->setFamilyName($familyName, $locale);
186  $author->setEmail($emailAddress);
187  if ($firstAuthor) {
188  $author->setPrimaryContact(1);
189  $firstAuthor = false;
190  }
191  $authorDao->insertObject($author);
192  } // Authors done.
193 
194  $submission->setTitle($title, $locale);
195  $submissionDao->updateObject($submission);
196 
197  // Submission is done. Create a publication format for it.
198  $publicationFormat = $publicationFormatDao->newDataObject();
199  $publicationFormat->setPhysicalFormat(false);
200  $publicationFormat->setIsApproved(true);
201  $publicationFormat->setIsAvailable(true);
202  $publicationFormat->setSubmissionId($submissionId);
203  $publicationFormat->setProductAvailabilityCode('20'); // ONIX code for Available.
204  $publicationFormat->setEntryKey('DA'); // ONIX code for Digital
205  $publicationFormat->setData('name', 'PDF', $submission->getLocale());
206  $publicationFormat->setSequence(REALLY_BIG_NUMBER);
207  $publicationFormatId = $publicationFormatDao->insertObject($publicationFormat);
208 
209  if ($doi) {
210  $publicationFormat->setStoredPubId('doi', $doi);
211  }
212 
213  $publicationFormatDao->updateObject($publicationFormat);
214 
215  // Create a publication format date for this publication format.
216  $publicationDate = $publicationDateDao->newDataObject();
217  $publicationDate->setDateFormat('05'); // List55, YYYY
218  $publicationDate->setRole('01'); // List163, Publication Date
219  $publicationDate->setDate($year);
220  $publicationDate->setPublicationFormatId($publicationFormatId);
221  $publicationDateDao->insertObject($publicationDate);
222 
223  // Submission File.
224  import('lib.pkp.classes.file.TemporaryFileManager');
225  import('lib.pkp.classes.file.FileManager');
226 
227  $temporaryFileManager = new TemporaryFileManager();
228  $temporaryFilename = tempnam($temporaryFileManager->getBasePath(), 'remote');
229  $temporaryFileManager->copyFile($pdfUrl, $temporaryFilename);
230  $submissionFile = $submissionFileDao->newDataObjectByGenreId($genre->getId());
231  $submissionFile->setSubmissionId($submissionId);
232  $submissionFile->setSubmissionLocale($submission->getLocale());
233  $submissionFile->setGenreId($genre->getId());
234  $submissionFile->setFileStage(SUBMISSION_FILE_PROOF);
235  $submissionFile->setDateUploaded(Core::getCurrentDate());
236  $submissionFile->setDateModified(Core::getCurrentDate());
237  $submissionFile->setAssocType(ASSOC_TYPE_REPRESENTATION);
238  $submissionFile->setAssocId($publicationFormatId);
239  $submissionFile->setFileType('application/pdf');
240 
241  // Assume open access, no price.
242  $submissionFile->setDirectSalesPrice(0);
243  $submissionFile->setSalesType('openAccess');
244 
245  $submissionFileDao->insertObject($submissionFile, $temporaryFilename);
246  $fileManager = new FileManager();
247  $fileManager->deleteByPath($temporaryFilename);
248 
249  echo __('plugins.importexport.csv.import.submission', array('title' => $title)) . "\n";
250  } else {
251  echo __('plugins.importexport.csv.unknownLocale', array('locale' => $locale)) . "\n";
252  }
253  } else {
254  echo __('plugins.importexport.csv.unknownPress', array('pressPath' => $pressPath)) . "\n";
255  }
256  }
257  }
258  }
259 
263  function usage($scriptName) {
264  echo __('plugins.importexport.csv.cliUsage', array(
265  'scriptName' => $scriptName,
266  'pluginName' => $this->getName()
267  )) . "\n";
268  }
269 }
270 
271 
CSVImportExportPlugin\getDisplayName
getDisplayName()
Definition: CSVImportExportPlugin.inc.php:44
CSVImportExportPlugin\executeCLI
executeCLI($scriptName, &$args)
Definition: CSVImportExportPlugin.inc.php:79
Application\getContextDAO
static getContextDAO()
Definition: Application.inc.php:145
TemporaryFileManager
Definition: TemporaryFileManager.inc.php:19
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
CSVImportExportPlugin
CSV import/export plugin.
Definition: CSVImportExportPlugin.inc.php:18
CSVImportExportPlugin\usage
usage($scriptName)
Definition: CSVImportExportPlugin.inc.php:263
CSVImportExportPlugin\getName
getName()
Definition: CSVImportExportPlugin.inc.php:40
CSVImportExportPlugin\getActions
getActions($request, $actionArgs)
Definition: CSVImportExportPlugin.inc.php:55
ImportExportPlugin
Abstract class for import/export plugins.
Definition: ImportExportPlugin.inc.php:18
CSVImportExportPlugin\display
display($args, $request)
Definition: CSVImportExportPlugin.inc.php:64
CSVImportExportPlugin\__construct
__construct()
Definition: CSVImportExportPlugin.inc.php:22
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
Plugin\getTemplateResource
getTemplateResource($template=null, $inCore=false)
Definition: Plugin.inc.php:349
CSVImportExportPlugin\getDescription
getDescription()
Definition: CSVImportExportPlugin.inc.php:48
Plugin\$request
$request
Definition: Plugin.inc.php:68
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
Plugin\addLocaleData
addLocaleData($locale=null)
Definition: Plugin.inc.php:454
FileManager
Class defining basic operations for file management.
Definition: FileManager.inc.php:35