From 40da29bbea9f4f8b70445b42ba0f9f5894227f5c Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Tue, 28 Jul 2026 12:39:53 -0700 Subject: [PATCH 1/2] Move specimen permissions into specimen module --- .../org/labkey/specimen/SpecimenModule.java | 35 ++++++++++++++++++- .../specimen/SpecimenRequestManager.java | 2 +- .../actions/SpecimenApiController.java | 4 +-- .../specimen/actions/SpecimenController.java | 11 +++--- .../specimen/query/SpecimenQueryView.java | 4 +-- .../query/SpecimenRequestQueryView.java | 2 +- .../EditSpecimenDataPermission.java | 15 ++++---- .../ManageRequestSettingsPermission.java | 17 ++++----- .../RequestSpecimensPermission.java | 17 ++++----- .../roles/SpecimenCoordinatorRole.java | 6 ++-- .../security/roles/SpecimenRequesterRole.java | 2 +- .../view/SpecimenToolsWebPartFactory.java | 2 +- .../labkey/specimen/view/manageSpecimens.jsp | 4 +-- .../src/org/labkey/specimen/view/webPart.jsp | 8 ++--- .../specimen/SpecimenMigrationService.java | 7 ++++ .../labkey/study/query/BaseStudyTable.java | 7 ++-- .../org/labkey/study/view/studySummary.jsp | 20 +++++------ 17 files changed, 97 insertions(+), 66 deletions(-) rename {study/api-src/org/labkey/api => specimen/src/org/labkey}/specimen/security/permissions/EditSpecimenDataPermission.java (77%) rename {study/api-src/org/labkey/api => specimen/src/org/labkey}/specimen/security/permissions/ManageRequestSettingsPermission.java (67%) rename {study/api-src/org/labkey/api => specimen/src/org/labkey}/specimen/security/permissions/RequestSpecimensPermission.java (70%) diff --git a/specimen/src/org/labkey/specimen/SpecimenModule.java b/specimen/src/org/labkey/specimen/SpecimenModule.java index e5acfced7d5..268dd59bf6f 100644 --- a/specimen/src/org/labkey/specimen/SpecimenModule.java +++ b/specimen/src/org/labkey/specimen/SpecimenModule.java @@ -42,6 +42,7 @@ import org.labkey.api.query.QueryView; import org.labkey.api.query.UserSchema; import org.labkey.api.security.User; +import org.labkey.api.security.permissions.Permission; import org.labkey.api.security.roles.RoleManager; import org.labkey.api.specimen.SpecimenMigrationService; import org.labkey.api.specimen.SpecimenQuerySchema; @@ -52,10 +53,16 @@ import org.labkey.api.study.Study; import org.labkey.api.study.StudyInternalService; import org.labkey.api.study.StudyService; +import org.labkey.api.study.StudyUrls; import org.labkey.api.study.importer.SimpleStudyImportContext; import org.labkey.api.study.importer.SimpleStudyImporterRegistry; import org.labkey.api.study.writer.SimpleStudyWriterRegistry; import org.labkey.api.usageMetrics.UsageMetricsService; +import org.labkey.api.util.HtmlString; +import org.labkey.api.util.HtmlStringBuilder; +import org.labkey.api.util.LinkBuilder; +import org.labkey.api.util.PageFlowUtil; +import org.labkey.api.util.SafeToRender; import org.labkey.api.util.SystemMaintenance; import org.labkey.api.util.emailTemplate.EmailTemplateService; import org.labkey.api.util.logging.LogHelper; @@ -74,12 +81,14 @@ import org.labkey.specimen.importer.SpecimenSettingsImporter; import org.labkey.specimen.model.SpecimenRequestEventType; import org.labkey.specimen.pipeline.SpecimenPipeline; -import org.labkey.specimen.requirements.SpecimenRequestRequirementProvider; import org.labkey.specimen.query.SpecimenPivotByDerivativeType; import org.labkey.specimen.query.SpecimenPivotByPrimaryType; import org.labkey.specimen.query.SpecimenPivotByRequestingLocation; import org.labkey.specimen.query.SpecimenQueryView; import org.labkey.specimen.query.SpecimenUpdateService; +import org.labkey.specimen.requirements.SpecimenRequestRequirementProvider; +import org.labkey.specimen.security.permissions.EditSpecimenDataPermission; +import org.labkey.specimen.security.permissions.ManageRequestSettingsPermission; import org.labkey.specimen.security.roles.SpecimenCoordinatorRole; import org.labkey.specimen.security.roles.SpecimenRequesterRole; import org.labkey.specimen.settings.RepositorySettings; @@ -234,6 +243,30 @@ public void addSpecimenPivotTableNames(Set names) } return null; } + + @Override + public @NotNull SafeToRender getStudySummaryLink(Container c, User user) + { + // Must have ManageRequestSettingsPermission and requests enabled (otherwise non-admin will see a blank Manage Study page) + if (c.hasPermission(user, ManageRequestSettingsPermission.class) && isEnableRequests(c)) + { + return HtmlStringBuilder.of() + .unsafeAppend("

") + .append(LinkBuilder.labkeyLink( + "Manage Specimen Request Settings", + PageFlowUtil.urlProvider(StudyUrls.class).getManageStudyURL(c) + )) + .unsafeAppend("

"); + } + + return HtmlString.EMPTY_STRING; + } + + @Override + public @NotNull Class getSpecimenEditDataPermission() + { + return EditSpecimenDataPermission.class; + } }); SystemMaintenance.addTask(new QueryBasedSpecimenImportUploadTask()); diff --git a/specimen/src/org/labkey/specimen/SpecimenRequestManager.java b/specimen/src/org/labkey/specimen/SpecimenRequestManager.java index 5107f286e90..0e601503f13 100644 --- a/specimen/src/org/labkey/specimen/SpecimenRequestManager.java +++ b/specimen/src/org/labkey/specimen/SpecimenRequestManager.java @@ -56,7 +56,6 @@ import org.labkey.api.specimen.importer.RollupInstance; import org.labkey.api.specimen.importer.VialSpecimenRollup; import org.labkey.api.specimen.model.SpecimenTablesProvider; -import org.labkey.api.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.api.study.QueryHelper; import org.labkey.api.study.QueryHelper.StudyCacheCollections; import org.labkey.api.study.SpecimenUrls; @@ -74,6 +73,7 @@ import org.labkey.specimen.requirements.SpecimenRequestRequirement; import org.labkey.specimen.requirements.SpecimenRequestRequirementProvider; import org.labkey.specimen.security.permissions.ManageRequestsPermission; +import org.labkey.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.specimen.settings.SettingsManager; import java.io.IOException; diff --git a/specimen/src/org/labkey/specimen/actions/SpecimenApiController.java b/specimen/src/org/labkey/specimen/actions/SpecimenApiController.java index b531e152fab..122ec311dfc 100644 --- a/specimen/src/org/labkey/specimen/actions/SpecimenApiController.java +++ b/specimen/src/org/labkey/specimen/actions/SpecimenApiController.java @@ -33,8 +33,6 @@ import org.labkey.api.specimen.Vial; import org.labkey.api.specimen.location.LocationImpl; import org.labkey.api.specimen.location.LocationManager; -import org.labkey.specimen.model.SpecimenTypeSummary; -import org.labkey.api.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.api.study.StudyUtils; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.NotFoundException; @@ -48,8 +46,10 @@ import org.labkey.specimen.model.AdditiveType; import org.labkey.specimen.model.DerivativeType; import org.labkey.specimen.model.PrimaryType; +import org.labkey.specimen.model.SpecimenTypeSummary; import org.labkey.specimen.requirements.SpecimenRequest; import org.labkey.specimen.security.permissions.ManageRequestsPermission; +import org.labkey.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.specimen.settings.RepositorySettings; import org.labkey.specimen.settings.SettingsManager; import org.springframework.validation.BindException; diff --git a/specimen/src/org/labkey/specimen/actions/SpecimenController.java b/specimen/src/org/labkey/specimen/actions/SpecimenController.java index b489354b83c..f46bc978519 100644 --- a/specimen/src/org/labkey/specimen/actions/SpecimenController.java +++ b/specimen/src/org/labkey/specimen/actions/SpecimenController.java @@ -107,7 +107,6 @@ import org.labkey.api.security.permissions.AdminPermission; import org.labkey.api.security.permissions.ReadPermission; import org.labkey.api.security.permissions.UpdatePermission; -import org.labkey.api.security.roles.ReaderRole; import org.labkey.api.specimen.SpecimenQuerySchema; import org.labkey.api.specimen.SpecimenSchema; import org.labkey.api.specimen.Vial; @@ -115,9 +114,6 @@ import org.labkey.api.specimen.location.LocationManager; import org.labkey.api.specimen.model.SpecimenComment; import org.labkey.api.specimen.model.SpecimenTablesProvider; -import org.labkey.api.specimen.security.permissions.EditSpecimenDataPermission; -import org.labkey.api.specimen.security.permissions.ManageRequestSettingsPermission; -import org.labkey.api.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.api.study.CohortFilter; import org.labkey.api.study.Dataset; import org.labkey.api.study.MapArrayExcelWriter; @@ -171,11 +167,10 @@ import org.labkey.specimen.RequestEventType; import org.labkey.specimen.RequestedSpecimens; import org.labkey.specimen.SpecimenManager; -import org.labkey.specimen.SpecimenRequestException; import org.labkey.specimen.SpecimenModule; +import org.labkey.specimen.SpecimenRequestException; import org.labkey.specimen.SpecimenRequestManager; import org.labkey.specimen.SpecimenRequestStatus; -import org.labkey.specimen.security.roles.SpecimenRequesterRole; import org.labkey.specimen.importer.QueryBasedSpecimenTransform; import org.labkey.specimen.importer.RequestabilityManager; import org.labkey.specimen.importer.SimpleSpecimenImporter; @@ -194,14 +189,18 @@ import org.labkey.specimen.requirements.SpecimenRequestRequirement; import org.labkey.specimen.requirements.SpecimenRequestRequirementProvider; import org.labkey.specimen.requirements.SpecimenRequestRequirementType; +import org.labkey.specimen.security.permissions.EditSpecimenDataPermission; import org.labkey.specimen.security.permissions.ManageDisplaySettingsPermission; import org.labkey.specimen.security.permissions.ManageNewRequestFormPermission; import org.labkey.specimen.security.permissions.ManageNotificationsPermission; import org.labkey.specimen.security.permissions.ManageRequestRequirementsPermission; +import org.labkey.specimen.security.permissions.ManageRequestSettingsPermission; import org.labkey.specimen.security.permissions.ManageRequestStatusesPermission; import org.labkey.specimen.security.permissions.ManageRequestsPermission; import org.labkey.specimen.security.permissions.ManageSpecimenActorsPermission; +import org.labkey.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.specimen.security.permissions.SetSpecimenCommentsPermission; +import org.labkey.specimen.security.roles.SpecimenRequesterRole; import org.labkey.specimen.settings.DisplaySettings; import org.labkey.specimen.settings.RepositorySettings; import org.labkey.specimen.settings.RequestNotificationSettings; diff --git a/specimen/src/org/labkey/specimen/query/SpecimenQueryView.java b/specimen/src/org/labkey/specimen/query/SpecimenQueryView.java index e8970fda687..8e23a2b5145 100644 --- a/specimen/src/org/labkey/specimen/query/SpecimenQueryView.java +++ b/specimen/src/org/labkey/specimen/query/SpecimenQueryView.java @@ -50,8 +50,6 @@ import org.labkey.api.specimen.SpecimenSchema; import org.labkey.api.specimen.Vial; import org.labkey.api.specimen.model.SpecimenTablesProvider; -import org.labkey.api.specimen.security.permissions.EditSpecimenDataPermission; -import org.labkey.api.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.api.study.CohortFilter; import org.labkey.api.study.Study; import org.labkey.api.study.StudyService; @@ -66,6 +64,8 @@ import org.labkey.api.view.ViewContext; import org.labkey.api.writer.HtmlWriter; import org.labkey.specimen.actions.SpecimenController; +import org.labkey.specimen.security.permissions.EditSpecimenDataPermission; +import org.labkey.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.specimen.settings.DisplaySettings; import org.labkey.specimen.settings.RepositorySettings; import org.labkey.specimen.settings.SettingsManager; diff --git a/specimen/src/org/labkey/specimen/query/SpecimenRequestQueryView.java b/specimen/src/org/labkey/specimen/query/SpecimenRequestQueryView.java index cef34526fbd..851d0c9b265 100644 --- a/specimen/src/org/labkey/specimen/query/SpecimenRequestQueryView.java +++ b/specimen/src/org/labkey/specimen/query/SpecimenRequestQueryView.java @@ -29,7 +29,6 @@ import org.labkey.api.query.UserSchema; import org.labkey.api.security.User; import org.labkey.api.specimen.SpecimenQuerySchema; -import org.labkey.api.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.api.study.Study; import org.labkey.api.study.StudyService; import org.labkey.api.study.StudyUtils; @@ -44,6 +43,7 @@ import org.labkey.specimen.actions.SpecimenController.ManageRequestAction; import org.labkey.specimen.actions.SpecimenController.SubmitRequestAction; import org.labkey.specimen.security.permissions.ManageRequestsPermission; +import org.labkey.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.specimen.settings.SettingsManager; import java.util.Set; diff --git a/study/api-src/org/labkey/api/specimen/security/permissions/EditSpecimenDataPermission.java b/specimen/src/org/labkey/specimen/security/permissions/EditSpecimenDataPermission.java similarity index 77% rename from study/api-src/org/labkey/api/specimen/security/permissions/EditSpecimenDataPermission.java rename to specimen/src/org/labkey/specimen/security/permissions/EditSpecimenDataPermission.java index 968d468ba50..cf6ce7323f2 100644 --- a/study/api-src/org/labkey/api/specimen/security/permissions/EditSpecimenDataPermission.java +++ b/specimen/src/org/labkey/specimen/security/permissions/EditSpecimenDataPermission.java @@ -13,20 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.labkey.api.specimen.security.permissions; - +package org.labkey.specimen.security.permissions; import org.labkey.api.security.permissions.AbstractPermission; +import org.labkey.specimen.SpecimenModule; -/** - * User: davebradlee - * Date: 6/10/13 - * Time: 2:53 PM - */ public class EditSpecimenDataPermission extends AbstractPermission { public EditSpecimenDataPermission() { - super("Edit Specimen Data", "Allows editing of specimen data"); + super( + "Edit Specimen Data", + "Allows editing of specimen data", + SpecimenModule.class + ); } } diff --git a/study/api-src/org/labkey/api/specimen/security/permissions/ManageRequestSettingsPermission.java b/specimen/src/org/labkey/specimen/security/permissions/ManageRequestSettingsPermission.java similarity index 67% rename from study/api-src/org/labkey/api/specimen/security/permissions/ManageRequestSettingsPermission.java rename to specimen/src/org/labkey/specimen/security/permissions/ManageRequestSettingsPermission.java index e1106dba199..7354ae5384c 100644 --- a/study/api-src/org/labkey/api/specimen/security/permissions/ManageRequestSettingsPermission.java +++ b/specimen/src/org/labkey/specimen/security/permissions/ManageRequestSettingsPermission.java @@ -13,22 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.labkey.api.specimen.security.permissions; +package org.labkey.specimen.security.permissions; import org.labkey.api.security.permissions.AbstractPermission; -import org.labkey.api.study.StudyService; +import org.labkey.specimen.SpecimenModule; -/* -* User: Dave -* Date: May 18, 2009 -* Time: 12:01:15 PM -*/ public class ManageRequestSettingsPermission extends AbstractPermission { public ManageRequestSettingsPermission() { - super("Manage Specimen Request and Tracking Settings", - "Allows management of specimen request and tracking settings", - StudyService.get().getStudyModuleClass()); // TODO: Switch to SpecimenModule.class + super( + "Manage Specimen Request and Tracking Settings", + "Allows management of specimen request and tracking settings", + SpecimenModule.class + ); } } \ No newline at end of file diff --git a/study/api-src/org/labkey/api/specimen/security/permissions/RequestSpecimensPermission.java b/specimen/src/org/labkey/specimen/security/permissions/RequestSpecimensPermission.java similarity index 70% rename from study/api-src/org/labkey/api/specimen/security/permissions/RequestSpecimensPermission.java rename to specimen/src/org/labkey/specimen/security/permissions/RequestSpecimensPermission.java index 9fa82bd0d2c..3e34fcf3360 100644 --- a/study/api-src/org/labkey/api/specimen/security/permissions/RequestSpecimensPermission.java +++ b/specimen/src/org/labkey/specimen/security/permissions/RequestSpecimensPermission.java @@ -13,22 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.labkey.api.specimen.security.permissions; +package org.labkey.specimen.security.permissions; import org.labkey.api.security.permissions.AbstractPermission; -import org.labkey.api.study.StudyService; +import org.labkey.specimen.SpecimenModule; -/* -* User: Dave -* Date: May 18, 2009 -* Time: 11:43:40 AM -*/ public class RequestSpecimensPermission extends AbstractPermission { public RequestSpecimensPermission() { - super("Request Specimens", - "Allows request of specimens", - StudyService.get().getStudyModuleClass()); // TODO: Switch to SpecimenModule.class + super( + "Request Specimens", + "Allows request of specimens", + SpecimenModule.class + ); } } \ No newline at end of file diff --git a/specimen/src/org/labkey/specimen/security/roles/SpecimenCoordinatorRole.java b/specimen/src/org/labkey/specimen/security/roles/SpecimenCoordinatorRole.java index 1c2d48508c0..77f1b49555c 100644 --- a/specimen/src/org/labkey/specimen/security/roles/SpecimenCoordinatorRole.java +++ b/specimen/src/org/labkey/specimen/security/roles/SpecimenCoordinatorRole.java @@ -17,18 +17,18 @@ import org.jetbrains.annotations.NotNull; import org.labkey.api.security.permissions.EditSharedViewPermission; -import org.labkey.api.specimen.security.permissions.EditSpecimenDataPermission; -import org.labkey.api.specimen.security.permissions.ManageRequestSettingsPermission; -import org.labkey.api.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.api.study.security.permissions.ManageStudyPermission; +import org.labkey.specimen.security.permissions.EditSpecimenDataPermission; import org.labkey.specimen.security.permissions.LockSpecimensPermission; import org.labkey.specimen.security.permissions.ManageDisplaySettingsPermission; import org.labkey.specimen.security.permissions.ManageNewRequestFormPermission; import org.labkey.specimen.security.permissions.ManageNotificationsPermission; import org.labkey.specimen.security.permissions.ManageRequestRequirementsPermission; +import org.labkey.specimen.security.permissions.ManageRequestSettingsPermission; import org.labkey.specimen.security.permissions.ManageRequestStatusesPermission; import org.labkey.specimen.security.permissions.ManageRequestsPermission; import org.labkey.specimen.security.permissions.ManageSpecimenActorsPermission; +import org.labkey.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.specimen.security.permissions.SetSpecimenCommentsPermission; import java.util.Collection; diff --git a/specimen/src/org/labkey/specimen/security/roles/SpecimenRequesterRole.java b/specimen/src/org/labkey/specimen/security/roles/SpecimenRequesterRole.java index c469da2da77..6f6f5d4f660 100644 --- a/specimen/src/org/labkey/specimen/security/roles/SpecimenRequesterRole.java +++ b/specimen/src/org/labkey/specimen/security/roles/SpecimenRequesterRole.java @@ -16,7 +16,7 @@ package org.labkey.specimen.security.roles; import org.jetbrains.annotations.NotNull; -import org.labkey.api.specimen.security.permissions.RequestSpecimensPermission; +import org.labkey.specimen.security.permissions.RequestSpecimensPermission; import java.util.Collection; import java.util.Set; diff --git a/specimen/src/org/labkey/specimen/view/SpecimenToolsWebPartFactory.java b/specimen/src/org/labkey/specimen/view/SpecimenToolsWebPartFactory.java index bed997ca3bc..a0b3a28ad3d 100644 --- a/specimen/src/org/labkey/specimen/view/SpecimenToolsWebPartFactory.java +++ b/specimen/src/org/labkey/specimen/view/SpecimenToolsWebPartFactory.java @@ -15,7 +15,6 @@ */ package org.labkey.specimen.view; -import org.labkey.api.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.api.study.StudyUrls; import org.labkey.api.study.security.permissions.ManageStudyPermission; import org.labkey.api.study.view.StudyToolsWebPart; @@ -27,6 +26,7 @@ import org.labkey.specimen.actions.ShowSearchAction; import org.labkey.specimen.actions.SpecimenController.AutoReportListAction; import org.labkey.specimen.actions.SpecimenController.ShowCreateSpecimenRequestAction; +import org.labkey.specimen.security.permissions.RequestSpecimensPermission; import org.labkey.specimen.settings.SettingsManager; import java.util.ArrayList; diff --git a/specimen/src/org/labkey/specimen/view/manageSpecimens.jsp b/specimen/src/org/labkey/specimen/view/manageSpecimens.jsp index d84696c25b0..278fab27581 100644 --- a/specimen/src/org/labkey/specimen/view/manageSpecimens.jsp +++ b/specimen/src/org/labkey/specimen/view/manageSpecimens.jsp @@ -15,13 +15,12 @@ * limitations under the License. */ %> -<%@ page import="com.google.common.collect.Iterables"%> +<%@ page import="com.google.common.collect.Iterables" %> <%@ page import="org.labkey.api.data.Container" %> <%@ page import="org.labkey.api.exp.property.Domain" %> <%@ page import="org.labkey.api.security.User" %> <%@ page import="org.labkey.api.security.permissions.AdminPermission" %> <%@ page import="org.labkey.api.specimen.model.SpecimenTablesProvider" %> -<%@ page import="org.labkey.api.specimen.security.permissions.ManageRequestSettingsPermission" %> <%@ page import="org.labkey.api.study.SpecimenService" %> <%@ page import="org.labkey.api.study.SpecimenTransform" %> <%@ page import="org.labkey.api.study.Study" %> @@ -41,6 +40,7 @@ <%@ page import="org.labkey.specimen.actions.SpecimenController.ManageSpecimenWebPartAction" %> <%@ page import="org.labkey.specimen.actions.SpecimenController.ManageStatusesAction" %> <%@ page import="org.labkey.specimen.requirements.SpecimenRequestRequirementProvider" %> +<%@ page import="org.labkey.specimen.security.permissions.ManageRequestSettingsPermission" %> <%@ page import="org.labkey.specimen.settings.SettingsManager" %> <%@ page import="java.util.Collection" %> <%@ page extends="org.labkey.api.jsp.JspBase" %> diff --git a/specimen/src/org/labkey/specimen/view/webPart.jsp b/specimen/src/org/labkey/specimen/view/webPart.jsp index e88ba99fd9a..8f2fdaf5f7e 100644 --- a/specimen/src/org/labkey/specimen/view/webPart.jsp +++ b/specimen/src/org/labkey/specimen/view/webPart.jsp @@ -15,10 +15,9 @@ * limitations under the License. */ %> -<%@ page import="org.labkey.api.data.Container"%> -<%@ page import="org.labkey.api.security.User"%> -<%@ page import="org.labkey.api.security.permissions.AdminPermission"%> -<%@ page import="org.labkey.api.specimen.security.permissions.RequestSpecimensPermission"%> +<%@ page import="org.labkey.api.data.Container" %> +<%@ page import="org.labkey.api.security.User" %> +<%@ page import="org.labkey.api.security.permissions.AdminPermission" %> <%@ page import="org.labkey.api.study.StudyUrls" %> <%@ page import="org.labkey.api.util.HtmlString" %> <%@ page import="org.labkey.api.view.ActionURL" %> @@ -29,6 +28,7 @@ <%@ page import="org.labkey.specimen.actions.SpecimenController.AutoReportListAction" %> <%@ page import="org.labkey.specimen.actions.SpecimenController.ShowCreateSpecimenRequestAction" %> <%@ page import="org.labkey.specimen.actions.SpecimenController.ViewRequestsAction" %> +<%@ page import="org.labkey.specimen.security.permissions.RequestSpecimensPermission" %> <%@ page import="org.labkey.specimen.settings.SettingsManager" %> <%@ page import="org.labkey.specimen.view.SpecimenWebPart" %> <%@ page extends="org.labkey.api.jsp.JspBase" %> diff --git a/study/api-src/org/labkey/api/specimen/SpecimenMigrationService.java b/study/api-src/org/labkey/api/specimen/SpecimenMigrationService.java index c0de3046803..08ce82d97f7 100644 --- a/study/api-src/org/labkey/api/specimen/SpecimenMigrationService.java +++ b/study/api-src/org/labkey/api/specimen/SpecimenMigrationService.java @@ -15,6 +15,7 @@ */ package org.labkey.api.specimen; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; @@ -26,9 +27,11 @@ import org.labkey.api.query.QueryView; import org.labkey.api.query.UserSchema; import org.labkey.api.security.User; +import org.labkey.api.security.permissions.Permission; import org.labkey.api.services.ServiceRegistry; import org.labkey.api.study.Study; import org.labkey.api.study.importer.SimpleStudyImportContext; +import org.labkey.api.util.SafeToRender; import org.labkey.api.view.ActionURL; import org.labkey.api.view.ViewContext; import org.labkey.vfs.FileLike; @@ -74,4 +77,8 @@ void importSpecimenArchive(@Nullable FileLike inputFile, PipelineJob job, Simple * Returns a specimen pivot TableInfo, if that's what was requested */ @Nullable TableInfo getSpecimenPivotTable(UserSchema schema, String name, Study study, ContainerFilter cf); + + @NotNull SafeToRender getStudySummaryLink(Container c, User user); + + @NotNull Class getSpecimenEditDataPermission(); } diff --git a/study/src/org/labkey/study/query/BaseStudyTable.java b/study/src/org/labkey/study/query/BaseStudyTable.java index 2410cd4b747..d3e3d3d0faf 100644 --- a/study/src/org/labkey/study/query/BaseStudyTable.java +++ b/study/src/org/labkey/study/query/BaseStudyTable.java @@ -47,8 +47,8 @@ import org.labkey.api.security.roles.ReaderRole; import org.labkey.api.security.roles.Role; import org.labkey.api.security.roles.RoleManager; +import org.labkey.api.specimen.SpecimenMigrationService; import org.labkey.api.specimen.SpecimenSchema; -import org.labkey.api.specimen.security.permissions.EditSpecimenDataPermission; import org.labkey.api.study.Study; import org.labkey.api.study.StudyService; import org.labkey.api.study.TimepointType; @@ -799,8 +799,9 @@ protected boolean checkSpecimenEditPermissions(UserPrincipal user, Class optionalProperties, boolean editable, @Nullable List readOnlyColumnNames) diff --git a/study/src/org/labkey/study/view/studySummary.jsp b/study/src/org/labkey/study/view/studySummary.jsp index 440d8a22c2e..7a76ec0e4cb 100644 --- a/study/src/org/labkey/study/view/studySummary.jsp +++ b/study/src/org/labkey/study/view/studySummary.jsp @@ -15,15 +15,14 @@ * limitations under the License. */ %> -<%@ page import="org.labkey.api.admin.AdminUrls"%> -<%@ page import="org.labkey.api.attachments.Attachment"%> -<%@ page import="org.labkey.api.data.Container"%> +<%@ page import="org.labkey.api.admin.AdminUrls" %> +<%@ page import="org.labkey.api.attachments.Attachment" %> +<%@ page import="org.labkey.api.data.Container" %> <%@ page import="org.labkey.api.pipeline.PipelineService" %> <%@ page import="org.labkey.api.pipeline.PipelineUrls" %> <%@ page import="org.labkey.api.security.User" %> <%@ page import="org.labkey.api.security.permissions.AdminPermission" %> <%@ page import="org.labkey.api.specimen.SpecimenMigrationService" %> -<%@ page import="org.labkey.api.specimen.security.permissions.ManageRequestSettingsPermission" %> <%@ page import="org.labkey.api.util.HtmlString" %> <%@ page import="org.labkey.api.view.ActionURL" %> <%@ page import="org.labkey.api.view.HttpView" %> @@ -148,14 +147,13 @@ %>

<%=link("Manage Files", pipelineUrl)%>

<% } - else if (c.hasPermission(user, ManageRequestSettingsPermission.class) && - SpecimenMigrationService.get().isEnableRequests(getContainer())) + else { - %>

<%=link("Manage Specimen Request Settings", url.setAction(StudyController.ManageStudyAction.class))%>

<% - } - else if (c.hasPermission(user, ManageRequestSettingsPermission.class)) - { - %>

<%=link("Manage Study", url.setAction(StudyController.ManageStudyAction.class))%>

<% + SpecimenMigrationService sms = SpecimenMigrationService.get(); + if (sms != null) + { + %><%=sms.getStudySummaryLink(c, user)%><% + } } %> From 2e1193ef33164a86f43e7c05d1f52d3d0d5f53b2 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Tue, 28 Jul 2026 16:46:37 -0700 Subject: [PATCH 2/2] Claude feedback --- .../src/org/labkey/specimen/SpecimenModule.java | 17 +++++++---------- .../api/specimen/SpecimenMigrationService.java | 4 ++-- .../org/labkey/study/query/BaseStudyTable.java | 2 +- .../src/org/labkey/study/view/studySummary.jsp | 7 ++++++- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/specimen/src/org/labkey/specimen/SpecimenModule.java b/specimen/src/org/labkey/specimen/SpecimenModule.java index 268dd59bf6f..294a7613af8 100644 --- a/specimen/src/org/labkey/specimen/SpecimenModule.java +++ b/specimen/src/org/labkey/specimen/SpecimenModule.java @@ -245,25 +245,22 @@ public void addSpecimenPivotTableNames(Set names) } @Override - public @NotNull SafeToRender getStudySummaryLink(Container c, User user) + public @Nullable SafeToRender getSpecimenSettingsLink(Container c, User user) { // Must have ManageRequestSettingsPermission and requests enabled (otherwise non-admin will see a blank Manage Study page) if (c.hasPermission(user, ManageRequestSettingsPermission.class) && isEnableRequests(c)) { - return HtmlStringBuilder.of() - .unsafeAppend("

") - .append(LinkBuilder.labkeyLink( - "Manage Specimen Request Settings", - PageFlowUtil.urlProvider(StudyUrls.class).getManageStudyURL(c) - )) - .unsafeAppend("

"); + return LinkBuilder.labkeyLink( + "Manage Specimen Request Settings", + PageFlowUtil.urlProvider(StudyUrls.class).getManageStudyURL(c) + ); } - return HtmlString.EMPTY_STRING; + return null; } @Override - public @NotNull Class getSpecimenEditDataPermission() + public @NotNull Class getEditSpecimenDataPermission() { return EditSpecimenDataPermission.class; } diff --git a/study/api-src/org/labkey/api/specimen/SpecimenMigrationService.java b/study/api-src/org/labkey/api/specimen/SpecimenMigrationService.java index 08ce82d97f7..24ffdbe47e6 100644 --- a/study/api-src/org/labkey/api/specimen/SpecimenMigrationService.java +++ b/study/api-src/org/labkey/api/specimen/SpecimenMigrationService.java @@ -78,7 +78,7 @@ void importSpecimenArchive(@Nullable FileLike inputFile, PipelineJob job, Simple */ @Nullable TableInfo getSpecimenPivotTable(UserSchema schema, String name, Study study, ContainerFilter cf); - @NotNull SafeToRender getStudySummaryLink(Container c, User user); + @Nullable SafeToRender getSpecimenSettingsLink(Container c, User user); - @NotNull Class getSpecimenEditDataPermission(); + @NotNull Class getEditSpecimenDataPermission(); } diff --git a/study/src/org/labkey/study/query/BaseStudyTable.java b/study/src/org/labkey/study/query/BaseStudyTable.java index d3e3d3d0faf..4783615c2c1 100644 --- a/study/src/org/labkey/study/query/BaseStudyTable.java +++ b/study/src/org/labkey/study/query/BaseStudyTable.java @@ -801,7 +801,7 @@ protected boolean checkSpecimenEditPermissions(UserPrincipal user, Class optionalProperties, boolean editable, @Nullable List readOnlyColumnNames) diff --git a/study/src/org/labkey/study/view/studySummary.jsp b/study/src/org/labkey/study/view/studySummary.jsp index 7a76ec0e4cb..7e10ec6f9d4 100644 --- a/study/src/org/labkey/study/view/studySummary.jsp +++ b/study/src/org/labkey/study/view/studySummary.jsp @@ -24,6 +24,7 @@ <%@ page import="org.labkey.api.security.permissions.AdminPermission" %> <%@ page import="org.labkey.api.specimen.SpecimenMigrationService" %> <%@ page import="org.labkey.api.util.HtmlString" %> +<%@ page import="org.labkey.api.util.SafeToRender" %> <%@ page import="org.labkey.api.view.ActionURL" %> <%@ page import="org.labkey.api.view.HttpView" %> <%@ page import="org.labkey.api.view.JspView" %> @@ -152,7 +153,11 @@ SpecimenMigrationService sms = SpecimenMigrationService.get(); if (sms != null) { - %><%=sms.getStudySummaryLink(c, user)%><% + SafeToRender link = sms.getSpecimenSettingsLink(c, user); + if (link != null) + { + %>

<%=link%>

<% + } } } %>