first commit
This commit is contained in:
@@ -0,0 +1,180 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user