Open Journal Systems  3.3.0
Upgrade.inc.php
1 <?php
2 
17 import('lib.pkp.classes.install.Installer');
18 
19 class Upgrade extends Installer {
26  function __construct($params, $installFile = 'upgrade.xml', $isPlugin = false) {
27  parent::__construct($installFile, $params, $isPlugin);
28  }
29 
30 
35  function isUpgrade() {
36  return true;
37  }
38 
39  //
40  // Upgrade actions
41  //
42 
47  function rebuildSearchIndex() {
48  $submissionSearchIndex = Application::getSubmissionSearchIndex();
49  $submissionSearchIndex->rebuildIndex();
50  return true;
51  }
52 
57  function clearCssCache() {
58  $request = Application::get()->getRequest();
59  $templateMgr = TemplateManager::getManager($request);
60  $templateMgr->clearCssCache();
61  return true;
62  }
63 
68  function setFileUploader() {
69  $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */
70  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
71  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
72  $journalIterator = $journalDao->getAll();
73  $driver = $submissionFileDao->getDriver();
74  while ($journal = $journalIterator->next()) {
75  $managerUserGroup = $userGroupDao->getDefaultByRoleId($journal->getId(), ROLE_ID_MANAGER);
76  $managerUsers = $userGroupDao->getUsersById($managerUserGroup->getId(), $journal->getId());
77  $creatorUserId = $managerUsers->next()->getId();
78  switch ($driver) {
79  case 'mysql':
80  case 'mysqli':
81  $submissionFileDao->update('UPDATE submission_files sf, submissions s SET sf.uploader_user_id = ? WHERE sf.uploader_user_id IS NULL AND sf.submission_id = s.submission_id AND s.context_id = ?', array($creatorUserId, $journal->getId()));
82  break;
83  case 'postgres':
84  case 'postgres64':
85  case 'postgres7':
86  case 'postgres8':
87  case 'postgres9':
88  $submissionFileDao->update('UPDATE submission_files SET uploader_user_id = ? FROM submissions s WHERE submission_files.uploader_user_id IS NULL AND submission_files.submission_id = s.submission_id AND s.context_id = ?', array($creatorUserId, $journal->getId()));
89  break;
90  default: fatalError('Unknown database type!');
91  }
92  unset($managerUsers, $managerUserGroup);
93  }
94  return true;
95  }
96 
101  function setFileName() {
102  $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */
103  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
104  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
105 
106  $contexts = $journalDao->getAll();
107  while ($context = $contexts->next()) {
108  $submissions = $submissionDao->getByContextId($context->getId());
109  while ($submission = $submissions->next()) {
110  $submissionFiles = $submissionFileDao->getBySubmissionId($submission->getId());
111  foreach ($submissionFiles as $submissionFile) {
112  $reviewStage = $submissionFile->getFileStage() == SUBMISSION_FILE_REVIEW_FILE ||
113  $submissionFile->getFileStage() == SUBMISSION_FILE_REVIEW_ATTACHMENT ||
114  $submissionFile->getFileStage() == SUBMISSION_FILE_REVIEW_REVISION;
115  if (!$submissionFile->getName(AppLocale::getPrimaryLocale())) {
116  if ($reviewStage) {
117  $submissionFile->setName($submissionFile->_generateName(true), AppLocale::getPrimaryLocale());
118  } else {
119  $submissionFile->setName($submissionFile->_generateName(), AppLocale::getPrimaryLocale());
120  }
121  }
122  $submissionFileDao->updateObject($submissionFile);
123  }
124  }
125  }
126  return true;
127  }
128 
133  function convertCommentsToEditor() {
134  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
135  $stageAssignmetDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmetDao StageAssignmentDAO */
136  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
137  $noteDao = DAORegistry::getDAO('NoteDAO'); /* @var $noteDao NoteDAO */
138  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
139 
140  import('lib.pkp.classes.security.Role'); // ROLE_ID_...
141 
142  $commentsResult = $submissionDao->retrieve(
143  'SELECT s.submission_id, s.context_id, s.comments_to_ed, s.date_submitted
144  FROM submissions_tmp s
145  WHERE s.comments_to_ed IS NOT NULL AND s.comments_to_ed != \'\''
146  );
147  while (!$commentsResult->EOF) {
148  $row = $commentsResult->getRowAssoc(false);
149  $comments_to_ed = PKPString::stripUnsafeHtml($row['comments_to_ed']);
150  if ($comments_to_ed != ""){
151  $userId = null;
152  $authorAssignmentsResult = $stageAssignmetDao->getBySubmissionAndRoleId($row['submission_id'], ROLE_ID_AUTHOR);
153  if ($authorAssignmentsResult->getCount() != 0) {
154  // We assume the results are ordered by stage_assignment_id i.e. first author assignemnt is first
155  $userId = $authorAssignmentsResult->next()->getUserId();
156  } else {
157  $managerUserGroup = $userGroupDao->getDefaultByRoleId($row['context_id'], ROLE_ID_MANAGER);
158  $managerUsers = $userGroupDao->getUsersById($managerUserGroup->getId(), $row['context_id']);
159  $userId = $managerUsers->next()->getId();
160  }
161  assert($userId);
162 
163  $query = $queryDao->newDataObject();
164  $query->setAssocType(ASSOC_TYPE_SUBMISSION);
165  $query->setAssocId($row['submission_id']);
166  $query->setStageId(WORKFLOW_STAGE_ID_SUBMISSION);
167  $query->setSequence(REALLY_BIG_NUMBER);
168 
169  $queryDao->insertObject($query);
170  $queryDao->resequence(ASSOC_TYPE_SUBMISSION, $row['submission_id']);
171  $queryDao->insertParticipant($query->getId(), $userId);
172 
173  $queryId = $query->getId();
174 
175  $note = $noteDao->newDataObject();
176  $note->setUserId($userId);
177  $note->setAssocType(ASSOC_TYPE_QUERY);
178  $note->setTitle('Comments for the Editor');
179  $note->setContents($comments_to_ed);
180  $note->setDateCreated(strtotime($row['date_submitted']));
181  $note->setDateModified(strtotime($row['date_submitted']));
182  $note->setAssocId($queryId);
183  $noteDao->insertObject($note);
184  }
185  $commentsResult->MoveNext();
186  }
187  $commentsResult->Close();
188 
189  // remove temporary table
190  $submissionDao->update('DROP TABLE submissions_tmp');
191 
192  return true;
193  }
194 
195 
200  function localizeIssueCoverImages() {
201  $issueDao = DAORegistry::getDAO('IssueDAO'); /* @var $issueDao IssueDAO */
202  $publicFileManager = new PublicFileManager();
203  // remove strange old cover images with array values in the DB - from 3.alpha or 3.beta?
204  $issueDao->update('DELETE FROM issue_settings WHERE setting_name = \'coverImage\' AND setting_type = \'object\'');
205 
206  // remove empty 3.0 cover images
207  $issueDao->update('DELETE FROM issue_settings WHERE setting_name = \'coverImage\' AND locale = \'\' AND setting_value = \'\'');
208  $issueDao->update('DELETE FROM issue_settings WHERE setting_name = \'coverImageAltText\' AND locale = \'\' AND setting_value = \'\'');
209 
210  // get cover image duplicates, from 2.4.x and 3.0
211  $result = $issueDao->retrieve(
212  'SELECT DISTINCT iss1.issue_id, iss1.setting_value, i.journal_id
213  FROM issue_settings iss1
214  LEFT JOIN issues i ON (i.issue_id = iss1.issue_id)
215  JOIN issue_settings iss2 ON (iss2.issue_id = iss1.issue_id AND iss2.setting_name = \'coverImage\')
216  WHERE iss1.setting_name = \'fileName\''
217  );
218  // remove the old 2.4.x cover images, for which a new cover image exists
219  while (!$result->EOF) {
220  $row = $result->GetRowAssoc(false);
221  $oldFileName = $row['setting_value'];
222  if ($publicFileManager->fileExists($publicFileManager->getContextFilesPath($row['journal_id']) . '/' . $oldFileName)) {
223  $publicFileManager->removeContextFile($row['journal_id'], $oldFileName);
224  }
225  $issueDao->update('DELETE FROM issue_settings WHERE issue_id = ? AND setting_name = \'fileName\' AND setting_value = ?', array((int) $row['issue_id'], $oldFileName));
226  $result->MoveNext();
227  }
228  $result->Close();
229 
230  // retrieve names for unlocalized issue cover images
231  $result = $issueDao->retrieve(
232  'SELECT iss.issue_id, iss.setting_value, j.journal_id, j.primary_locale
233  FROM issue_settings iss, issues i, journals j
234  WHERE iss.setting_name = \'coverImage\' AND iss.locale = \'\'
235  AND i.issue_id = iss.issue_id AND j.journal_id = i.journal_id'
236  );
237  // for all unlocalized issue cover images
238  // rename (copy + remove) the cover images files in the public folder,
239  // considereing the locale (using the journal primary locale)
240  while (!$result->EOF) {
241  $row = $result->GetRowAssoc(false);
242  $oldFileName = $row['setting_value'];
243  $newFileName = str_replace('.', '_' . $row['primary_locale'] . '.', $oldFileName);
244  if ($publicFileManager->fileExists($publicFileManager->getContextFilesPath($row['journal_id']) . '/' . $oldFileName)) {
245  $publicFileManager->copyContextFile($row['journal_id'], $publicFileManager->getContextFilesPath($row['journal_id']) . '/' . $oldFileName, $newFileName);
246  $publicFileManager->removeContextFile($row['journal_id'], $oldFileName);
247  }
248  $result->MoveNext();
249  }
250  $result->Close();
251  $driver = $issueDao->getDriver();
252  switch ($driver) {
253  case 'mysql':
254  case 'mysqli':
255  // Update cover image names in the issue_settings table
256  $issueDao->update(
257  'UPDATE issue_settings iss, issues i, journals j
258  SET iss.locale = j.primary_locale, iss.setting_value = CONCAT(LEFT( iss.setting_value, LOCATE(\'.\', iss.setting_value) - 1 ), \'_\', j.primary_locale, \'.\', SUBSTRING_INDEX(iss.setting_value,\'.\',-1))
259  WHERE iss.setting_name = \'coverImage\' AND iss.locale = \'\' AND i.issue_id = iss.issue_id AND j.journal_id = i.journal_id'
260  );
261  // Update cover image alt texts in the issue_settings table
262  $issueDao->update(
263  'UPDATE issue_settings iss, issues i, journals j SET iss.locale = j.primary_locale WHERE iss.setting_name = \'coverImageAltText\' AND iss.locale = \'\' AND i.issue_id = iss.issue_id AND j.journal_id = i.journal_id'
264  );
265  break;
266  case 'postgres':
267  case 'postgres64':
268  case 'postgres7':
269  case 'postgres8':
270  case 'postgres9':
271  // Update cover image names in the issue_settings table
272  $issueDao->update(
273  'UPDATE issue_settings
274  SET locale = j.primary_locale, setting_value = REGEXP_REPLACE(issue_settings.setting_value, \'[\.]\', CONCAT(\'_\', j.primary_locale, \'.\'))
275  FROM issues i, journals j
276  WHERE issue_settings.setting_name = \'coverImage\' AND issue_settings.locale = \'\' AND i.issue_id = issue_settings.issue_id AND j.journal_id = i.journal_id'
277  );
278  // Update cover image alt texts in the issue_settings table
279  $issueDao->update(
280  'UPDATE issue_settings
281  SET locale = j.primary_locale
282  FROM issues i, journals j
283  WHERE issue_settings.setting_name = \'coverImageAltText\' AND issue_settings.locale = \'\' AND i.issue_id = issue_settings.issue_id AND j.journal_id = i.journal_id'
284  );
285  break;
286  default: fatalError('Unknown database type!');
287  }
288  $issueDao->flushCache();
289  return true;
290  }
291 
296  function localizeArticleCoverImages() {
297  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
298  $publicFileManager = new PublicFileManager();
299  // remove strange old cover images with array values in the DB - from 3.alpha or 3.beta?
300  $submissionDao->update('DELETE FROM submission_settings WHERE setting_name = \'coverImage\' AND setting_type = \'object\'');
301 
302  // remove empty 3.0 cover images
303  $submissionDao->update('DELETE FROM submission_settings WHERE setting_name = \'coverImage\' AND locale = \'\' AND setting_value = \'\'');
304  $submissionDao->update('DELETE FROM submission_settings WHERE setting_name = \'coverImageAltText\' AND locale = \'\' AND setting_value = \'\'');
305 
306  // get cover image duplicates, from 2.4.x and 3.0
307  $result = $submissionDao->retrieve(
308  'SELECT DISTINCT ss1.submission_id, ss1.setting_value, s.context_id
309  FROM submission_settings ss1
310  LEFT JOIN submissions s ON (s.submission_id = ss1.submission_id)
311  JOIN submission_settings ss2 ON (ss2.submission_id = ss1.submission_id AND ss2.setting_name = \'coverImage\')
312  WHERE ss1.setting_name = \'fileName\''
313  );
314  // remove the old 2.4.x cover images, for which a new cover image exists
315  while (!$result->EOF) {
316  $row = $result->GetRowAssoc(false);
317  $submissionId = $row['submission_id'];
318  $oldFileName = $row['setting_value'];
319  if ($publicFileManager->fileExists($publicFileManager->getContextFilesPath($row['context_id']) . '/' . $oldFileName)) {
320  $publicFileManager->removeContextFile($row['journal_id'], $oldFileName);
321  }
322  $submissionDao->update('DELETE FROM submission_settings WHERE submission_id = ? AND setting_name = \'fileName\' AND setting_value = ?', array((int) $submissionId, $oldFileName));
323  $result->MoveNext();
324  }
325  $result->Close();
326 
327  // retrieve names for unlocalized article cover images
328  $result = $submissionDao->retrieve(
329  'SELECT ss.submission_id, ss.setting_value, j.journal_id, j.primary_locale
330  FROM submission_settings ss, submissions s, journals j
331  WHERE ss.setting_name = \'coverImage\' AND ss.locale = \'\'
332  AND s.submission_id = ss.submission_id AND j.journal_id = s.context_id'
333  );
334  // for all unlocalized article cover images
335  // rename (copy + remove) the cover images files in the public folder,
336  // considereing the locale (using the journal primary locale)
337  while (!$result->EOF) {
338  $row = $result->GetRowAssoc(false);
339  $oldFileName = $row['setting_value'];
340  $newFileName = str_replace('.', '_' . $row['primary_locale'] . '.', $oldFileName);
341  if ($publicFileManager->fileExists($publicFileManager->getContextFilesPath($row['journal_id']) . '/' . $oldFileName)) {
342  $publicFileManager->copyContextFile($row['journal_id'], $publicFileManager->getContextFilesPath($row['journal_id']) . '/' . $oldFileName, $newFileName);
343  $publicFileManager->removeContextFile($row['journal_id'], $oldFileName);
344  }
345  $result->MoveNext();
346  }
347  $result->Close();
348  $driver = $submissionDao->getDriver();
349  switch ($driver) {
350  case 'mysql':
351  case 'mysqli':
352  // Update cover image names in the submission_settings table
353  $submissionDao->update(
354  'UPDATE submission_settings ss, submissions s, journals j
355  SET ss.locale = j.primary_locale, ss.setting_value = CONCAT(LEFT( ss.setting_value, LOCATE(\'.\', ss.setting_value) - 1 ), \'_\', j.primary_locale, \'.\', SUBSTRING_INDEX(ss.setting_value,\'.\',-1))
356  WHERE ss.setting_name = \'coverImage\' AND ss.locale = \'\' AND s.submission_id = ss.submission_id AND j.journal_id = s.context_id'
357  );
358  // Update cover image alt texts in the submission_settings table
359  $submissionDao->update(
360  'UPDATE submission_settings ss, submissions s, journals j
361  SET ss.locale = j.primary_locale
362  WHERE ss.setting_name = \'coverImageAltText\' AND ss.locale = \'\' AND s.submission_id = ss.submission_id AND j.journal_id = s.context_id'
363  );
364  break;
365  case 'postgres':
366  case 'postgres64':
367  case 'postgres7':
368  case 'postgres8':
369  case 'postgres9':
370  // Update cover image names in the submission_settings table
371  $submissionDao->update(
372  'UPDATE submission_settings
373  SET locale = j.primary_locale, setting_value = REGEXP_REPLACE(submission_settings.setting_value, \'[\.]\', CONCAT(\'_\', j.primary_locale, \'.\'))
374  FROM submissions s, journals j
375  WHERE submission_settings.setting_name = \'coverImage\' AND submission_settings.locale = \'\' AND s.submission_id = submission_settings.submission_id AND j.journal_id = s.context_id'
376  );
377  // Update cover image alt texts in the submission_settings table
378  $submissionDao->update(
379  'UPDATE submission_settings
380  SET locale = j.primary_locale
381  FROM submissions s, journals j
382  WHERE submission_settings.setting_name = \'coverImageAltText\' AND submission_settings.locale = \'\' AND s.submission_id = submission_settings.submission_id AND j.journal_id = s.context_id'
383  );
384  break;
385  default: fatalError('Unknown database type!');
386  }
387  $submissionDao->flushCache();
388  return true;
389  }
390 
397  function fixAuthorGroup() {
398  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
399  $result = $userGroupDao->retrieve(
400  'SELECT a.author_id, s.context_id FROM authors a JOIN submissions s ON (a.submission_id = s.submission_id) JOIN user_groups g ON (a.user_group_id = g.user_group_id) WHERE g.context_id <> s.context_id'
401  );
402  while (!$result->EOF) {
403  $row = $result->GetRowAssoc(false);
404  $authorGroup = $userGroupDao->getDefaultByRoleId($row['context_id'], ROLE_ID_AUTHOR);
405  if ($authorGroup) $userGroupDao->update('UPDATE authors SET user_group_id = ? WHERE author_id = ?', array((int) $authorGroup->getId(), $row['author_id']));
406  $result->MoveNext();
407  }
408  $result->Close();
409  return true;
410  }
411 
417  function moveReviewerFiles() {
418  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
419 
420  import('lib.pkp.classes.file.SubmissionFileManager');
421 
422  // get reviewer file ids
423  $result = $submissionFileDao->retrieve(
424  'SELECT ra.review_id, ra.submission_id, ra.review_round_id, ra.review_id, ra.reviewer_file_id, s.context_id
425  FROM review_assignments ra, submissions s
426  WHERE ra.reviewer_file_id IS NOT NULL AND s.submission_id = ra.submission_id'
427  );
428  while (!$result->EOF) {
429  $row = $result->GetRowAssoc(false);
430 
431  $submissionFileManager = new SubmissionFileManager($row['context_id'], $row['submission_id']);
432  $revisions = $submissionFileDao->getAllRevisions($row['reviewer_file_id']);
433  if (!empty($revisions)) {
434  foreach ($revisions as $revision) {
435  $wrongFilePath = $revision->getFilePath();
436  $revision->setFileStage(SUBMISSION_FILE_REVIEW_ATTACHMENT);
437  $newFilePath = $revision->getFilePath();
438  if (!file_exists($newFilePath)) {
439  if (!file_exists($path = dirname($newFilePath)) && !$submissionFileManager->mkdirtree($path)) {
440  error_log("ERROR: Unable to make directory \"$path\"");
441  }
442  if (!rename($wrongFilePath, $newFilePath)) {
443  error_log("ERROR: Unable to move \"$wrongFilePath\" to \"$newFilePath\".");
444  }
445  }
446  }
447  } else {
448  error_log('ERROR: Reviewer files with ID ' . $row['reviewer_file_id'] . ' from review assignment ' .$row['review_id'] . ' could not be found in the database table submission_files');
449  }
450 
451  $result->MoveNext();
452  }
453  $result->Close();
454  return true;
455  }
456 
461  function removeCancelledReviewAssignments() {
462  $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); /* @var $reviewAssignmentDao ReviewAssignmentDAO */
463  // get cancelled review assignemnts
464  $result = $reviewAssignmentDao->retrieve('SELECT review_id FROM review_assignments_tmp');
465  while (!$result->EOF) {
466  $row = $result->GetRowAssoc(false);
467  $reviewAssignmentDao->deleteById($row['review_id']);
468  $result->MoveNext();
469  }
470  $result->Close();
471  // remove temporary table
472  $reviewAssignmentDao->update('DROP TABLE review_assignments_tmp');
473  // update log messages
474  $eventLogDao = DAORegistry::getDAO('SubmissionEventLogDAO'); /* @var $eventLogDao SubmissionEventLogDAO */
475  $eventLogDao->update('UPDATE event_log SET message = \'log.review.reviewCleared\' WHERE message = \'log.review.reviewCancelled\'');
476  return true;
477  }
478 
483  function repairImageAssociations() {
484  $genreDao = DAORegistry::getDAO('GenreDAO'); /* @var $genreDao GenreDAO */
485  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
486  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
487  $result = $submissionFileDao->retrieve('SELECT df.file_id AS dependent_file_id, gf.file_id AS galley_file_id FROM submission_files df, submission_files gf, submission_html_galley_images i, submission_galleys g WHERE i.galley_id = g.galley_id AND g.file_id = gf.file_id AND i.file_id = df.file_id');
488  while (!$result->EOF) {
489  $row = $result->GetRowAssoc(false);
490  $submissionFiles = $submissionFileDao->getAllRevisions($row['dependent_file_id']);
491  foreach ((array) $submissionFiles as $submissionFile) {
492  if ($submissionFile->getFileStage() != 1) continue; // SUBMISSION_FILE_PUBLIC
493 
494  $submission = $submissionDao->getById($submissionFile->getSubmissionId());
495  $imageGenre = $genreDao->getByKey('IMAGE', $submission->getContextId());
496 
497  $submissionFile->setFileStage(SUBMISSION_FILE_DEPENDENT);
498  $submissionFile->setAssocType(ASSOC_TYPE_SUBMISSION_FILE);
499  $submissionFile->setAssocId($row['galley_file_id']);
500  $submissionFile->setGenreId($imageGenre->getId());
501  $submissionFileDao->updateObject($submissionFile);
502  }
503  $result->MoveNext();
504  }
505  $submissionDao->update('DROP TABLE submission_html_galley_images');
506  return true;
507  }
508 
513  function repairKeywordsAndSubjects() {
514  $request = Application::get()->getRequest();
515  $site = $request->getSite();
516  $installedLocales = $site->getInstalledLocales();
517  $submissionSubjectDao = DAORegistry::getDAO('SubmissionSubjectDAO'); /* @var $submissionSubjectDao SubmissionSubjectDAO */
518  $submissionKeywordDao = DAORegistry::getDAO('SubmissionKeywordDAO'); /* @var $submissionKeywordDao SubmissionKeywordDAO */
519  $submissionSubjectEntryDao = DAORegistry::getDAO('SubmissionSubjectEntryDAO'); /* @var $submissionSubjectEntryDao SubmissionSubjectEntryDAO */
520 
521  // insert and correct old keywords migration:
522  // get old keywords
523  $subjectsToKeep = array();
524  $oldKeywordsFound = false;
525  $result = $submissionKeywordDao->retrieve('SELECT * FROM submission_settings WHERE setting_name = \'subject\' AND setting_value <> \'\'');
526  if ($result->RecordCount() > 0) $oldKeywordsFound = true;
527  while (!$result->EOF) {
528  $row = $result->GetRowAssoc(false);
529  $submissionId = $row['submission_id'];
530  $locale = $row['locale'];
531  $oldKeywordsArray = preg_split('/[,;:]/', $row['setting_value']);
532  $oldKeywords = array_map('trim', $oldKeywordsArray);
533  // get current keywords
534  $newKeywords = array();
535  $newKeywordsArray = $submissionKeywordDao->getKeywords($submissionId, [$locale], ASSOC_TYPE_SUBMISSION);
536  if (array_key_exists($locale, $newKeywordsArray)) {
537  $newKeywords = array_map('trim', $newKeywordsArray[$locale]);
538  }
539  // get the difference and insert them
540  $keywordsToAdd = array_diff($oldKeywords, $newKeywords);
541  if (!empty($keywordsToAdd)) {
542  $submissionKeywordDao->insertKeywords(array($locale => $keywordsToAdd), $submissionId, false, ASSOC_TYPE_SUBMISSION);
543  }
544 
545  // correct the old keywords migration:
546  // because the old keywords were already migrated as subjects earlier:
547  // get current subjects for all possible locales, in order to also
548  // consider locales other than old keywords locales (for example if added after the migration),
549  // in order not to remove those when inserting below
550  if (!array_key_exists($submissionId, $subjectsToKeep)) {
551  $newSubjectsArray = $submissionSubjectDao->getSubjects($submissionId, $installedLocales, ASSOC_TYPE_SUBMISSION);
552  $subjectsToKeep[$submissionId] = $newSubjectsArray;
553  }
554  // if subjects for the current locale exist
555  if (array_key_exists($locale, $subjectsToKeep[$submissionId])) {
556  // get current subjects for the current locale
557  $newSubjects = array_map('trim', $subjectsToKeep[$submissionId][$locale]);
558  // get the difference to keep only them
559  $subjectsToKeep[$submissionId][$locale] = array_diff($newSubjects, $oldKeywords);
560  }
561  $result->MoveNext();
562  }
563  $result->Close();
564  unset($newSubjects);
565  unset($newSubjectsArray);
566 
567  // if old keywords were found, it means that this this function is executed for the first time
568  // i.e. the subjects should be corrected
569  if ($oldKeywordsFound) {
570  // insert the subjects that should be kept, overriding the existing ones
571  // also if they are empty, because then they should be deleted
572  foreach ($subjectsToKeep as $submissionId => $submissionSubjects) {
573  $submissionSubjectDao->insertSubjects($submissionSubjects, $submissionId, true, ASSOC_TYPE_SUBMISSION);
574  }
575  }
576 
577  // insert old subjects
578  $result = $submissionKeywordDao->retrieve('SELECT * FROM submission_settings WHERE setting_name = \'subjectClass\' AND setting_value <> \'\'');
579  while (!$result->EOF) {
580  $row = $result->GetRowAssoc(false);
581  $submissionId = $row['submission_id'];
582  $locale = $row['locale'];
583  $oldSubjectsArray = preg_split('/[,;:]/', $row['setting_value']);
584  $oldSubjects = array_map('trim', $oldSubjectsArray);
585  // get current subjects
586  $newSubjects = array();
587  $newSubjectsArray = $submissionSubjectDao->getSubjects($submissionId, array($locale), ASSOC_TYPE_SUBMISSION);
588  if (array_key_exists($locale, $newSubjectsArray)) {
589  $newSubjects = array_map('trim', $newSubjectsArray[$locale]);
590  }
591  // get the difference and insert them
592  $subjectsToAdd = array_diff($oldSubjects, $newSubjects);
593  if (!empty($subjectsToAdd)) {
594  $submissionSubjectDao->insertSubjects(array($locale => $subjectsToAdd), $submissionId, false, ASSOC_TYPE_SUBMISSION);
595  }
596  $result->MoveNext();
597  }
598  $result->Close();
599 
600  // delete old settings
601  $submissionKeywordDao->update('DELETE FROM submission_settings WHERE setting_name = \'discipline\' OR setting_name = \'subject\' OR setting_name = \'subjectClass\' OR setting_name = \'sponsor\'');
602 
603  return true;
604  }
605 
610  function enabledSitePlugins() {
611  $allPlugins =& PluginRegistry::getAllPlugins();
612  $pluginSettings = DAORegistry::getDAO('PluginSettingsDAO');
613  foreach ($allPlugins as $plugin) {
614  if ($plugin->isSitePlugin()) {
615  $pluginName = strtolower_codesafe($plugin->getName());
616  if ($pluginName != 'customblockmanagerplugin') {
617  $result = $pluginSettings->update('DELETE FROM plugin_settings WHERE plugin_name = ? AND setting_name = \'enabled\' AND context_id <> 0', array($pluginName));
618  }
619  }
620  }
621 
622  return true;
623  }
624 
632  function fixGenreIdInFileNames() {
633  $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */
634  $genreDao = DAORegistry::getDAO('GenreDAO'); /* @var $genreDao GenreDAO */
635  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
636  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
637 
638  import('lib.pkp.classes.file.SubmissionFileManager');
639 
640  $contexts = $journalDao->getAll();
641  while ($context = $contexts->next()) {
642  $styleGenre = $genreDao->getByKey('STYLE', $context->getId());
643  $submissions = $submissionDao->getByContextId($context->getId());
644  while ($submission = $submissions->next()) {
645  $submissionFileManager = new SubmissionFileManager($context->getId(), $submission->getId());
646  $basePath = $submissionFileManager->getBasePath();
647  $submissionFiles = $submissionFileDao->getBySubmissionId($submission->getId());
648  foreach ($submissionFiles as $submissionFile) {
649  // Ignore files with style genre -- if they exist, they are corrected manually i.e.
650  // the moveCSSFiles function will do this, s. https://github.com/pkp/pkp-lib/issues/2758
651  if ($submissionFile->getGenreId() != $styleGenre->getId()) {
652  $generatedNewFilename = $submissionFile->getServerFileName();
653  $targetFilename = $basePath . $submissionFile->_fileStageToPath($submissionFile->getFileStage()) . '/' . $generatedNewFilename;
654  $timestamp = date('Ymd', strtotime($submissionFile->getDateUploaded()));
655  $wrongFileName = $submission->getId() . '-' . '1' . '-' . $submissionFile->getFileId() . '-' . $submissionFile->getRevision() . '-' . $submissionFile->getFileStage() . '-' . $timestamp . '.' . strtolower_codesafe($submissionFile->getExtension());
656  $sourceFilename = $basePath . $submissionFile->_fileStageToPath($submissionFile->getFileStage()) . '/' . $wrongFileName;
657  if (file_exists($targetFilename)) continue; // Skip existing files/links
658  if (!file_exists($path = dirname($targetFilename)) && !$submissionFileManager->mkdirtree($path)) {
659  error_log("Unable to make directory \"$path\"");
660  }
661  if (!rename($sourceFilename, $targetFilename)) {
662  error_log("Unable to move \"$sourceFilename\" to \"$targetFilename\".");
663  }
664  }
665  }
666  }
667  }
668  return true;
669  }
670 
678  function moveCSSFiles() {
679  $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */
680  $genreDao = DAORegistry::getDAO('GenreDAO'); /* @var $genreDao GenreDAO */
681  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
682 
683  import('lib.pkp.classes.file.FileManager');
684  import('lib.pkp.classes.file.SubmissionFileManager');
685  import('lib.pkp.classes.submission.SubmissionFile');
686 
687  $journals = $journalDao->getAll();
688  while ($journal = $journals->next()) {
689  // Get style genre
690  $genre = $genreDao->getByKey('STYLE', $journal->getId());
691 
692  // get CSS file names from the corrected submission_files table
693  $result = $submissionFileDao->retrieve('SELECT file_id, revision, original_file_name, date_uploaded, submission_id FROM submission_files WHERE file_stage = ? AND genre_id = ? AND assoc_type = ?',
694  array((int) SUBMISSION_FILE_DEPENDENT, (int) $genre->getId(), (int) ASSOC_TYPE_SUBMISSION_FILE));
695  while (!$result->EOF) {
696  $row = $result->GetRowAssoc(false);
697  // Get the wrong file name (after the 3.0.x migration)
698  // and the correct file name
699  $timestamp = date('Ymd', strtotime($row['date_uploaded']));
700  $fileManager = new FileManager();
701  $extension = $fileManager->parseFileExtension($row['original_file_name']);
702  $wrongServerName = $row['submission_id'] . '-' . '1' . '-' . $row['file_id'] . '-' . $row['revision'] . '-' . '1' . '-' . $timestamp . '.' . strtolower_codesafe($extension);
703  $newServerName = $row['submission_id'] . '-' . $genre->getId() . '-' . $row['file_id'] . '-' . $row['revision'] . '-' . SUBMISSION_FILE_DEPENDENT . '-' . $timestamp . '.' . strtolower_codesafe($extension);
704  // Get the old file path (after the 3.0.x migration, i.e. from OJS 2.4.x)
705  // and the correct file path
706  $submissionFileManager = new SubmissionFileManager($journal->getId(), $row['submission_id']);
707  $basePath = $submissionFileManager->getBasePath();
708  $sourceFilename = $basePath . 'public' . '/' . $wrongServerName;
709  $targetFilename = $basePath . 'submission/proof' . '/' . $newServerName;
710  // Move the file
711  if (!file_exists($targetFilename) && file_exists($sourceFilename)) {
712  if (!file_exists($path = dirname($targetFilename)) && !$submissionFileManager->mkdirtree($path)) {
713  error_log("Unable to make directory \"$path\"");
714  }
715  if (!rename($sourceFilename, $targetFilename)) {
716  error_log("Unable to move \"$sourceFilename\" to \"$targetFilename\".");
717  }
718  }
719  $result->MoveNext();
720  }
721  $result->Close();
722  unset($journal);
723  }
724  return true;
725  }
726 
731  function repairSuppFilesFilestage() {
732  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
733 
734  import('lib.pkp.classes.submission.SubmissionFile');
735  import('lib.pkp.classes.file.SubmissionFileManager');
736 
737  // get reviewer file ids
738  $result = $submissionFileDao->retrieve(
739  'SELECT ssf.*, s.context_id
740  FROM submission_supplementary_files ssf, submission_files sf, submissions s
741  WHERE sf.file_id = ssf.file_id AND sf.file_stage = ? AND sf.assoc_type = ? AND sf.revision = ssf.revision AND s.submission_id = sf.submission_id',
742  array((int)SUBMISSION_FILE_SUBMISSION, (int)ASSOC_TYPE_REPRESENTATION)
743  );
744  while (!$result->EOF) {
745  $row = $result->GetRowAssoc(false);
746  $submissionFileRevision = $submissionFileDao->getRevision($row['file_id'], $row['revision']);
747  $submissionFileManager = new SubmissionFileManager($row['context_id'], $submissionFileRevision->getSubmissionId());
748  $basePath = $submissionFileManager->getBasePath();
749  $generatedOldFilename = $submissionFileRevision->getServerFileName();
750  $oldFileName = $basePath . $submissionFileRevision->_fileStageToPath($submissionFileRevision->getFileStage()) . '/' . $generatedOldFilename;
751  $submissionFileRevision->setFileStage(SUBMISSION_FILE_PROOF);
752  $generatedNewFilename = $submissionFileRevision->getServerFileName();
753  $newFileName = $basePath . $submissionFileRevision->_fileStageToPath($submissionFileRevision->getFileStage()) . '/' . $generatedNewFilename;
754  if (!file_exists($newFileName)) {
755  if (!file_exists($path = dirname($newFileName)) && !$submissionFileManager->mkdirtree($path)) {
756  error_log("Unable to make directory \"$path\"");
757  }
758  if (!rename($oldFileName, $newFileName)) {
759  error_log("Unable to move \"$oldFileName\" to \"$newFileName\".");
760  } else {
761  $submissionFileDao->updateObject($submissionFileRevision);
762  }
763  }
764  $result->MoveNext();
765  }
766  $result->Close();
767  return true;
768  }
769 
774  function migrateStaticPagesToNavigationMenuItems() {
775  if ($this->tableExists('static_pages')) {
776  $contextDao = Application::getContextDAO();
777  $navigationMenuItemDao = DAORegistry::getDAO('NavigationMenuItemDAO'); /* @var $navigationMenuItemDao NavigationMenuItemDAO */
778 
779  import('plugins.generic.staticPages.classes.StaticPagesDAO');
780 
781  $staticPagesDao = new StaticPagesDAO();
782 
783  $contexts = $contextDao->getAll();
784  while ($context = $contexts->next()) {
785  $contextStaticPages = $staticPagesDao->getByContextId($context->getId())->toAssociativeArray();
786  foreach($contextStaticPages as $staticPage) {
787  $retNMIId = $navigationMenuItemDao->portStaticPage($staticPage);
788  if ($retNMIId) {
789  $staticPagesDao->deleteById($staticPage->getId());
790  } else {
791  error_log('WARNING: The StaticPage "' . $staticPage->getLocalizedTitle() . '" uses a path (' . $staticPage->getPath() . ') that conflicts with an existing Custom Navigation Menu Item path. Skipping this StaticPage.');
792  }
793  }
794  }
795  }
796 
797  return true;
798  }
799 
804  function migrateSRLocale() {
805  $oldLocale = 'sr_SR';
806  $newLocale = 'sr_RS@latin';
807 
808  $oldLocaleStringLength = 's:5';
809 
810  $journalSettingsDao = DAORegistry::getDAO('JournalSettingsDAO'); /* @var $journalSettingsDao JournalSettingsDAO */
811 
812  // Check if the sr_SR is used, and if not do not run further
813  $srExistResult = $journalSettingsDao->retrieve('SELECT COUNT(*) FROM site WHERE installed_locales LIKE ?', array('%'.$oldLocale.'%'));
814  $srExist = $srExistResult->fields[0] ? true : false;
815  $srExistResult->Close();
816  if (!$srExist) return true;
817 
818  // Consider all DB tables that have locale column:
819  $dbTables = array(
820  'announcement_settings', 'announcement_type_settings', 'author_settings', 'books_for_review_settings', 'citation_settings', 'controlled_vocab_entry_settings',
821  'data_object_tombstone_settings', 'email_templates_data', 'email_templates_default_data', 'external_feed_settings', 'filter_settings', 'genre_settings', 'group_settings',
822  'issue_galleys', 'issue_galley_settings', 'issue_settings', 'journal_settings', 'library_file_settings', 'metadata_description_settings',
823  'navigation_menu_item_assignment_settings', 'navigation_menu_item_settings', 'notification_settings', 'referral_settings',
824  'review_form_element_settings', 'review_form_settings', 'review_object_metadata_settings', 'review_object_type_settings', 'section_settings', 'site_settings',
825  'static_page_settings', 'submissions', 'submission_file_settings', 'submission_galleys', 'submission_galley_settings', 'submission_settings', 'subscription_type_settings',
826  'user_group_settings', 'user_settings',
827  );
828  foreach ($dbTables as $dbTable) {
829  if ($this->tableExists($dbTable)) {
830  $journalSettingsDao->update('UPDATE '.$dbTable.' SET locale = ? WHERE locale = ?', array($newLocale, $oldLocale));
831  }
832  }
833  // Consider other locale columns
834  $journalSettingsDao->update('UPDATE journals SET primary_locale = ? WHERE primary_locale = ?', array($newLocale, $oldLocale));
835  $journalSettingsDao->update('UPDATE site SET primary_locale = ? WHERE primary_locale = ?', array($newLocale, $oldLocale));
836  $journalSettingsDao->update('UPDATE site SET installed_locales = REPLACE(installed_locales, ?, ?)', array($oldLocale, $newLocale));
837  $journalSettingsDao->update('UPDATE site SET supported_locales = REPLACE(supported_locales, ?, ?)', array($oldLocale, $newLocale));
838  $journalSettingsDao->update('UPDATE users SET locales = REPLACE(locales, ?, ?)', array($oldLocale, $newLocale));
839 
840  // journal_settings
841  // Consider array setting values from the setting names:
842  // supportedFormLocales, supportedLocales, supportedSubmissionLocales
843  $settingNames = "('supportedFormLocales', 'supportedLocales', 'supportedSubmissionLocales')";
844  // As a precaution use $oldLocaleStringLength, to exclude that the text contain the old locale string
845  $settingValueResult = $journalSettingsDao->retrieve('SELECT * FROM journal_settings WHERE setting_name IN ' .$settingNames .' AND setting_value LIKE ? AND setting_type = \'object\'', array('%' .$oldLocaleStringLength .':"' .$oldLocale .'%'));
846  while (!$settingValueResult->EOF) {
847  $row = $settingValueResult->getRowAssoc(false);
848  $arraySettingValue = $journalSettingsDao->getSetting($row['journal_id'], $row['setting_name']);
849  for($i = 0; $i < count($arraySettingValue); $i++) {
850  if ($arraySettingValue[$i] == $oldLocale) {
851  $arraySettingValue[$i] = $newLocale;
852  }
853  }
854  $journalSettingsDao->updateSetting($row['journal_id'], $row['setting_name'], $arraySettingValue);
855  $settingValueResult->MoveNext();
856  }
857  $settingValueResult->Close();
858 
859  // Consider journal images
860  // Note that the locale column values are already changed above
861  $publicFileManager = new PublicFileManager();
862  $settingNames = "('homeHeaderLogoImage', 'homeHeaderTitleImage', 'homepageImage', 'journalFavicon', 'journalThumbnail', 'pageHeaderLogoImage', 'pageHeaderTitleImage')";
863  $settingValueResult = $journalSettingsDao->retrieve('SELECT * FROM journal_settings WHERE setting_name IN ' .$settingNames .' AND locale = ? AND setting_value LIKE ? AND setting_type = \'object\'', array($newLocale, '%' .$oldLocale .'%'));
864  while (!$settingValueResult->EOF) {
865  $row = $settingValueResult->getRowAssoc(false);
866  $arraySettingValue = $journalSettingsDao->getSetting($row['journal_id'], $row['setting_name'], $newLocale);
867  $oldUploadName = $arraySettingValue['uploadName'];
868  $newUploadName = str_replace('_'.$oldLocale.'.', '_'.$newLocale.'.', $oldUploadName);
869  if ($publicFileManager->fileExists($publicFileManager->getContextFilesPath($row['journal_id']) . '/' . $oldUploadName)) {
870  $publicFileManager->copyContextFile($row['journal_id'], $publicFileManager->getContextFilesPath($row['journal_id']) . '/' . $oldUploadName, $newUploadName);
871  $publicFileManager->removeContextFile($row['journal_id'], $oldUploadName);
872  }
873  $arraySettingValue['uploadName'] = $newUploadName;
874  $newArraySettingValue[$newLocale] = $arraySettingValue;
875  $journalSettingsDao->updateSetting($row['journal_id'], $row['setting_name'], $newArraySettingValue, 'object', true);
876  $settingValueResult->MoveNext();
877  }
878  $settingValueResult->Close();
879 
880  // Consider issue cover images
881  // Note that the locale column values are already changed above
882  $settingValueResult = $journalSettingsDao->retrieve('SELECT a.*, b.journal_id FROM issue_settings a, issues b WHERE a.setting_name = \'fileName\' AND a.locale = ? AND a.setting_value LIKE ? AND a.setting_type = \'string\' AND b.issue_id = a.issue_id', array($newLocale, '%' .$oldLocale .'%'));
883  while (!$settingValueResult->EOF) {
884  $row = $settingValueResult->getRowAssoc(false);
885  $oldCoverImage = $row['setting_value'];
886  $newCoverImage = str_replace('_'.$oldLocale.'.', '_'.$newLocale.'.', $oldCoverImage);
887  if ($publicFileManager->fileExists($publicFileManager->getContextFilesPath($row['journal_id']) . '/' . $oldCoverImage)) {
888  $publicFileManager->copyContextFile($row['journal_id'], $publicFileManager->getContextFilesPath($row['journal_id']) . '/' . $oldCoverImage, $newCoverImage);
889  $publicFileManager->removeContextFile($row['journal_id'], $oldCoverImage);
890  }
891  $journalSettingsDao->update('UPDATE issue_settings SET setting_value = ? WHERE issue_id = ? AND setting_name = \'fileName\' AND locale = ?', array($newCoverImage, (int) $row['issue_id'], $newLocale));
892  $settingValueResult->MoveNext();
893  }
894  $settingValueResult->Close();
895 
896  // Consider article cover images
897  // Note that the locale column values are already changed above
898  $settingValueResult = $journalSettingsDao->retrieve('SELECT a.*, b.context_id FROM submission_settings a, submissions b WHERE a.setting_name = \'fileName\' AND a.locale = ? AND a.setting_value LIKE ? AND b.submission_id = a.submission_id', array($newLocale, '%' .$oldLocale .'%'));
899  while (!$settingValueResult->EOF) {
900  $row = $settingValueResult->getRowAssoc(false);
901  $oldCoverImage = $row['setting_value'];
902  $newCoverImage = str_replace('_'.$oldLocale.'.', '_'.$newLocale.'.', $oldCoverImage);
903  if ($publicFileManager->fileExists($publicFileManager->getContextFilesPath($row['context_id']) . '/' . $oldCoverImage)) {
904  $publicFileManager->copyContextFile($row['context_id'], $publicFileManager->getContextFilesPath($row['context_id']) . '/' . $oldCoverImage, $newCoverImage);
905  $publicFileManager->removeContextFile($row['context_id'], $oldCoverImage);
906  }
907  $journalSettingsDao->update('UPDATE submission_settings SET setting_value = ? WHERE submission_id = ? AND setting_name = \'fileName\' AND locale = ?', array($newCoverImage, (int) $row['submission_id'], $newLocale));
908  $settingValueResult->MoveNext();
909  }
910  $settingValueResult->Close();
911 
912  // plugin_settings
913  // Consider array setting values from the setting names:
914  // blockContent (from a custom block plugin), additionalInformation (from objects for review plugin)
915  $pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO'); /* @var $pluginSettingsDao PluginSettingsDAO */
916  $settingNames = "('blockContent', 'additionalInformation')";
917  $settingValueResult = $pluginSettingsDao->retrieve('SELECT * FROM plugin_settings WHERE setting_name IN ' .$settingNames .' AND setting_value LIKE ?', array('%' .$oldLocaleStringLength .':"' .$oldLocale .'%'));
918  while (!$settingValueResult->EOF) {
919  $row = $settingValueResult->getRowAssoc(false);
920  $arraySettingValue = $pluginSettingsDao->getSetting($row['context_id'], $row['plugin_name'], $row['setting_name']);
921  $arraySettingValue[$newLocale] = $arraySettingValue[$oldLocale];
922  unset($arraySettingValue[$oldLocale]);
923  $pluginSettingsDao->updateSetting($row['context_id'], $row['plugin_name'], $row['setting_name'], $arraySettingValue);
924  $settingValueResult->MoveNext();
925  }
926  $settingValueResult->Close();
927 
928  return true;
929  }
930 
935  function migrateUserAndAuthorNames() {
936  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
937  import('lib.pkp.classes.identity.Identity'); // IDENTITY_SETTING_...
938  // the user names will be saved in the site's primary locale
939  $userDao->update("INSERT INTO user_settings (user_id, locale, setting_name, setting_value, setting_type) SELECT DISTINCT u.user_id, s.primary_locale, ?, u.first_name, 'string' FROM users_tmp u, site s", array(IDENTITY_SETTING_GIVENNAME));
940  $userDao->update("INSERT INTO user_settings (user_id, locale, setting_name, setting_value, setting_type) SELECT DISTINCT u.user_id, s.primary_locale, ?, u.last_name, 'string' FROM users_tmp u, site s", array(IDENTITY_SETTING_FAMILYNAME));
941  // the author names will be saved in the submission's primary locale
942  $userDao->update("INSERT INTO author_settings (author_id, locale, setting_name, setting_value, setting_type) SELECT DISTINCT a.author_id, s.locale, ?, a.first_name, 'string' FROM authors_tmp a, submissions s WHERE s.submission_id = a.submission_id", array(IDENTITY_SETTING_GIVENNAME));
943  $userDao->update("INSERT INTO author_settings (author_id, locale, setting_name, setting_value, setting_type) SELECT DISTINCT a.author_id, s.locale, ?, a.last_name, 'string' FROM authors_tmp a, submissions s WHERE s.submission_id = a.submission_id", array(IDENTITY_SETTING_FAMILYNAME));
944 
945  // middle name will be migrated to the given name
946  // note that given names are already migrated to the settings table
947  $driver = $userDao->getDriver();
948  switch ($driver) {
949  case 'mysql':
950  case 'mysqli':
951  // the alias for _settings table cannot be used for some reason -- syntax error
952  $userDao->update("UPDATE user_settings, users_tmp u SET user_settings.setting_value = CONCAT(user_settings.setting_value, ' ', u.middle_name) WHERE user_settings.setting_name = ? AND u.user_id = user_settings.user_id AND u.middle_name IS NOT NULL AND u.middle_name <> ''", array(IDENTITY_SETTING_GIVENNAME));
953  $userDao->update("UPDATE author_settings, authors_tmp a SET author_settings.setting_value = CONCAT(author_settings.setting_value, ' ', a.middle_name) WHERE author_settings.setting_name = ? AND a.author_id = author_settings.author_id AND a.middle_name IS NOT NULL AND a.middle_name <> ''", array(IDENTITY_SETTING_GIVENNAME));
954  break;
955  case 'postgres':
956  case 'postgres64':
957  case 'postgres7':
958  case 'postgres8':
959  case 'postgres9':
960  $userDao->update("UPDATE user_settings SET setting_value = CONCAT(setting_value, ' ', u.middle_name) FROM users_tmp u WHERE user_settings.setting_name = ? AND u.user_id = user_settings.user_id AND u.middle_name IS NOT NULL AND u.middle_name <> ''", array(IDENTITY_SETTING_GIVENNAME));
961  $userDao->update("UPDATE author_settings SET setting_value = CONCAT(setting_value, ' ', a.middle_name) FROM authors_tmp a WHERE author_settings.setting_name = ? AND a.author_id = author_settings.author_id AND a.middle_name IS NOT NULL AND a.middle_name <> ''", array(IDENTITY_SETTING_GIVENNAME));
962  break;
963  default: fatalError('Unknown database type!');
964  }
965 
966  // salutation and suffix will be migrated to the preferred public name
967  // user preferred public names will be inserted for each supported site locales
968  $siteDao = DAORegistry::getDAO('SiteDAO'); /* @var $siteDao SiteDAO */
969  $site = $siteDao->getSite();
970  $supportedLocales = $site->getSupportedLocales();
971  $userResult = $userDao->retrieve("
972  SELECT user_id, first_name, last_name, middle_name, salutation, suffix FROM users_tmp
973  WHERE (salutation IS NOT NULL AND salutation <> '') OR
974  (suffix IS NOT NULL AND suffix <> '')
975  ");
976  while (!$userResult->EOF) {
977  $row = $userResult->GetRowAssoc(false);
978  $userId = $row['user_id'];
979  $firstName = $row['first_name'];
980  $lastName = $row['last_name'];
981  $middleName = $row['middle_name'];
982  $salutation = $row['salutation'];
983  $suffix = $row['suffix'];
984  foreach ($supportedLocales as $siteLocale) {
985  $preferredPublicName = ($salutation != '' ? "$salutation " : '') . "$firstName " . ($middleName != '' ? "$middleName " : '') . $lastName . ($suffix != '' ? ", $suffix" : '');
986  if (AppLocale::isLocaleWithFamilyFirst($siteLocale)) {
987  $preferredPublicName = "$lastName, " . ($salutation != '' ? "$salutation " : '') . $firstName . ($middleName != '' ? " $middleName" : '');
988  }
989  $params = array((int) $userId, $siteLocale, $preferredPublicName);
990  $userDao->update("INSERT INTO user_settings (user_id, locale, setting_name, setting_value, setting_type) VALUES (?, ?, 'preferredPublicName', ?, 'string')", $params);
991  }
992  $userResult->MoveNext();
993  }
994  $userResult->Close();
995 
996  // author suffix will be migrated to the author preferred public name
997  // author preferred public names will be inserted for each journal supported locale
998  // get supported locales for all journals
999  $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */
1000  $journals = $journalDao->getAll();
1001  $journalsSupportedLocales = array();
1002  while ($journal = $journals->next()) {
1003  $journalsSupportedLocales[$journal->getId()] = $journal->getSupportedLocales();
1004  }
1005  // get all authors with a suffix
1006  $authorResult = $userDao->retrieve("
1007  SELECT a.author_id, a.first_name, a.last_name, a.middle_name, a.suffix, j.journal_id FROM authors_tmp a
1008  LEFT JOIN submissions s ON (s.submission_id = a.submission_id)
1009  LEFT JOIN journals j ON (j.journal_id = s.context_id)
1010  WHERE suffix IS NOT NULL AND suffix <> ''
1011  ");
1012  while (!$authorResult->EOF) {
1013  $row = $authorResult->GetRowAssoc(false);
1014  $authorId = $row['author_id'];
1015  $firstName = $row['first_name'];
1016  $lastName = $row['last_name'];
1017  $middleName = $row['middle_name'];
1018  $suffix = $row['suffix'];
1019  $journalId = $row['journal_id'];
1020  $supportedLocales = $journalsSupportedLocales[$journalId];
1021  foreach ($supportedLocales as $locale) {
1022  $preferredPublicName = "$firstName " . ($middleName != '' ? "$middleName " : '') . $lastName . ($suffix != '' ? ", $suffix" : '');
1023  if (AppLocale::isLocaleWithFamilyFirst($locale)) {
1024  $preferredPublicName = "$lastName, " . $firstName . ($middleName != '' ? " $middleName" : '');
1025  }
1026  $params = array((int) $authorId, $locale, $preferredPublicName);
1027  $userDao->update("INSERT INTO author_settings (author_id, locale, setting_name, setting_value, setting_type) VALUES (?, ?, 'preferredPublicName', ?, 'string')", $params);
1028  }
1029  $authorResult->MoveNext();
1030  }
1031  $authorResult->Close();
1032 
1033  // remove temporary table
1034  $siteDao->update('DROP TABLE users_tmp');
1035  $siteDao->update('DROP TABLE authors_tmp');
1036  return true;
1037  }
1038 
1043  function updateSuppFileMetrics() {
1044  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
1045  $metricsDao = DAORegistry::getDAO('MetricsDAO'); /* @var $metricsDao MetricsDAO */
1046  # Copy 531 assoc_type data to temp table
1047  $result = $metricsDao->update(
1048  'CREATE TABLE metrics_supp AS (SELECT * FROM metrics WHERE assoc_type = 531)'
1049  );
1050  # Fetch submission_file data with old-supp-id
1051  $result = $submissionFileDao->retrieve(
1052  'SELECT * FROM submission_file_settings WHERE setting_name = ?',
1053  'old-supp-id'
1054  );
1055  # Loop through the data and save to temp table
1056  while (!$result->EOF) {
1057  $row = $result->GetRowAssoc(false);
1058  # Use assoc_type 2531 to prevent collisions between old assoc_id and new assoc_id
1059  $metricsDao->update(
1060  'UPDATE metrics_supp SET assoc_id = ?, assoc_type = ? WHERE assoc_type = ? AND assoc_id = ?',
1061  array((int) $row['file_id'], 2531, 531, (int) $row['setting_value'])
1062  );
1063  $result->MoveNext();
1064  }
1065  $result->Close();
1066  # update temprorary 2531 values to 531 values
1067  $metricsDao->update(
1068  'UPDATE metrics_supp SET assoc_type = ? WHERE assoc_type = ?',
1069  array(531, 2531)
1070  );
1071  # delete all existing 531 values from the actual metrics table
1072  $metricsDao->update('DELETE FROM metrics WHERE assoc_type = 531');
1073  # copy updated 531 values from metrics_supp to metrics table
1074  $metricsDao->update('INSERT INTO metrics SELECT * FROM metrics_supp');
1075  # Drop metrics_supp table
1076  $metricsDao->update('DROP TABLE metrics_supp');
1077  return true;
1078  }
1079 
1084  function migrateSiteStylesheet() {
1085  $siteDao = DAORegistry::getDAO('SiteDAO'); /* @var $siteDao SiteDAO */
1086 
1087  import('classes.file.PublicFileManager');
1088  $publicFileManager = new PublicFileManager();
1089 
1090  if (!file_exists($publicFileManager->getSiteFilesPath() . '/sitestyle.css')) {
1091  return true;
1092  }
1093 
1094  $site = $siteDao->getSite();
1095  $site->setData('styleSheet', 'sitestyle.css');
1096  $siteDao->updateObject($site);
1097 
1098  return true;
1099  }
1100 
1105  function createLicenseTerms() {
1106  $contextDao = Application::getContextDao();
1107 
1108  $result = $contextDao->retrieve('SELECT * from ' . $contextDao->settingsTableName . " WHERE setting_name='copyrightNotice'");
1109  while (!$result->EOF) {
1110  $row = $result->getRowAssoc(false);
1111  $contextDao->update('
1112  INSERT INTO ' . $contextDao->settingsTableName . ' (
1113  ' . $contextDao->primaryKeyColumn . ',
1114  locale,
1115  setting_name,
1116  setting_value
1117  ) VALUES (?, ?, ?, ?)',
1118  [
1119  $row[$contextDao->primaryKeyColumn],
1120  $row['locale'],
1121  'licenseTerms',
1122  $row['setting_value'],
1123  ]
1124  );
1125  $result->MoveNext();
1126  }
1127  $result->Close();
1128 
1129  return true;
1130  }
1131 
1137  function changeUserRolesAndStageAssignmentsForStagePermitSubmissionEdit() {
1138  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO');
1139  $userGroupDao = DAORegistry::getDAO('UserGroupDAO');
1142  $roleString = '(' . implode(",", $roles) . ')';
1143 
1144  $userGroupDao->update('UPDATE user_groups SET permit_metadata_edit = 1 WHERE role_id IN ' . $roleString);
1145  switch ($userGroupDao->getDriver()) {
1146  case 'mysql':
1147  case 'mysqli':
1148  $stageAssignmentDao->update('UPDATE stage_assignments sa JOIN user_groups ug on sa.user_group_id = ug.user_group_id SET sa.can_change_metadata = 1 WHERE ug.role_id IN ' . $roleString);
1149  break;
1150  case 'postgres':
1151  case 'postgres64':
1152  case 'postgres7':
1153  case 'postgres8':
1154  case 'postgres9':
1155  $stageAssignmentDao->update('UPDATE stage_assignments SET can_change_metadata=1 FROM stage_assignments sa JOIN user_groups ug ON (sa.user_group_id = ug.user_group_id) WHERE ug.role_id IN ' . $roleString);
1156  break;
1157  default: fatalError("Unknown database type!");
1158  }
1159 
1160  return true;
1161  }
1162 
1173  function migrateSubmissionCoverImages() {
1174  $coverImagesBySubmission = [];
1175 
1176  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
1177  $result = $submissionDao->retrieve(
1178  'SELECT * from submission_settings WHERE setting_name=\'coverImage\' OR setting_name=\'coverImageAltText\''
1179  );
1180  while (!$result->EOF) {
1181  $row = $result->getRowAssoc(false);
1182  $submissionId = $row['submission_id'];
1183  if (empty($coverImagesBySubmission[$submissionId])) {
1184  $coverImagesBySubmission[$submissionId] = [];
1185  }
1186  if ($row['setting_name'] === 'coverImage') {
1187  $coverImagesBySubmission[$submissionId]['uploadName'] = $row['setting_value'];
1188  $coverImagesBySubmission[$submissionId]['dateUploaded'] = Core::getCurrentDate();
1189  } elseif ($row['setting_name'] === 'coverImageAltText') {
1190  $coverImagesBySubmission[$submissionId]['altText'] = $row['setting_value'];
1191  }
1192  $result->MoveNext();
1193  }
1194  $result->Close();
1195 
1196  foreach ($coverImagesBySubmission as $submissionId => $coverImagesBySubmission) {
1197  $submissionDao->update(
1198  'UPDATE submission_settings
1199  SET setting_value = ?
1200  WHERE submission_id = ? AND setting_name = ?',
1201  [
1202  serialize($coverImagesBySubmission),
1203  $submissionId,
1204  'coverImage',
1205  ]
1206  );
1207  }
1208 
1209  return true;
1210  }
1211 }
Installer\isUpgrade
isUpgrade()
Definition: Installer.inc.php:171
Application\getContextDAO
static getContextDAO()
Definition: Application.inc.php:137
SubmissionFileManager
Helper class for database-backed submission file management tasks.
Definition: SubmissionFileManager.inc.php:30
StaticPagesDAO
Definition: StaticPagesDAO.inc.php:18
PKPString\stripUnsafeHtml
static stripUnsafeHtml($input)
Definition: PKPString.inc.php:377
Installer\__construct
__construct($descriptor, $params=array(), $isPlugin=false)
Definition: Installer.inc.php:150
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
rebuildSearchIndex
CLI tool to rebuild the article keyword search database.
Definition: rebuildSearchIndex.php:18
Installer\tableExists
tableExists($tableName)
Definition: Installer.inc.php:775
PluginRegistry\getAllPlugins
static getAllPlugins()
Definition: PluginRegistry.inc.php:43
AppLocale\getPrimaryLocale
static getPrimaryLocale()
Definition: env1/MockAppLocale.inc.php:95
PublicFileManager
Wrapper class for uploading files to a site/journal's public directory.
Definition: PublicFileManager.inc.php:18
Seboettg\Collection\count
count()
Definition: ArrayListTrait.php:253
UserGroupDAO\getNotChangeMetadataEditPermissionRoles
static getNotChangeMetadataEditPermissionRoles()
Definition: UserGroupDAO.inc.php:1046
PKPLocale\isLocaleWithFamilyFirst
static isLocaleWithFamilyFirst($locale)
Definition: PKPLocale.inc.php:492
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
strtolower_codesafe
strtolower_codesafe($str)
Definition: functions.inc.php:280
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
Application\getSubmissionSearchIndex
static getSubmissionSearchIndex()
Definition: Application.inc.php:169
Installer
Base class for install and upgrade scripts.
Definition: Installer.inc.php:34
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
fatalError
if(!function_exists('import')) fatalError($reason)
Definition: functions.inc.php:32
FileManager
Class defining basic operations for file management.
Definition: FileManager.inc.php:35
Installer\$locale
$locale
Definition: Installer.inc.php:76