diff --git a/api/src/org/labkey/api/exp/DeleteForm.java b/api/src/org/labkey/api/exp/DeleteForm.java index 1cba049350e..c823b65435b 100644 --- a/api/src/org/labkey/api/exp/DeleteForm.java +++ b/api/src/org/labkey/api/exp/DeleteForm.java @@ -36,6 +36,28 @@ public class DeleteForm extends ProtocolIdForm implements DataRegionSelection.Da private Long _singleObjectRowId; private List _rowIds; private String _userComment; + private String _editMethod; + private String _requestSource; + + public String getRequestSource() + { + return _requestSource; + } + + public void setRequestSource(String requestSource) + { + _requestSource = requestSource; + } + + public String getEditMethod() + { + return _editMethod; + } + + public void setEditMethod(String editMethod) + { + _editMethod = editMethod; + } public void setUserComment(String userComment) { diff --git a/api/src/org/labkey/api/exp/api/ExperimentService.java b/api/src/org/labkey/api/exp/api/ExperimentService.java index f1ca905d090..a32fffb5f08 100644 --- a/api/src/org/labkey/api/exp/api/ExperimentService.java +++ b/api/src/org/labkey/api/exp/api/ExperimentService.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.labkey.api.assay.AssayProvider; +import org.labkey.api.audit.TransactionAuditProvider; import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; @@ -821,7 +822,7 @@ static void validateParentAlias(Map aliasMap, Set reserv void deleteExperimentRunsByRowIds(Container container, final User user, long... runRowIds); - void deleteExperimentRunsByRowIds(Container container, final User user, @Nullable String userComment, @NotNull Collection runRowIds); + void deleteExperimentRunsByRowIds(Container container, final User user, @Nullable String userComment, @NotNull Collection runRowIds, @Nullable Map transactionDetails); void deleteExpExperimentByRowId(Container container, User user, long experimentId); diff --git a/experiment/src/org/labkey/experiment/api/ExpRunImpl.java b/experiment/src/org/labkey/experiment/api/ExpRunImpl.java index 487e579377f..73ac80aecae 100644 --- a/experiment/src/org/labkey/experiment/api/ExpRunImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExpRunImpl.java @@ -337,7 +337,7 @@ public void delete(User user, @Nullable final String auditUserComment) { throw new UnauthorizedException(); } - ExperimentServiceImpl.get().deleteExperimentRuns(getContainer(), user, auditUserComment, Arrays.asList(this)); + ExperimentServiceImpl.get().deleteExperimentRuns(getContainer(), user, auditUserComment, Arrays.asList(this), null); } @Override diff --git a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java index 16128c1d2cb..e3bc1bbb24b 100644 --- a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java @@ -4201,22 +4201,28 @@ public Lsid getDataClassLsid(Container container) @Override public void deleteExperimentRunsByRowIds(Container container, final User user, long... runRowIds) { - deleteExperimentRunsByRowIds(container, user, null, Arrays.stream(runRowIds).boxed().toList()); + deleteExperimentRunsByRowIds(container, user, null, Arrays.stream(runRowIds).boxed().toList(), null); } @Override - public void deleteExperimentRunsByRowIds(Container container, final User user, @Nullable final String userComment, @NotNull Collection runRowIds) + public void deleteExperimentRunsByRowIds(Container container, final User user, @Nullable final String userComment, @NotNull Collection runRowIds, @Nullable Map transactionDetails) { - deleteExperimentRuns(container, user, userComment, getExpRuns(runRowIds)); + deleteExperimentRuns(container, user, userComment, getExpRuns(runRowIds), transactionDetails); } - public void deleteExperimentRuns(Container container, final User user, @Nullable final String userComment, @NotNull Collection runs) + public void deleteExperimentRuns(Container container, final User user, @Nullable final String userComment, @NotNull Collection runs, @Nullable Map transactionDetails) { if (runs.isEmpty()) return; try (DbScope.Transaction transaction = ensureTransaction()) { + if (transaction.getAuditEvent() == null) + { + TransactionAuditProvider.TransactionAuditEvent auditEvent = AbstractQueryUpdateService.createTransactionAuditEvent(container, QueryService.AuditAction.DELETE, transactionDetails); + AbstractQueryUpdateService.addTransactionAuditEvent(transaction, user, auditEvent); + } + AssayService assayService = AssayService.get(); // This can be slightly expensive to fetch, so don't do it multiple times if runs share protocols Map protocolImpls = new HashMap<>(); @@ -5096,13 +5102,13 @@ private void deleteRunsUsingInputs(User user, Collection dataItems, Collec if (containers.size() == 1) { Container runContainer = containers.iterator().next(); - deleteExperimentRuns(runContainer, user, null, runsToDelete); + deleteExperimentRuns(runContainer, user, null, runsToDelete, null); } else { // the slow way for (ExpRunImpl run : runsToDelete) - deleteExperimentRuns(run.getContainer(), user, null, Collections.singleton(run)); + deleteExperimentRuns(run.getContainer(), user, null, Collections.singleton(run), null); } } diff --git a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java index 945b103cf84..09ab704bce0 100644 --- a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java +++ b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java @@ -3465,7 +3465,7 @@ public ModelAndView getView(DeleteForm deleteForm, boolean reshow, BindException @Override protected void deleteObjects(DeleteForm deleteForm) { - ExperimentServiceImpl.get().deleteExperimentRunsByRowIds(getContainer(), getUser(), deleteForm.getUserComment(), deleteForm.getIds(false)); + ExperimentServiceImpl.get().deleteExperimentRunsByRowIds(getContainer(), getUser(), deleteForm.getUserComment(), deleteForm.getIds(false), getTransactionAuditDetails()); } } @@ -3530,7 +3530,12 @@ protected ApiSimpleResponse deleteObjects(CascadeDeleteForm form) runIdsToDelete.addAll(runIdsCascadeDeleted); } - ExperimentService.get().deleteExperimentRunsByRowIds(getContainer(), getUser(), form.getUserComment(), runIdsToDelete); + Map transactionAuditDetails = getTransactionAuditDetails(); + if (form.getRequestSource() != null) + transactionAuditDetails.put(TransactionAuditProvider.TransactionDetail.RequestSource, form.getRequestSource()); + if (form.getEditMethod() != null) + transactionAuditDetails.put(TransactionAuditProvider.TransactionDetail.EditMethod, form.getEditMethod()); + ExperimentService.get().deleteExperimentRunsByRowIds(getContainer(), getUser(), form.getUserComment(), runIdsToDelete, transactionAuditDetails); ApiSimpleResponse response = new ApiSimpleResponse("success", true); response.put("runIdsDeleted", runIdsToDelete);