Skip to content

Commit cbe2c65

Browse files
Merge branch 'doiRelatedPublication330-771' into 'stable-3_3_0'
Atualização do campo Publicação Relacionada - 3.3.0 See merge request softwares-pkp/plugins_ojs/dataverse!192
2 parents 5f722ff + 4a62394 commit cbe2c65

13 files changed

Lines changed: 167 additions & 76 deletions

classes/APACitation.inc.php

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,12 @@ public function getFormattedCitationBySubmission(Submission $submission): string
1818
$publication = $submission->getCurrentPublication();
1919
$authors = $publication->getData('authors');
2020
$submittedDate = new DateTime($submission->getDateSubmitted());
21-
$submissionDoi = $this->getSubmissionDoi($submission);
2221

2322
$submissionCitation = $this->createAuthorsCitationAPA($authors) . ' ';
2423
$submissionCitation .= '(' . date_format($submittedDate, 'Y') . '). ';
2524
$submissionCitation .= '<em>' . $submission->getLocalizedTitle($submission->getLocale()) . '</em>. ';
2625
$submissionCitation .= $journal->getLocalizedName();
2726

28-
if ($submissionDoi) {
29-
$submissionCitation .= ". <a href=\"$submissionDoi\">$submissionDoi</a>";
30-
}
31-
3227
return $submissionCitation;
3328
}
3429

@@ -71,24 +66,4 @@ private function getAuthorCitation(Author $author): string
7166

7267
return $familyName . ', ' . mb_substr($givenName, 0, 1) . ".";
7368
}
74-
75-
private function getSubmissionDoi(Submission $submission): string
76-
{
77-
$publication = $submission->getCurrentPublication();
78-
$doi = $publication->getStoredPubId('doi');
79-
80-
if ($doi) {
81-
return 'https://doi.org/' . $this->doiURLEncode($doi);
82-
}
83-
84-
return '';
85-
}
86-
87-
private function doiURLEncode($pubId)
88-
{
89-
$search = ['%', '"', '#', ' ', '<', '>', '{'];
90-
$replace = ['%25', '%22', '%23', '%20', '%3c', '%3e', '%7b'];
91-
$pubId = str_replace($search, $replace, $pubId);
92-
return $pubId;
93-
}
9469
}

classes/dispatchers/DataverseEventsDispatcher.inc.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -420,11 +420,11 @@ public function updateDatasetOnPublicationUpdate(string $hookName, array $args):
420420
return false;
421421
}
422422

423-
import('plugins.generic.dataverse.classes.APACitation');
424-
$apaCitation = new APACitation();
423+
import('plugins.generic.dataverse.classes.factories.SubmissionDatasetFactory');
424+
$datasetFactory = new SubmissionDatasetFactory($submission);
425425

426426
$data['persistentId'] = $study->getPersistentId();
427-
$data['pubCitation'] = $apaCitation->getFormattedCitationBySubmission($submission);
427+
$data['relatedPublication'] = $datasetFactory->getDatasetRelatedPublication($publication);
428428

429429
$datasetService = new DatasetService();
430430
$datasetService->update($data);

classes/entities/Dataset.inc.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,14 @@ public function setKeywords(array $keywords): void
9595
$this->setData('keywords', $keywords);
9696
}
9797

98-
public function getPubCitation(): ?string
98+
public function getRelatedPublication(): ?DatasetRelatedPublication
9999
{
100-
return $this->getData('pubCitation');
100+
return $this->getData('relatedPublication');
101101
}
102102

103-
public function setPubCitation(string $pubCitation): void
103+
public function setRelatedPublication(DatasetRelatedPublication $relatedPublication): void
104104
{
105-
$this->setData('pubCitation', $pubCitation);
105+
$this->setData('relatedPublication', $relatedPublication);
106106
}
107107

108108
public function getFiles(): ?array
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
class DatasetRelatedPublication extends DataObject
4+
{
5+
public function __construct(string $citation, ?string $idType, ?string $idNumber, ?string $url)
6+
{
7+
$this->setData('citation', $citation);
8+
$this->setData('IDType', $idType);
9+
$this->setData('IDNumber', $idNumber);
10+
$this->setData('URL', $url);
11+
}
12+
13+
public function getCitation(): string
14+
{
15+
return $this->getData('citation');
16+
}
17+
18+
public function getIdType(): ?string
19+
{
20+
return $this->getData('IDType');
21+
}
22+
23+
public function getIdNumber(): ?string
24+
{
25+
return $this->getData('IDNumber');
26+
}
27+
28+
public function getUrl(): ?string
29+
{
30+
return $this->getData('URL');
31+
}
32+
}

classes/factories/JsonDatasetFactory.inc.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import('plugins.generic.dataverse.classes.entities.DatasetAuthor');
55
import('plugins.generic.dataverse.classes.entities.DatasetContact');
66
import('plugins.generic.dataverse.classes.entities.DatasetFile');
7+
import('plugins.generic.dataverse.classes.entities.DatasetRelatedPublication');
78

89
class JsonDatasetFactory extends DatasetFactory
910
{
@@ -91,7 +92,19 @@ protected function sanitizeProps(): array
9192
}, $metadata->value);
9293
break;
9394
case 'publication':
94-
$props['pubCitation'] = $metadata->value[0]->publicationCitation->value;
95+
$publication = $metadata->value[0];
96+
$props['relatedPublication'] = new DatasetRelatedPublication(
97+
$publication->publicationCitation->value,
98+
isset($publication->publicationIDType->value) ?
99+
$publication->publicationIDType->value
100+
: null,
101+
isset($publication->publicationIDNumber->value) ?
102+
$publication->publicationIDNumber->value
103+
: null,
104+
isset($publication->publicationURL->value) ?
105+
$publication->publicationURL->value
106+
: null
107+
);
95108
break;
96109
default:
97110
break;

classes/factories/SubmissionDatasetFactory.inc.php

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import('plugins.generic.dataverse.classes.entities.DatasetAuthor');
66
import('plugins.generic.dataverse.classes.entities.DatasetContact');
77
import('plugins.generic.dataverse.classes.entities.DatasetFile');
8+
import('plugins.generic.dataverse.classes.entities.DatasetRelatedPublication');
89

910
class SubmissionDatasetFactory extends DatasetFactory
1011
{
@@ -30,7 +31,7 @@ protected function sanitizeProps(): array
3031
$props['authors'] = array_map([$this, 'createDatasetAuthor'], $authors);
3132
$props['contact'] = $this->createDatasetContact();
3233
$props['depositor'] = $this->getDatasetDepositor();
33-
$props['pubCitation'] = $this->getDatasetPubCitation();
34+
$props['relatedPublication'] = $this->getDatasetRelatedPublication($publication);
3435
$props['files'] = $this->getDatasetFiles();
3536

3637
return $props;
@@ -81,11 +82,30 @@ private function getDatasetDepositor(): string
8182
return $userName . ' (via ' . $contextName . ')';
8283
}
8384

84-
private function getDatasetPubCitation(): string
85+
public function getDatasetRelatedPublication($publication): DatasetRelatedPublication
8586
{
8687
import('plugins.generic.dataverse.classes.APACitation');
8788
$apaCitation = new APACitation();
88-
return $apaCitation->getFormattedCitationBySubmission($this->submission);
89+
$submissionCitation = $apaCitation->getFormattedCitationBySubmission($this->submission);
90+
$submissionDoi = $publication->getStoredPubId('doi');
91+
92+
if (empty($submissionDoi)) {
93+
return new DatasetRelatedPublication($submissionCitation, null, null, null);
94+
}
95+
96+
return new DatasetRelatedPublication(
97+
$submissionCitation,
98+
'doi',
99+
$submissionDoi,
100+
"https://doi.org/" . $this->doiURLEncode($submissionDoi)
101+
);
102+
}
103+
104+
private function doiURLEncode($doi)
105+
{
106+
$search = ['%', '"', '#', ' ', '<', '>', '{'];
107+
$replace = ['%25', '%22', '%23', '%20', '%3c', '%3e', '%7b'];
108+
return str_replace($search, $replace, $doi);
89109
}
90110

91111
private function getDatasetFiles(): array

dataverseAPI/packagers/NativeAPIDatasetPackager.inc.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public function getMetadataField(string $metadata): array
112112
'multiple' => false,
113113
'typeClass' => 'primitive'
114114
],
115-
'pubCitation' => [
115+
'relatedPublication' => [
116116
'typeName' => 'publication',
117117
'multiple' => true,
118118
'typeClass' => 'compound'
@@ -141,14 +141,15 @@ private function createSimpleCompoundMetadata(array $metadataField, string $valu
141141
private function createMultiCompoundMetadata(array $metadataField, object $object): array
142142
{
143143
$objectData = $object->getAllData();
144+
$controlledVocabMetadata = ['identifierScheme', 'IDType'];
144145

145146
$metadataValue = [];
146147
foreach ($objectData as $attr => $value) {
147148
if (is_null($value)) {
148149
continue;
149150
}
150151

151-
$metadataTypeClass = $attr == 'identifierScheme' ? 'controlledVocabulary' : 'primitive';
152+
$metadataTypeClass = in_array($attr, $controlledVocabMetadata) ? 'controlledVocabulary' : 'primitive';
152153
$metadataValue = array_merge($metadataValue, [
153154
$metadataField['typeName'] . ucfirst($attr) => [
154155
'typeName' => $metadataField['typeName'] . ucfirst($attr),

tests/APACitationTest.php

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,7 @@ public function testDatasetCitationGetsDoiMarkup(): void
101101

102102
public function testPreprintCitationIsAPA(): void
103103
{
104-
$expectedSubmissionCitation = 'Castanheiras, I. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus.';
105-
$expectedSubmissionCitation .= ' <a href="https://doi.org/10.1234/LepidusPreprints.1245">https://doi.org/10.1234/LepidusPreprints.1245</a>';
104+
$expectedSubmissionCitation = 'Castanheiras, I. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus';
106105

107106
$apaCitation = new APACitation();
108107
$preprintCitation = $apaCitation->getFormattedCitationBySubmission($this->submission);
@@ -118,8 +117,7 @@ public function testFamilyNameWithAccentOnTheFirstLetter(): void
118117
$apaCitation = new APACitation();
119118
$preprintCitation = $apaCitation->getFormattedCitationBySubmission($this->submission);
120119

121-
$expectedSubmissionCitation = 'Álamo, Á. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus.';
122-
$expectedSubmissionCitation .= ' <a href="https://doi.org/10.1234/LepidusPreprints.1245">https://doi.org/10.1234/LepidusPreprints.1245</a>';
120+
$expectedSubmissionCitation = 'Álamo, Á. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus';
123121
$this->assertEquals($expectedSubmissionCitation, $preprintCitation);
124122
}
125123

@@ -131,8 +129,7 @@ public function testGivenNameWithAccentAnyLetterExceptFirstLetterAndFamilyNameWi
131129
$apaCitation = new APACitation();
132130
$preprintCitation = $apaCitation->getFormattedCitationBySubmission($this->submission);
133131

134-
$expectedSubmissionCitation = 'Fernandes, M. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus.';
135-
$expectedSubmissionCitation .= ' <a href="https://doi.org/10.1234/LepidusPreprints.1245">https://doi.org/10.1234/LepidusPreprints.1245</a>';
132+
$expectedSubmissionCitation = 'Fernandes, M. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus';
136133
$this->assertEquals($expectedSubmissionCitation, $preprintCitation);
137134
}
138135

@@ -144,8 +141,7 @@ public function testFamilyNameWithAccentOnTheFirstLetterAndGivenNameWithoutAccen
144141
$apaCitation = new APACitation();
145142
$preprintCitation = $apaCitation->getFormattedCitationBySubmission($this->submission);
146143

147-
$expectedSubmissionCitation = 'Átila, L. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus.';
148-
$expectedSubmissionCitation .= ' <a href="https://doi.org/10.1234/LepidusPreprints.1245">https://doi.org/10.1234/LepidusPreprints.1245</a>';
144+
$expectedSubmissionCitation = 'Átila, L. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus';
149145
$this->assertEquals($expectedSubmissionCitation, $preprintCitation);
150146
}
151147

@@ -157,8 +153,7 @@ public function testGivenNameAndFamilyNameWithAccentExceptFirstLetter(): void
157153
$apaCitation = new APACitation();
158154
$preprintCitation = $apaCitation->getFormattedCitationBySubmission($this->submission);
159155

160-
$expectedSubmissionCitation = 'Sérgio, C. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus.';
161-
$expectedSubmissionCitation .= ' <a href="https://doi.org/10.1234/LepidusPreprints.1245">https://doi.org/10.1234/LepidusPreprints.1245</a>';
156+
$expectedSubmissionCitation = 'Sérgio, C. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus';
162157
$this->assertEquals($expectedSubmissionCitation, $preprintCitation);
163158
}
164159

@@ -169,8 +164,7 @@ public function testGivenNameWithAccentOnTheFirstLetter(): void
169164
$apaCitation = new APACitation();
170165
$preprintCitation = $apaCitation->getFormattedCitationBySubmission($this->submission);
171166

172-
$expectedSubmissionCitation = 'Castanheiras, Â. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus.';
173-
$expectedSubmissionCitation .= ' <a href="https://doi.org/10.1234/LepidusPreprints.1245">https://doi.org/10.1234/LepidusPreprints.1245</a>';
167+
$expectedSubmissionCitation = 'Castanheiras, Â. (2021). <em>The Rise of The Machine Empire</em>. Preprints da Lepidus';
174168
$this->assertEquals($expectedSubmissionCitation, $preprintCitation);
175169
}
176170
}

tests/dataverseAPI/packagers/NativeAPIDatasetPackagerTest.php

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import('lib.pkp.tests.PKPTestCase');
44
import('plugins.generic.dataverse.dataverseAPI.packagers.NativeAPIDatasetPackager');
5+
import('plugins.generic.dataverse.classes.entities.Dataset');
6+
import('plugins.generic.dataverse.classes.entities.DatasetContact');
7+
import('plugins.generic.dataverse.classes.entities.DatasetFile');
8+
import('plugins.generic.dataverse.classes.entities.DatasetRelatedPublication');
59
import('plugins.generic.dataverse.classes.DataverseMetadata');
610

711
class NativeAPIDatasetPackagerTest extends PKPTestCase
@@ -65,22 +69,46 @@ public function testNativeAPIPackagerBuildsSimpleCompoundMetadata(): void
6569
$this->assertContains($descriptionMetadata, $this->packager->getDatasetMetadata());
6670
}
6771

68-
public function testNativeAPIPackagerBuildsPubCitationMetadata(): void
72+
public function testNativeAPIPackagerBuildsRelatedPublicationMetadata(): void
6973
{
74+
$relatedPublication = new DatasetRelatedPublication(
75+
'User, T. (2023). <em>Test Dataset</em>. Open Preprint Systems',
76+
'doi',
77+
'10.1234/LepidusPreprints.1245',
78+
'https://doi.org/10.1234/LepidusPreprints.1245'
79+
);
7080
$dataset = new Dataset();
71-
$dataset->setPubCitation('User, T. (2023). <em>Test Dataset</em>. Open Preprint Systems');
81+
$dataset->setRelatedPublication($relatedPublication);
7282

7383
$this->packager = new NativeAPIDatasetPackager($dataset);
7484
$this->packager->loadPackageData();
7585

76-
$publicationMetadata = $this->packager->getMetadataField('pubCitation');
86+
$publicationMetadata = $this->packager->getMetadataField('relatedPublication');
7787
$publicationMetadata['value'] = [
7888
[
7989
'publicationCitation' => [
8090
'typeName' => 'publicationCitation',
8191
'multiple' => false,
8292
'typeClass' => 'primitive',
83-
'value' => $dataset->getPubCitation()
93+
'value' => $relatedPublication->getCitation()
94+
],
95+
'publicationIDType' => [
96+
'typeName' => 'publicationIDType',
97+
'multiple' => false,
98+
'typeClass' => 'controlledVocabulary',
99+
'value' => $relatedPublication->getIdType()
100+
],
101+
'publicationIDNumber' => [
102+
'typeName' => 'publicationIDNumber',
103+
'multiple' => false,
104+
'typeClass' => 'primitive',
105+
'value' => $relatedPublication->getIdNumber()
106+
],
107+
'publicationURL' => [
108+
'typeName' => 'publicationURL',
109+
'multiple' => false,
110+
'typeClass' => 'primitive',
111+
'value' => $relatedPublication->getUrl()
84112
]
85113
]
86114
];

tests/factories/JsonDatasetFactoryTest.php

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<?php
22

33
import('lib.pkp.tests.PKPTestCase');
4+
import('plugins.generic.dataverse.classes.entities.DatasetAuthor');
5+
import('plugins.generic.dataverse.classes.entities.DatasetContact');
6+
import('plugins.generic.dataverse.classes.entities.DatasetRelatedPublication');
47
import('plugins.generic.dataverse.classes.factories.JsonDatasetFactory');
58

69
class JsonDatasetFactoryTest extends PKPTestCase
@@ -11,20 +14,24 @@ public function testCreateDataset()
1114
$datasetFactory = new JsonDatasetFactory($jsonContent);
1215
$dataset = $datasetFactory->getDataset();
1316

17+
$expectedDatasetAuthor = new DatasetAuthor('Test, Author', 'Dataverse', 'ORCID', '0000-0000-0000-0000');
18+
$expectedDatasetContact = new DatasetContact('Test, Contact', 'test@example.com', 'Dataverse');
19+
$expectedDatasetRelatedPublication = new DatasetRelatedPublication(
20+
'User, T. (2023). <em>Test Dataset</em>. Open Preprint Systems',
21+
'doi',
22+
'10.1234/LepidusPreprints.1245',
23+
'https://doi.org/10.1234/LepidusPreprints.1245'
24+
);
25+
1426
$this->assertEquals('doi:10.12345/FK2/ABCDEFG', $dataset->getPersistentId());
1527
$this->assertEquals('Test title', $dataset->getTitle());
1628
$this->assertEquals('<p>An example description</p>', $dataset->getDescription());
1729
$this->assertEquals('CC BY 4.0', $dataset->getLicense());
1830
$this->assertEquals('Other', $dataset->getSubject());
1931
$this->assertEquals(['test'], $dataset->getKeywords());
20-
$this->assertEquals('Test, Author', $dataset->getAuthors()[0]->getName());
21-
$this->assertEquals('Dataverse', $dataset->getAuthors()[0]->getAffiliation());
22-
$this->assertEquals('0000-0000-0000-0000', $dataset->getAuthors()[0]->getIdentifier());
23-
$this->assertEquals('ORCID', $dataset->getAuthors()[0]->getIdentifierScheme());
24-
$this->assertEquals('Test, Contact', $dataset->getContact()->getName());
25-
$this->assertEquals('test@example.com', $dataset->getContact()->getEmail());
26-
$this->assertEquals('Dataverse', $dataset->getContact()->getAffiliation());
27-
$this->assertEquals('Related publication', $dataset->getPubCitation());
32+
$this->assertEquals($expectedDatasetAuthor, $dataset->getAuthors()[0]);
33+
$this->assertEquals($expectedDatasetContact, $dataset->getContact());
34+
$this->assertEquals($expectedDatasetRelatedPublication, $dataset->getRelatedPublication());
2835
$this->assertEquals('Test, Depositor', $dataset->getDepositor());
2936
$this->assertEquals('RELEASED', $dataset->getVersionState());
3037

0 commit comments

Comments
 (0)