Skip to content

Commit 3ec96b2

Browse files
authored
Merge pull request #11784 from QualitativeDataRepository/IQSS/11783-Curation_status_fixes
IQSS/11783 Curation Status fixes
2 parents 1252833 + d8674de commit 3ec96b2

File tree

5 files changed

+88
-6
lines changed

5 files changed

+88
-6
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
In prior versions of Dataverse, publishing a dataset via the superuser only update-current-version option would not set the current curation status (if enabled/used) to none/empty and, in v6.7, would not maintain the curation status history. These issues are now resolved and the update current version option works the same as normal publication of a new version w.r.t. curation status.

src/main/java/edu/harvard/iq/dataverse/api/Datasets.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2609,7 +2609,7 @@ public Response getCurationStatus(@Context ContainerRequestContext crc,
26092609
canSeeStatus = permissionSvc.requestOn(createDataverseRequest(user), ds).has(Permission.PublishDataset);
26102610
}
26112611

2612-
if (dsv.isDraft() && (canSeeStatus)) {
2612+
if (canSeeStatus) {
26132613
List<CurationStatus> statuses = includeHistory ? dsv.getCurationStatuses() : Collections.singletonList(dsv.getCurrentCurationStatus());
26142614
if (includeHistory) {
26152615
JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import edu.harvard.iq.dataverse.DatasetField;
1616
import edu.harvard.iq.dataverse.DatasetVersion;
1717
import edu.harvard.iq.dataverse.TermsOfUseAndAccess;
18+
import edu.harvard.iq.dataverse.CurationStatus;
1819
import edu.harvard.iq.dataverse.DataFile;
1920
import edu.harvard.iq.dataverse.FileMetadata;
2021
import edu.harvard.iq.dataverse.RoleAssignment;
@@ -27,6 +28,8 @@
2728
import java.util.logging.Level;
2829
import java.util.logging.Logger;
2930

31+
import org.apache.commons.lang3.StringUtils;
32+
3033
/**
3134
*
3235
* @author qqmyers
@@ -73,7 +76,7 @@ public Dataset execute(CommandContext ctxt) throws CommandException {
7376
newTerms.setDatasetVersion(updateVersion);
7477
updateVersion.setTermsOfUseAndAccess(newTerms);
7578

76-
//Creation Note
79+
//Version Note
7780
updateVersion.setVersionNote(newVersion.getVersionNote());
7881

7982
// Clear unnecessary terms relationships ....
@@ -96,6 +99,24 @@ public Dataset execute(CommandContext ctxt) throws CommandException {
9699
updateVersion.getWorkflowComments().addAll(newComments);
97100
}
98101

102+
// Transfer curation status entries from draft to published version
103+
List<CurationStatus> draftCurationStatuses = newVersion.getCurationStatuses();
104+
if (draftCurationStatuses != null && !draftCurationStatuses.isEmpty()) {
105+
for (CurationStatus cs : draftCurationStatuses) {
106+
// Update the dataset version reference
107+
//This call sets the version in the curationstatus object as well
108+
updateVersion.addCurationStatus(cs);
109+
}
110+
// Clear the list from the draft version
111+
newVersion.getCurationStatuses().clear();
112+
}
113+
114+
// Add a new empty curation status to clear the status in the published version (as done in the FinalizeDatasetPublicationCommand)
115+
CurationStatus status = updateVersion.getCurrentCurationStatus();
116+
if (status != null && StringUtils.isNotBlank(status.getLabel())) {
117+
updateVersion.addCurationStatus(new CurationStatus(null, updateVersion, getRequest().getAuthenticatedUser()));
118+
}
119+
99120
// we have to merge to update the database but not flush because
100121
// we don't want to create two draft versions!
101122
Dataset tempDataset = getDataset();
@@ -201,7 +222,7 @@ public Dataset execute(CommandContext ctxt) throws CommandException {
201222
// This can be corrected by running the update PID API later, but who will look in the log?
202223
// With the change to not use the DeleteDatasetVersionCommand above and other
203224
// fixes, this error may now cleanly restore the initial state
204-
// with the draft and last published versions unchanged, but this has not yet bee tested.
225+
// with the draft and last published versions unchanged, but this has not yet been tested.
205226
// (Alternately this could move to onSuccess if we intend it to stay non-fatal.)
206227
logger.log(Level.WARNING, "Curate Published DatasetVersion: exception while updating PID metadata:{0}", ex.getMessage());
207228
}

src/main/webapp/dataset.xhtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@
525525
#{bundle['dataset.curationStatusMenu']} <span class="caret"></span>
526526
</button>
527527
<ul class="dropdown-menu multi-level pull-right text-left">
528-
<ui:fragment rendered="#{(not empty DatasetPage.allowedCurationStatuses) and DatasetPage.canPublishDataset()}">
528+
<ui:fragment rendered="#{(not empty DatasetPage.allowedCurationStatuses) and DatasetPage.canPublishDataset() and version.draft}">
529529
<li class="dropdown-submenu pull-left">
530530
<a tabindex="0">#{bundle['dataset.changestatus']}</a>
531531
<ul class="dropdown-menu">

src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3875,6 +3875,8 @@ public void testCurationStatusAPIs() {
38753875
createDataverseResponse.prettyPrint();
38763876
String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse);
38773877

3878+
UtilIT.publishDataverseViaNativeApi(dataverseAlias, apiToken).then().assertThat().statusCode(OK.getStatusCode());
3879+
38783880
Response setCurationLabelSets = UtilIT.setSetting(SettingsServiceBean.Key.AllowedCurationLabels, "{\"StandardProcess\":[\"Author contacted\", \"Privacy Review\", \"Awaiting paper publication\", \"Final Approval\"],\"AlternateProcess\":[\"State 1\",\"State 2\",\"State 3\"]}");
38793881
setCurationLabelSets.then().assertThat()
38803882
.statusCode(OK.getStatusCode());
@@ -3885,7 +3887,7 @@ public void testCurationStatusAPIs() {
38853887
Response setDataverseCurationLabelSetResponse = UtilIT.setDataverseCurationLabelSet(dataverseAlias, apiToken, "AlternateProcess");
38863888
setDataverseCurationLabelSetResponse.then().assertThat().statusCode(FORBIDDEN.getStatusCode());
38873889

3888-
Response makeSuperUser = UtilIT.makeSuperUser(username);
3890+
Response makeSuperUser = UtilIT.setSuperuserStatus(username, true);
38893891
assertEquals(200, makeSuperUser.getStatusCode());
38903892

38913893
//Non-existent option
@@ -3944,8 +3946,66 @@ public void testCurationStatusAPIs() {
39443946
Response setInvalidStatus = UtilIT.setDatasetCurationLabel(datasetId, apiToken, "Invalid Status");
39453947
setInvalidStatus.then().assertThat().statusCode(BAD_REQUEST.getStatusCode());
39463948

3949+
// Publish the dataset
3950+
UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken).then().assertThat()
3951+
.statusCode(OK.getStatusCode());
3952+
3953+
// Verify that the current curation label is now empty after publishing
3954+
Response getStatusAfterPublish = UtilIT.getDatasetCurationStatus(datasetId, apiToken, false);
3955+
getStatusAfterPublish.then().assertThat().statusCode(OK.getStatusCode());
3956+
JsonObject statusAfterPublish = Json.createReader(new StringReader(getStatusAfterPublish.body().asString())).readObject();
3957+
JsonObject dataObject = statusAfterPublish.getJsonObject("data");
3958+
assertFalse(dataObject.containsKey("label"), "Curation label should be empty after publishing");
3959+
3960+
//Cause a new draft version
3961+
String jsonLDTerms = "{\"https://dataverse.org/schema/core#fileTermsOfAccess\":{\"https://dataverse.org/schema/core#dataAccessPlace\":\"Somewhere\"}}";
3962+
Response updateTerms = UtilIT.updateDatasetJsonLDMetadata(datasetId, apiToken, jsonLDTerms, true);
3963+
updateTerms.then().assertThat()
3964+
.statusCode(OK.getStatusCode());
3965+
3966+
// Add a new valid curation label
3967+
Response setNewStatus = UtilIT.setDatasetCurationLabel(datasetId, apiToken, "State 2");
3968+
setNewStatus.then().assertThat().statusCode(OK.getStatusCode());
3969+
3970+
// Verify the label was set
3971+
Response getStatusAfterSet = UtilIT.getDatasetCurationStatus(datasetId, apiToken, false);
3972+
getStatusAfterSet.then().assertThat().statusCode(OK.getStatusCode());
3973+
JsonObject statusAfterSet = Json.createReader(new StringReader(getStatusAfterSet.body().asString())).readObject();
3974+
JsonObject dataInSecondDraft = statusAfterSet.getJsonObject("data");
3975+
assertEquals("State 2", dataInSecondDraft.getString("label"), "Curation label should be set to State 2");
3976+
3977+
// Publish the dataset again using updatecurrent as superuser
3978+
Response updateCurrentResponse = UtilIT.publishDatasetViaNativeApi(datasetId, "updatecurrent", apiToken);
3979+
updateCurrentResponse.then().assertThat().statusCode(OK.getStatusCode());
3980+
3981+
// Verify that the current curation label is now empty after updatecurrent
3982+
Response getStatusAfterUpdateCurrent = UtilIT.getDatasetCurationStatus(datasetId, apiToken, false);
3983+
getStatusAfterUpdateCurrent.then().assertThat().statusCode(OK.getStatusCode());
3984+
JsonObject statusAfterUpdateCurrent = Json.createReader(new StringReader(getStatusAfterUpdateCurrent.body().asString())).readObject();
3985+
JsonObject dataAfterUpdateCurrent = statusAfterUpdateCurrent.getJsonObject("data");
3986+
assertFalse(dataAfterUpdateCurrent.containsKey("label"), "Curation label should be empty after updatecurrent");
3987+
3988+
// Verify that the history contains the previously added label
3989+
Response getHistoryAfterUpdateCurrent = UtilIT.getDatasetCurationStatus(datasetId, apiToken, true);
3990+
getHistoryAfterUpdateCurrent.then().assertThat().statusCode(OK.getStatusCode());
3991+
3992+
// Extract the data array from the response
3993+
JsonObject responseObj = Json.createReader(new StringReader(getHistoryAfterUpdateCurrent.body().asString())).readObject();
3994+
JsonArray historyAfterUpdateCurrent = responseObj.getJsonArray("data");
3995+
3996+
// Verify history contains the State 2 label
3997+
boolean foundState2 = false;
3998+
for (int i = 0; i < historyAfterUpdateCurrent.size(); i++) {
3999+
JsonObject entry = historyAfterUpdateCurrent.getJsonObject(i);
4000+
if (entry.containsKey("label") && "State 2".equals(entry.getString("label"))) {
4001+
foundState2 = true;
4002+
break;
4003+
}
4004+
}
4005+
assertTrue(foundState2, "History should contain the State 2 label after updatecurrent");
4006+
39474007
// Clean up
3948-
Response deleteDatasetResponse = UtilIT.deleteDatasetViaNativeApi(datasetId, apiToken);
4008+
Response deleteDatasetResponse = UtilIT.destroyDataset(datasetId, apiToken);
39494009
assertEquals(200, deleteDatasetResponse.getStatusCode());
39504010

39514011
Response deleteDataverseResponse = UtilIT.deleteDataverse(dataverseAlias, apiToken);

0 commit comments

Comments
 (0)