Skip to content

Commit c4f3d76

Browse files
authored
Merge pull request #11354 from IQSS/11323-includeDeaccesioned-compare-ds-versions
11323 include deaccessioned versions in summary of compare dataset versions
2 parents feb1c02 + 0d324a9 commit c4f3d76

File tree

5 files changed

+83
-4
lines changed

5 files changed

+83
-4
lines changed

doc/sphinx-guides/source/api/native-api.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2016,6 +2016,17 @@ The fully expanded example above (without environment variables) looks like this
20162016
20172017
curl "https://demo.dataverse.org/api/datasets/24/versions/:latest-published/compare/:draft"
20182018
2019+
By default, deaccessioned dataset versions are not included in the search when applying the :latest or :latest-published identifiers. Additionally, when filtering by a specific version tag, you will get a "not found" error if the version is deaccessioned and you do not enable the ``includeDeaccessioned`` option described below.
2020+
2021+
If you want to include deaccessioned dataset versions, you must set ``includeDeaccessioned`` query parameter to ``true``.
2022+
2023+
Usage example:
2024+
2025+
.. code-block:: bash
2026+
2027+
curl "https://demo.dataverse.org/api/datasets/24/versions/:latest-published/compare/:draft?includeDeaccessioned=true"
2028+
2029+
20192030
Get Versions of a Dataset with Summary of Changes
20202031
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20212032

src/main/java/edu/harvard/iq/dataverse/DatasetVersionDifference.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1781,10 +1781,12 @@ public JsonObjectBuilder compareVersionsAsJson() {
17811781
JsonObjectBuilder job = new NullSafeJsonBuilder();
17821782
JsonObjectBuilder jobVersion = new NullSafeJsonBuilder();
17831783
jobVersion.add("versionNumber", originalVersion.getFriendlyVersionNumber());
1784+
jobVersion.add("versionState", originalVersion.getVersionState().name());
17841785
jobVersion.add("lastUpdatedDate", new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(originalVersion.getLastUpdateTime()));
17851786
job.add("oldVersion", jobVersion);
17861787
jobVersion = new NullSafeJsonBuilder();
17871788
jobVersion.add("versionNumber", newVersion.getFriendlyVersionNumber());
1789+
jobVersion.add("versionState", newVersion.getVersionState().name());
17881790
jobVersion.add("lastUpdatedDate", new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(newVersion.getLastUpdateTime()));
17891791
job.add("newVersion", jobVersion);
17901792

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2950,11 +2950,12 @@ public Response cleanStorage(@Context ContainerRequestContext crc, @PathParam("i
29502950
public Response getCompareVersions(@Context ContainerRequestContext crc, @PathParam("id") String id,
29512951
@PathParam("versionId1") String versionId1,
29522952
@PathParam("versionId2") String versionId2,
2953+
@QueryParam("includeDeaccessioned") boolean includeDeaccessioned,
29532954
@Context UriInfo uriInfo, @Context HttpHeaders headers) {
29542955
try {
29552956
DataverseRequest req = createDataverseRequest(getRequestUser(crc));
2956-
DatasetVersion dsv1 = getDatasetVersionOrDie(req, versionId1, findDatasetOrDie(id), uriInfo, headers);
2957-
DatasetVersion dsv2 = getDatasetVersionOrDie(req, versionId2, findDatasetOrDie(id), uriInfo, headers);
2957+
DatasetVersion dsv1 = getDatasetVersionOrDie(req, versionId1, findDatasetOrDie(id), uriInfo, headers, includeDeaccessioned);
2958+
DatasetVersion dsv2 = getDatasetVersionOrDie(req, versionId2, findDatasetOrDie(id), uriInfo, headers, includeDeaccessioned);
29582959
if (dsv1.getCreateTime().getTime() > dsv2.getCreateTime().getTime()) {
29592960
return error(BAD_REQUEST, BundleUtil.getStringFromBundle("dataset.version.compare.incorrect.order"));
29602961
}
@@ -2977,7 +2978,7 @@ public Response getCompareVersionsSummary(@Context ContainerRequestContext crc,
29772978
for (DatasetVersion dv : dataset.getVersions()) {
29782979
//only get summaries of draft is user may view unpublished
29792980

2980-
if (dv.isPublished() || permissionService.hasPermissionsFor(user, dv.getDataset(),
2981+
if (dv.isPublished() ||dv.isDeaccessioned() || permissionService.hasPermissionsFor(user, dv.getDataset(),
29812982
EnumSet.of(Permission.ViewUnpublishedDataset))) {
29822983

29832984
JsonObjectBuilder versionBuilder = new NullSafeJsonBuilder();
@@ -3002,7 +3003,7 @@ public Response getCompareVersionsSummary(@Context ContainerRequestContext crc,
30023003
}
30033004
}
30043005
if (dv.isDeaccessioned()) {
3005-
versionBuilder.add("summary", "versionDeaccessioned");
3006+
versionBuilder.add("summary", getDeaccessionJson(dv));
30063007
}
30073008

30083009
} else {
@@ -3019,6 +3020,25 @@ public Response getCompareVersionsSummary(@Context ContainerRequestContext crc,
30193020
return wr.getResponse();
30203021
}
30213022
}
3023+
3024+
private JsonObject getDeaccessionJson(DatasetVersion dv) {
3025+
3026+
JsonObjectBuilder compositionBuilder = Json.createObjectBuilder();
3027+
3028+
if (dv.getDeaccessionNote() != null && !dv.getDeaccessionNote().isEmpty()) {
3029+
compositionBuilder.add("reason", dv.getDeaccessionNote());
3030+
}
3031+
3032+
if (dv.getDeaccessionLink() != null && !dv.getDeaccessionLink().isEmpty()) {
3033+
compositionBuilder.add("url", dv.getDeaccessionLink());
3034+
}
3035+
3036+
JsonObject json = Json.createObjectBuilder()
3037+
.add("deaccessioned", compositionBuilder)
3038+
.build();
3039+
3040+
return json;
3041+
}
30223042

30233043
private static Set<String> getDatasetFilenames(Dataset dataset) {
30243044
Set<String> files = new HashSet<>();

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5734,7 +5734,9 @@ public void testCompareDatasetVersionsAPI() throws InterruptedException {
57345734
compareResponse.prettyPrint();
57355735
compareResponse.then().assertThat()
57365736
.body("data.oldVersion.versionNumber", CoreMatchers.equalTo("1.0"))
5737+
.body("data.oldVersion.versionState", CoreMatchers.equalTo("RELEASED"))
57375738
.body("data.newVersion.versionNumber", CoreMatchers.equalTo("DRAFT"))
5739+
.body("data.newVersion.versionState", CoreMatchers.equalTo("DRAFT"))
57385740
.body("data.metadataChanges[0].blockName", CoreMatchers.equalTo("Citation Metadata"))
57395741
.body("data.metadataChanges[0].changed[0].fieldName", CoreMatchers.equalTo("Author"))
57405742
.body("data.metadataChanges[0].changed[0].oldValue", CoreMatchers.containsString("Finch, Fiona; (Birds Inc.)"))
@@ -5760,6 +5762,21 @@ public void testCompareDatasetVersionsAPI() throws InterruptedException {
57605762
compareResponse.then().assertThat()
57615763
.body("message", CoreMatchers.equalTo(BundleUtil.getStringFromBundle("dataset.version.compare.incorrect.order")))
57625764
.statusCode(BAD_REQUEST.getStatusCode());
5765+
5766+
5767+
Response deaccessionDatasetResponse = UtilIT.deaccessionDataset(datasetId, DS_VERSION_LATEST_PUBLISHED, "Test deaccession reason.", null, apiToken);
5768+
deaccessionDatasetResponse.then().assertThat().statusCode(OK.getStatusCode());
5769+
5770+
compareResponse = UtilIT.compareDatasetVersions(datasetPersistentId, ":latest-published", ":draft", apiToken, false);
5771+
compareResponse.prettyPrint();
5772+
compareResponse.then().assertThat().statusCode(NOT_FOUND.getStatusCode());
5773+
5774+
compareResponse = UtilIT.compareDatasetVersions(datasetPersistentId, ":latest-published", ":draft", apiToken, true);
5775+
compareResponse.prettyPrint();
5776+
compareResponse.then().assertThat().statusCode(OK.getStatusCode());
5777+
5778+
5779+
57635780
}
57645781

57655782
@Test
@@ -5892,6 +5909,21 @@ public void testSummaryDatasetVersionsDifferencesAPI() throws InterruptedExcepti
58925909
.body("data[0].versionNumber", CoreMatchers.equalTo("1.0"))
58935910
.body("data[0].summary", CoreMatchers.equalTo("firstPublished"))
58945911
.statusCode(OK.getStatusCode());
5912+
5913+
Response deaccessionDatasetResponse = UtilIT.deaccessionDataset(datasetId, DS_VERSION_LATEST_PUBLISHED, "Test deaccession reason.", null, apiToken);
5914+
deaccessionDatasetResponse.then().assertThat().statusCode(OK.getStatusCode());
5915+
5916+
compareResponse = UtilIT.summaryDatasetVersionDifferences(datasetPersistentId, apiToken);
5917+
compareResponse.prettyPrint();
5918+
5919+
compareResponse.then().assertThat()
5920+
.body("data[1].versionNumber", equalTo("1.0"))
5921+
.body("data[1].summary.deaccessioned.reason", equalTo("Test deaccession reason."))
5922+
.body("data[0].versionNumber", equalTo("DRAFT"))
5923+
.body("data[0].summary.", equalTo("previousVersionDeaccessioned"))
5924+
.statusCode(OK.getStatusCode());
5925+
5926+
58955927
}
58965928

58975929
@Test

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,6 +1712,20 @@ static Response compareDatasetVersions(String persistentId, String versionNumber
17121712
+ "?persistentId="
17131713
+ persistentId);
17141714
}
1715+
1716+
static Response compareDatasetVersions(String persistentId, String versionNumber1, String versionNumber2, String apiToken, boolean includeDeaccessioned) {
1717+
return given()
1718+
.header(API_TOKEN_HTTP_HEADER, apiToken)
1719+
.get("/api/datasets/:persistentId/versions/"
1720+
+ versionNumber1
1721+
+ "/compare/"
1722+
+ versionNumber2
1723+
+ "?persistentId="
1724+
+ persistentId
1725+
+ "&includeDeaccessioned="
1726+
+ includeDeaccessioned);
1727+
}
1728+
17151729
static Response summaryDatasetVersionDifferences(String persistentId, String apiToken) {
17161730
return given()
17171731
.header(API_TOKEN_HTTP_HEADER, apiToken)

0 commit comments

Comments
 (0)