From b4058a3a4590308757d69e01717dae6b299a84a7 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Tue, 2 Dec 2025 12:14:19 -0500 Subject: [PATCH 1/5] Show history of Access Requests via API --- ...ory-of-access-request-available-via-api.md | 8 ++ doc/sphinx-guides/source/api/dataaccess.rst | 15 ++++ .../edu/harvard/iq/dataverse/DataFile.java | 23 +++++- .../iq/dataverse/FileAccessRequest.java | 17 +++- .../dataverse/ManageFilePermissionsPage.java | 33 +++++++- .../edu/harvard/iq/dataverse/api/Access.java | 28 ++++++- .../iq/dataverse/util/json/JsonPrinter.java | 15 ++++ src/main/java/propertyFiles/Bundle.properties | 4 + .../webapp/permissions-manage-files.xhtml | 14 ++-- .../harvard/iq/dataverse/api/AccessIT.java | 79 ++++++++++++++++++- .../edu/harvard/iq/dataverse/api/UtilIT.java | 26 ++++-- 11 files changed, 236 insertions(+), 26 deletions(-) create mode 100644 doc/release-notes/8013-history-of-access-request-available-via-api.md diff --git a/doc/release-notes/8013-history-of-access-request-available-via-api.md b/doc/release-notes/8013-history-of-access-request-available-via-api.md new file mode 100644 index 00000000000..14ebe52f9f7 --- /dev/null +++ b/doc/release-notes/8013-history-of-access-request-available-via-api.md @@ -0,0 +1,8 @@ +### Feature: Extend List File Access Requests API ### + +Added ability to get access request history via the `/datafile/{id}/listRequests` API. The API returns a list of users/groups where the request for access is waiting for an accept or reject. Already accepted or rejected requests are not returned. + +By adding the flag 'includeHistory=true' all of the requests will be returned. Pagination is also implemented in this feature. Adding a start page parameter and max list size (`&start=0` and `&per_page=20`) can limit the amount of data being returned. + +See https://guides.dataverse.org/en/latest/api/dataaccess.html#list-file-access-requests + diff --git a/doc/sphinx-guides/source/api/dataaccess.rst b/doc/sphinx-guides/source/api/dataaccess.rst index 0782665776d..1fa19d65688 100755 --- a/doc/sphinx-guides/source/api/dataaccess.rst +++ b/doc/sphinx-guides/source/api/dataaccess.rst @@ -406,6 +406,21 @@ A curl example using an ``id``:: curl -H "X-Dataverse-key:$API_TOKEN" -X GET http://$SERVER/api/access/datafile/{id}/listRequests +Query parameters have been added to retrieve the historical list of "created", "granted", and "rejected" requests: + +* `includeHistory` When `true` this will force the return of all requests and not just the "created" ones. +* `start` For pagination, use this to request a specific page. +* `per_page` For pagination, use this to limit the number of items in each paged list. + +.. note:: Pagination is only available when `includeHistory` is `true` + +If requesting a page beyond the last page this API will return a 404 "There are no access requests for this file:..." +If requesting a page before page 0 or requesting the number of items to be 0 or less this API will ignore these parameters and return the entire list. + +A curl example using an ``id``:: + + curl -H "X-Dataverse-key:$API_TOKEN" -X GET http://$SERVER/api/access/datafile/{id}/listRequests?includeHistory=true&start=0&per_page=20 + User Has Requested Access to a File: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 45604a5472b..138df5b49b1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -35,6 +35,7 @@ import jakarta.persistence.*; import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.NotBlank; +import org.apache.commons.compress.utils.Lists; /** * @@ -226,11 +227,25 @@ public String toString() { inverseJoinColumns = @JoinColumn(name = "authenticated_user_id")) private List fileAccessRequesters; - - public List getFileAccessRequests(){ - return fileAccessRequests; + public List getFileAccessRequests() { + return getFileAccessRequests(0, 0); } - + + public List getFileAccessRequests(int numResultsPerPageRequested, int paginationStart) { + if (numResultsPerPageRequested <= 0 || paginationStart < 0) { + return fileAccessRequests; + } else { + int startIndex = paginationStart * numResultsPerPageRequested; + int endIndex = startIndex + numResultsPerPageRequested; + if (startIndex >= fileAccessRequests.size()) { + return List.of(); + } else if (endIndex > fileAccessRequests.size()) { + endIndex = fileAccessRequests.size(); + } + return fileAccessRequests.subList(startIndex, endIndex); + } + } + public List getFileAccessRequests(FileAccessRequest.RequestState state){ return fileAccessRequests.stream().filter(far -> far.getState() == state).collect(Collectors.toList()); } diff --git a/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java b/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java index 43463e0cb91..6f9213f5658 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java @@ -4,6 +4,7 @@ import java.util.Date; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; +import edu.harvard.iq.dataverse.util.BundleUtil; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -143,6 +144,20 @@ public String getStateLabel() { } return null; } + + // For use by UI to allow for internationalization + public String getStateLabelNationalized() { + if(isStateCreated()){ + return BundleUtil.getStringFromBundle("permission.fileAccess.created"); + } + if(isStateGranted()) { + return BundleUtil.getStringFromBundle("permission.fileAccess.granted"); + } + if(isStateRejected()) { + return BundleUtil.getStringFromBundle("permission.fileAccess.rejected"); + } + return null; + } public void setStateCreated() { this.requestState = RequestState.CREATED; @@ -197,4 +212,4 @@ public boolean equals(Object object) { } -} \ No newline at end of file +} diff --git a/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java b/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java index a23b41cb1d1..984d60eb15f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java @@ -116,6 +116,15 @@ public boolean isShowDeleted() { public void setShowDeleted(boolean showDeleted) { this.showDeleted = showDeleted; } + private boolean showHistory = false; + + public boolean isShowHistory() { + return showHistory; + } + + public void setShowHistory(boolean showHistory) { + this.showHistory = showHistory; + } public Dataset getDataset() { return dataset; @@ -143,6 +152,13 @@ public void showDeletedCheckboxChange() { } } + private boolean backingShowHistory = false; + public void showHistoryCheckboxChange() { + if (backingShowHistory != showHistory) { + initMaps(); + backingShowHistory = showHistory; + } + } public String init() { if (dataset.getId() != null) { @@ -199,7 +215,7 @@ private void initMaps() { fileMap.put(file, raList); // populate the file access requests map - for (FileAccessRequest fileAccessRequest : file.getFileAccessRequests(FileAccessRequest.RequestState.CREATED)) { + for (FileAccessRequest fileAccessRequest : !showHistory ? file.getFileAccessRequests(FileAccessRequest.RequestState.CREATED) : file.getFileAccessRequests()) { List fileAccessRequestList = fileAccessRequestMap.get(fileAccessRequest.getRequester()); if (fileAccessRequestList == null) { fileAccessRequestList = new ArrayList<>(); @@ -250,6 +266,21 @@ public String formatAccessRequestTimestamp(List fileAccessReq return Util.getDateTimeFormat().format(date); } + public String getAccessRequestStates(List fileAccessRequests) { + String result = ""; + if (fileAccessRequests != null) { + Map items = fileAccessRequests.stream() + .sorted(Comparator.comparing(FileAccessRequest::getState)) + .collect(Collectors.groupingBy( + FileAccessRequest::getStateLabelNationalized, + Collectors.counting())); + + result = items.entrySet().stream().map(entry -> entry.getKey() + ":" + entry.getValue()) + .collect(Collectors.joining(", ", "[ ", " ]")); + } + return result; + } + private void addFileToRoleAssignee(RoleAssignment assignment, boolean fileDeleted) { RoleAssignee ra = roleAssigneeService.getRoleAssignee(assignment.getAssigneeIdentifier()); List assignments = roleAssigneeMap.get(ra); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Access.java b/src/main/java/edu/harvard/iq/dataverse/api/Access.java index 89a4cd743d7..0c8e8c23e3e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Access.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Access.java @@ -41,6 +41,7 @@ import edu.harvard.iq.dataverse.util.FileUtil; import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.SystemConfig; +import edu.harvard.iq.dataverse.util.json.JsonPrinter; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import java.util.logging.Logger; @@ -62,6 +63,7 @@ import jakarta.json.Json; import java.net.URI; import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; import jakarta.persistence.TypedQuery; import jakarta.ws.rs.GET; @@ -1467,8 +1469,11 @@ public Response requestFileAccess(@Context ContainerRequestContext crc, @PathPar @GET @AuthRequired @Path("/datafile/{id}/listRequests") - public Response listFileAccessRequests(@Context ContainerRequestContext crc, @PathParam("id") String fileToRequestAccessId, @Context HttpHeaders headers) { - + public Response listFileAccessRequests(@Context ContainerRequestContext crc, @PathParam("id") String fileToRequestAccessId, + @QueryParam("includeHistory") boolean includeHistory, + @QueryParam("per_page") final int numResultsPerPageRequested, + @QueryParam("start") final int paginationStart, + @Context HttpHeaders headers) { DataverseRequest dataverseRequest; DataFile dataFile; @@ -1489,7 +1494,8 @@ public Response listFileAccessRequests(@Context ContainerRequestContext crc, @Pa return error(FORBIDDEN, BundleUtil.getStringFromBundle("access.api.rejectAccess.failure.noPermissions")); } - List requests = dataFile.getFileAccessRequests(FileAccessRequest.RequestState.CREATED); + List requests = !includeHistory ? dataFile.getFileAccessRequests(FileAccessRequest.RequestState.CREATED) : + dataFile.getFileAccessRequests(numResultsPerPageRequested, paginationStart); if (requests == null || requests.isEmpty()) { List args = Arrays.asList(dataFile.getDisplayName()); @@ -1499,7 +1505,21 @@ public Response listFileAccessRequests(@Context ContainerRequestContext crc, @Pa JsonArrayBuilder userArray = Json.createArrayBuilder(); for (FileAccessRequest fileAccessRequest : requests) { - userArray.add(json(fileAccessRequest.getRequester())); + userArray.add(json(fileAccessRequest)); + } + + // Check for pagination request + if (includeHistory && numResultsPerPageRequested > 0 && paginationStart >= 0) { + JsonObjectBuilder builder = Json.createObjectBuilder() + .add("status", ApiConstants.STATUS_OK) + .add("data", userArray); + + builder = JsonPrinter.jsonAddPagination(builder, paginationStart, numResultsPerPageRequested, + requests.size(), dataFile.getFileAccessRequests().size()); + + return Response.ok( builder.build() ) + .type(MediaType.APPLICATION_JSON) + .build(); } return ok(userArray); diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 654154c5b64..7c6e827e878 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -146,6 +146,21 @@ public static JsonObjectBuilder json(AuthenticatedUser authenticatedUser) { .add("authenticationProviderId", authenticatedUser.getAuthenticatedUserLookup().getAuthenticationProviderId()); return builder; } + public static JsonObjectBuilder json(FileAccessRequest fileAccessRequest) { + JsonObjectBuilder builder = json(fileAccessRequest.getRequester()) + .add("requestState", fileAccessRequest.getStateLabel()); + return builder; + } + + public static JsonObjectBuilder jsonAddPagination(JsonObjectBuilder objectBuilder, int pageRequested, int numResultsPerPageRequested, int pageCount, int totalCount) { + objectBuilder + .add("selectedPage", pageRequested) + .add("pageCount", pageCount) + .add("totalCount", totalCount) + .add("hasPrevPage", pageRequested > 0) + .add("hasNextPage", pageCount < numResultsPerPageRequested ? false : totalCount > (pageRequested + 1) * pageCount); + return objectBuilder; + } public static JsonArrayBuilder jsonRoleAssignments(List roleAssignments) { JsonArrayBuilder bld = Json.createArrayBuilder(); diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 4f823449118..72fc258584c 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -1252,6 +1252,7 @@ dataverse.permissionsFiles.files.invalidMsg=There are no restricted files in thi dataverse.permissionsFiles.files.requested=Requested Files dataverse.permissionsFiles.files.selected=Selecting {0} of {1} {2} dataverse.permissionsFiles.files.includeDeleted=Include Deleted Files +dataverse.permissionsFiles.files.showHistory=Show Historical Requests dataverse.permissionsFiles.files.draftUnpublished=Draft/Unpublished dataverse.permissionsFiles.viewRemoveDialog.header=File Access dataverse.permissionsFiles.viewRemoveDialog.removeBtn=Remove Access @@ -2753,6 +2754,9 @@ permission.roleNotAbleToBeRemoved=The role assignment was not able to be removed permission.fileAccessGranted=File Access request by {0} was granted. permission.fileAccessRejected=File Access request by {0} was rejected. permission.roleNotAbleToBeAssigned=The role was not able to be assigned. +permission.fileAccess.created=Requested +permission.fileAccess.granted=Granted +permission.fileAccess.rejected=Rejected #ManageGroupsPage.java dataverse.manageGroups.create.success=Successfully created group {0}. Refresh to update your page. diff --git a/src/main/webapp/permissions-manage-files.xhtml b/src/main/webapp/permissions-manage-files.xhtml index cc04af6c022..7c76e281111 100644 --- a/src/main/webapp/permissions-manage-files.xhtml +++ b/src/main/webapp/permissions-manage-files.xhtml @@ -52,6 +52,9 @@ + + +
@@ -88,8 +91,8 @@ rendered="#{manageFilePermissionsPage.formatAccessRequestDate(access.value) == null}" /> -
- + #{bundle['dataverse.permissionsFiles.assignDialog.grantBtn']} - #{bundle['dataverse.permissionsFiles.assignDialog.rejectBtn']} +
@@ -399,13 +403,13 @@ - - diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java index dd8ddd2d315..ea3f796f9dc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java @@ -13,7 +13,6 @@ import java.io.IOException; import java.util.zip.ZipInputStream; -import jakarta.json.Json; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -27,9 +26,8 @@ import org.hamcrest.collection.IsMapContaining; import static jakarta.ws.rs.core.Response.Status.*; +import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; import static org.junit.jupiter.api.Assertions.*; /** @@ -547,6 +545,12 @@ public void testRequestAccess() throws InterruptedException { Response rejectFileAccessResponse = UtilIT.rejectFileAccessRequest(tabFile3IdRestrictedNew.toString(), "@" + apiIdentifierRando, apiToken); assertEquals(200, rejectFileAccessResponse.getStatusCode()); + // including history includes "rejected" + Response listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, Boolean.TRUE); + listAccessRequestWithHistoryResponse.prettyPrint(); + assertEquals(200, listAccessRequestWithHistoryResponse.getStatusCode()); + assertTrue(listAccessRequestWithHistoryResponse.prettyPrint().contains("\"requestState\": \"rejected\"")); + requestFileAccessResponse = UtilIT.requestFileAccess(tabFile3IdRestrictedNew.toString(), apiTokenRando); //grant file access Response grantFileAccessResponse = UtilIT.grantFileAccess(tabFile3IdRestrictedNew.toString(), "@" + apiIdentifierRando, apiToken); @@ -571,6 +575,75 @@ public void testRequestAccess() throws InterruptedException { listAccessRequestResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken); assertEquals(404, listAccessRequestResponse.getStatusCode()); + + // create multiple users and grant some access and reject the others + for (int i=0 ; i <15; i++) { + Response createUserResponse = UtilIT.createRandomUser(); + createUserResponse.prettyPrint(); + assertEquals(200, createUserResponse.getStatusCode()); + String token = UtilIT.getApiTokenFromResponse(createUserResponse); + String apiIdentifier = UtilIT.getUsernameFromResponse(createUserResponse); + Response fileAccessResponse = UtilIT.requestFileAccess(tabFile3IdRestrictedNew.toString(), token); + assertEquals(200, fileAccessResponse.getStatusCode()); + if (i % 2 == 0) { + fileAccessResponse = UtilIT.grantFileAccess(tabFile3IdRestrictedNew.toString(), "@" + apiIdentifier, apiToken); + assertEquals(200, fileAccessResponse.getStatusCode()); + } else { + fileAccessResponse = UtilIT.rejectFileAccessRequest(tabFile3IdRestrictedNew.toString(), "@" + apiIdentifier, apiToken); + assertEquals(200, fileAccessResponse.getStatusCode()); + } + } + + // include full history + listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, Boolean.TRUE); + listAccessRequestWithHistoryResponse.prettyPrint(); + listAccessRequestWithHistoryResponse.then() + .assertThat() + .statusCode(OK.getStatusCode()) + .body("data.size()", equalTo(17)); + + // include paginated history + for (int page = 0; page <= 8; page++) { + // There are 9 pages (0 though 8). The first 8 pages should have 2 entries each. The last page should have 1 entry. (Total 17) + int expectedCount = page < 8 ? 2 : 1; + listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, page, 2); + listAccessRequestWithHistoryResponse.prettyPrint(); + listAccessRequestWithHistoryResponse.then() + .assertThat() + .statusCode(OK.getStatusCode()) + .body("selectedPage", equalTo(page)) + .body("pageCount", equalTo(expectedCount)) + .body("totalCount", equalTo(17)) + .body("hasPrevPage", equalTo(page > 0)) + .body("hasNextPage", equalTo(page < 8)) + .body("data.size()", equalTo(expectedCount)); + } + // Edge cases. + // Return 404 if requesting a page to high. + // Gets the entire list if requesting page = negative index or number of items <= 0 + listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, 99, 2); + listAccessRequestWithHistoryResponse.prettyPrint(); + listAccessRequestWithHistoryResponse.then() + .assertThat() + .statusCode(NOT_FOUND.getStatusCode()); + listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, -1, 2); + listAccessRequestWithHistoryResponse.prettyPrint(); + listAccessRequestWithHistoryResponse.then() + .assertThat() + .statusCode(OK.getStatusCode()) + .body("selectedPage", nullValue()) + .body("pageCount", nullValue()) + .body("totalCount", nullValue()) + .body("data.size()", equalTo(17)); + listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, 0, 0); + listAccessRequestWithHistoryResponse.prettyPrint(); + listAccessRequestWithHistoryResponse.then() + .assertThat() + .statusCode(OK.getStatusCode()) + .body("selectedPage", nullValue()) + .body("pageCount", nullValue()) + .body("totalCount", nullValue()) + .body("data.size()", equalTo(17)); } // This is a round trip test of uploading a zipped archive, with some folder diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 4dcea10cfe6..d685c8fcede 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -2087,19 +2087,29 @@ static Response grantFileAccess(String fileIdOrPersistentId, String identifier, } static Response getAccessRequestList(String fileIdOrPersistentId, String apiToken) { + return getAccessRequestList(fileIdOrPersistentId, apiToken, null); + } + static Response getAccessRequestList(String fileIdOrPersistentId, String apiToken, int pageStart, int pageNumItems) { + return getAccessRequestList(fileIdOrPersistentId, apiToken, Boolean.TRUE, pageStart, pageNumItems); + } + static Response getAccessRequestList(String fileIdOrPersistentId, String apiToken, Boolean includeHistory) { + return getAccessRequestList(fileIdOrPersistentId, apiToken, includeHistory, 0, 0); + } + static Response getAccessRequestList(String fileIdOrPersistentId, String apiToken, Boolean includeHistory, int pageStart, int pageNumItems) { + RequestSpecification requestSpecification = given(); + String idInPath = fileIdOrPersistentId; // Assume it's a number. - String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. if (!NumberUtils.isCreatable(fileIdOrPersistentId)) { idInPath = ":persistentId"; - optionalQueryParam = "?persistentId=" + fileIdOrPersistentId; + requestSpecification.queryParam("persistentId", fileIdOrPersistentId); } - String keySeparator = "&"; - if (optionalQueryParam.isEmpty()) { - keySeparator = "?"; + if (includeHistory != null) { + requestSpecification.queryParam("includeHistory", includeHistory); + requestSpecification.queryParam("start", pageStart); + requestSpecification.queryParam("per_page", pageNumItems); } - Response response = given() - .get("/api/access/datafile/" + idInPath + "/listRequests/" + optionalQueryParam + keySeparator + "key=" + apiToken); - return response; + requestSpecification.queryParam("key", apiToken); + return requestSpecification.get("/api/access/datafile/" + idInPath + "/listRequests"); } static Response rejectFileAccessRequest(String fileIdOrPersistentId, String identifier, String apiToken) { From 5155a1f2b818da16b218ea918a7af67d4f8ea949 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Tue, 2 Dec 2025 16:59:04 -0500 Subject: [PATCH 2/5] ui work --- src/main/java/edu/harvard/iq/dataverse/DataFile.java | 9 +++++++++ .../java/edu/harvard/iq/dataverse/FileAccessRequest.java | 2 +- src/main/webapp/permissions-manage-files.xhtml | 7 ++++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 138df5b49b1..43bbb6be1d3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -843,6 +843,15 @@ public void addFileAccessRequest(FileAccessRequest request) { this.fileAccessRequests.add(request); } + public List getAccessRequestsForAssignee(RoleAssignee roleAssignee) { + if (this.fileAccessRequests == null) { + return null; + } + + return this.fileAccessRequests.stream() + .filter(fileAccessRequest -> fileAccessRequest.getRequester().equals(roleAssignee)).toList(); + } + public FileAccessRequest getAccessRequestForAssignee(RoleAssignee roleAssignee) { if (this.fileAccessRequests == null) { return null; diff --git a/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java b/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java index 6f9213f5658..c918c539c40 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java @@ -147,7 +147,7 @@ public String getStateLabel() { // For use by UI to allow for internationalization public String getStateLabelNationalized() { - if(isStateCreated()){ + if(isStateCreated()) { return BundleUtil.getStringFromBundle("permission.fileAccess.created"); } if(isStateGranted()) { diff --git a/src/main/webapp/permissions-manage-files.xhtml b/src/main/webapp/permissions-manage-files.xhtml index 7c76e281111..301167aecf5 100644 --- a/src/main/webapp/permissions-manage-files.xhtml +++ b/src/main/webapp/permissions-manage-files.xhtml @@ -328,7 +328,7 @@
-

#{bundle['dataverse.permissionsFiles.assignDialog.description']}

+

#{manageFilePermissionsPage.showHistory ? '' : bundle['dataverse.permissionsFiles.assignDialog.description']}