181 lines
6.9 KiB
PHP
181 lines
6.9 KiB
PHP
<?php
|
|
/**
|
|
* @file classes/submission/Repository.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2000-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class Repository
|
|
*
|
|
* @brief A repository to find and manage submissions.
|
|
*/
|
|
|
|
namespace APP\submission;
|
|
|
|
use APP\article\ArticleTombstoneManager;
|
|
use APP\core\Services;
|
|
use APP\facades\Repo;
|
|
use APP\journal\JournalDAO;
|
|
use APP\section\Section;
|
|
use PKP\context\Context;
|
|
use PKP\core\PKPString;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\doi\exceptions\DoiException;
|
|
use PKP\tombstone\DataObjectTombstoneDAO;
|
|
|
|
class Repository extends \PKP\submission\Repository
|
|
{
|
|
/** @copydoc \PKP\submission\Repository::$schemaMap */
|
|
public $schemaMap = maps\Schema::class;
|
|
|
|
/**
|
|
* Get submissions ordered by section id
|
|
*
|
|
* @return array [int $sectionId => [?Submission, ...]]
|
|
*/
|
|
public function getInSections(int $issueId, int $contextId): array
|
|
{
|
|
$submissions = $this->getCollector()
|
|
->filterByContextIds([$contextId])
|
|
->filterByIssueIds([$issueId])
|
|
->filterByStatus([Submission::STATUS_PUBLISHED, Submission::STATUS_SCHEDULED])
|
|
->orderBy(Collector::ORDERBY_SEQUENCE, Collector::ORDER_DIR_ASC)
|
|
->getMany();
|
|
|
|
$bySections = [];
|
|
foreach ($submissions as $submission) {
|
|
$sectionId = $submission->getCurrentPublication()->getData('sectionId');
|
|
if (empty($bySections[$sectionId])) {
|
|
$section = Repo::section()->get($sectionId);
|
|
$bySections[$sectionId] = [
|
|
'articles' => [],
|
|
'title' => $section->getData('hideTitle') ? '' : $section->getLocalizedData('title'),
|
|
'abstractsNotRequired' => $section->getData('abstractsNotRequired'),
|
|
'hideAuthor' => $section->getData('hideAuthor'),
|
|
];
|
|
}
|
|
$bySections[$sectionId]['articles'][] = $submission;
|
|
}
|
|
|
|
return $bySections;
|
|
}
|
|
|
|
public function validateSubmit(Submission $submission, Context $context): array
|
|
{
|
|
$errors = parent::validateSubmit($submission, $context);
|
|
|
|
$locale = $submission->getData('locale');
|
|
$publication = $submission->getCurrentPublication();
|
|
|
|
$section = Repo::section()->get($submission->getCurrentPublication()->getData('sectionId'), $context->getId());
|
|
|
|
// Required abstract
|
|
if (!$section->getAbstractsNotRequired() && !$publication->getData('abstract', $locale)) {
|
|
$errors['abstract'] = [$locale => [__('validator.required')]];
|
|
}
|
|
|
|
// Abstract word limit
|
|
if ($section->getAbstractWordCount()) {
|
|
$abstracts = $publication->getData('abstract');
|
|
if ($abstracts) {
|
|
$abstractErrors = [];
|
|
foreach ($context->getSupportedSubmissionLocales() as $localeKey) {
|
|
$abstract = $publication->getData('abstract', $localeKey);
|
|
$wordCount = $abstract ? PKPString::getWordCount($abstract) : 0;
|
|
if ($wordCount > $section->getAbstractWordCount()) {
|
|
$abstractErrors[$localeKey] = [
|
|
__(
|
|
'publication.wordCountLong',
|
|
[
|
|
'limit' => $section->getAbstractWordCount(),
|
|
'count' => $wordCount
|
|
]
|
|
)
|
|
];
|
|
}
|
|
}
|
|
if (count($abstractErrors)) {
|
|
$errors['abstract'] = $abstractErrors;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $errors;
|
|
}
|
|
|
|
public function updateStatus(Submission $submission, ?int $newStatus = null, ?Section $section = null)
|
|
{
|
|
$oldStatus = $submission->getData('status');
|
|
parent::updateStatus($submission, $newStatus, $section);
|
|
$newStatus = $submission->getData('status');
|
|
|
|
// Add or remove tombstones when submission is published or unpublished
|
|
if ($newStatus === Submission::STATUS_PUBLISHED && $newStatus !== $oldStatus) {
|
|
$tombstoneDao = DAORegistry::getDAO('DataObjectTombstoneDAO'); /** @var DataObjectTombstoneDAO $tombstoneDao */
|
|
$tombstoneDao->deleteByDataObjectId($submission->getId());
|
|
} elseif ($oldStatus === Submission::STATUS_PUBLISHED && $newStatus !== $oldStatus) {
|
|
$requestContext = $this->request->getContext();
|
|
if ($requestContext && $requestContext->getId() === $submission->getData('contextId')) {
|
|
$context = $requestContext;
|
|
} else {
|
|
$context = Services::get('context')->get($submission->getData('contextId'));
|
|
}
|
|
$articleTombstoneManager = new ArticleTombstoneManager();
|
|
if (!$section) {
|
|
$section = Repo::section()->get($submission->getCurrentPublication()->getData('sectionId'), $submission->getData('contextId'));
|
|
}
|
|
$articleTombstoneManager->insertArticleTombstone($submission, $context, $section);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates and assigns DOIs to all sub-objects if:
|
|
* 1) the suffix pattern can currently be created, and
|
|
* 2) it does not already exist.
|
|
*
|
|
*
|
|
* @throws \Exception
|
|
*/
|
|
public function createDois(Submission $submission): array
|
|
{
|
|
/** @var JournalDAO $contextDao */
|
|
$contextDao = DAORegistry::getDAO('JournalDAO');
|
|
$context = $contextDao->getById($submission->getData('contextId'));
|
|
|
|
// Article
|
|
$publication = $submission->getCurrentPublication();
|
|
|
|
$doiCreationFailures = [];
|
|
|
|
if ($context->isDoiTypeEnabled(Repo::doi()::TYPE_PUBLICATION) && empty($publication->getData('doiId'))) {
|
|
try {
|
|
$doiId = Repo::doi()->mintPublicationDoi($publication, $submission, $context);
|
|
Repo::publication()->edit($publication, ['doiId' => $doiId]);
|
|
} catch (DoiException $exception) {
|
|
$doiCreationFailures[] = $exception;
|
|
}
|
|
}
|
|
|
|
// Galleys
|
|
if ($context->isDoiTypeEnabled(Repo::doi()::TYPE_REPRESENTATION)) {
|
|
$galleys = Repo::galley()->getCollector()
|
|
->filterByPublicationIds(['publicationIds' => $publication->getId()])
|
|
->getMany();
|
|
|
|
foreach ($galleys as $galley) {
|
|
if (empty($galley->getData('doiId'))) {
|
|
try {
|
|
$doiId = Repo::doi()->mintGalleyDoi($galley, $publication, $submission, $context);
|
|
Repo::galley()->edit($galley, ['doiId' => $doiId]);
|
|
} catch (DoiException $exception) {
|
|
$doiCreationFailures[] = $exception;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $doiCreationFailures;
|
|
}
|
|
}
|