diff --git a/announcements/src/org/labkey/announcements/api/AnnouncementServiceImpl.java b/announcements/src/org/labkey/announcements/api/AnnouncementServiceImpl.java index 4196d1f0002..07b5e5ebad9 100644 --- a/announcements/src/org/labkey/announcements/api/AnnouncementServiceImpl.java +++ b/announcements/src/org/labkey/announcements/api/AnnouncementServiceImpl.java @@ -213,7 +213,7 @@ public Announcement updateAnnouncement(int RowId, Container c, User u, String ti } @Override - public int updateContainer(List discussionSrcIds, Container targetContainer, User u) + public Map updateContainer(List discussionSrcIds, Container targetContainer, User u) { return AnnouncementManager.updateContainer(discussionSrcIds, targetContainer, u); } diff --git a/announcements/src/org/labkey/announcements/model/AnnouncementManager.java b/announcements/src/org/labkey/announcements/model/AnnouncementManager.java index 28b20cb1b58..1d5e146c090 100644 --- a/announcements/src/org/labkey/announcements/model/AnnouncementManager.java +++ b/announcements/src/org/labkey/announcements/model/AnnouncementManager.java @@ -685,9 +685,15 @@ public static AnnouncementModel updateAnnouncement(User user, AnnouncementModel return result; } - public static int updateContainer(List discussionSrcIds, Container targetContainer, User user) + public static Map updateContainer(List discussionSrcIds, Container targetContainer, User user) { - return Table.updateContainer(_comm.getTableInfoAnnouncements(), "discussionSrcIdentifier", discussionSrcIds, targetContainer, user, false); + // move the attachments associated with the comments + SimpleFilter filter = new SimpleFilter(FieldKey.fromParts("discussionSrcIdentifier"), discussionSrcIds, CompareType.IN); + TableSelector selector = new TableSelector(_comm.getTableInfoAnnouncements(), Collections.singleton("entityId"), filter, null); + Map updateCounts = new HashMap<>(); + updateCounts.put("attachments", Table.updateContainer(_core.getTableInfoDocuments(), "parent", selector.getArrayList(String.class), targetContainer, user, false)); + updateCounts.put("announcements", Table.updateContainer(_comm.getTableInfoAnnouncements(), "discussionSrcIdentifier", discussionSrcIds, targetContainer, user, false)); + return updateCounts; } diff --git a/api/src/org/labkey/api/announcements/api/AnnouncementService.java b/api/src/org/labkey/api/announcements/api/AnnouncementService.java index 7d517322389..039fdad7e46 100644 --- a/api/src/org/labkey/api/announcements/api/AnnouncementService.java +++ b/api/src/org/labkey/api/announcements/api/AnnouncementService.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.List; +import java.util.Map; public interface AnnouncementService { @@ -61,8 +62,8 @@ Announcement insertAnnouncement(Container container, User u, String title, Strin // Update Announcement updateAnnouncement(int RowId, Container c, User u, String title, String body); - // move announcements to the given target container - int updateContainer(List discussionSrcIds, Container targetContainer, User u); + // move announcements and their attachments to the given target container + Map updateContainer(List discussionSrcIds, Container targetContainer, User u); // Delete void deleteAnnouncement(Announcement announcement); diff --git a/api/src/org/labkey/api/data/ContainerManager.java b/api/src/org/labkey/api/data/ContainerManager.java index d3afeddd020..8ad9432e469 100644 --- a/api/src/org/labkey/api/data/ContainerManager.java +++ b/api/src/org/labkey/api/data/ContainerManager.java @@ -77,6 +77,7 @@ import org.labkey.api.security.permissions.InsertPermission; import org.labkey.api.security.permissions.Permission; import org.labkey.api.security.permissions.ReadPermission; +import org.labkey.api.security.permissions.SampleWorkflowJobPermission; import org.labkey.api.security.roles.AuthorRole; import org.labkey.api.security.roles.ReaderRole; import org.labkey.api.security.roles.Role; @@ -2605,7 +2606,7 @@ private static Container getForPathAlias(String path) return ret.length == 0 ? null : ret[0]; } - public static Container getMoveTargetContainer(@Nullable String queryName, @NotNull Container sourceContainer, User user, @Nullable String targetIdOrPath, Errors errors) + public static Container getMoveTargetContainer(String schemaName, @Nullable String queryName, @NotNull Container sourceContainer, User user, @Nullable String targetIdOrPath, Errors errors) { if (targetIdOrPath == null) { @@ -2620,11 +2621,13 @@ public static Container getMoveTargetContainer(@Nullable String queryName, @NotN return null; } - if (!_targetContainer.hasPermission(user, InsertPermission.class)) + Class permClass = InsertPermission.class; + if (schemaName != null && schemaName.equalsIgnoreCase("workflow") && queryName != null && queryName.equalsIgnoreCase("job")) + permClass = SampleWorkflowJobPermission.class; + if (!_targetContainer.hasPermission(user, permClass)) { String _queryName = queryName == null ? "this table" : "'" + queryName + "'"; - errors.reject(ERROR_GENERIC, "You do not have permission to move rows from " + _queryName + " to the target container: " + targetIdOrPath + "."); - return null; + throw new UnauthorizedException("You do not have permission to move rows from " + _queryName + " to the target container: " + targetIdOrPath + "."); } if (!isValidTargetContainer(sourceContainer, _targetContainer)) diff --git a/api/src/org/labkey/api/exp/OntologyManager.java b/api/src/org/labkey/api/exp/OntologyManager.java index b30147543c8..4a5dae595da 100644 --- a/api/src/org/labkey/api/exp/OntologyManager.java +++ b/api/src/org/labkey/api/exp/OntologyManager.java @@ -928,7 +928,12 @@ public static void updateObjectPropertyOrder(User user, Container container, Str */ public static int updateContainer(Container targetContainer, User user, @NotNull String objectLSID) { - return Table.updateContainer(getTinfoObject(), "objectURI", List.of(objectLSID), targetContainer, user, false); + return updateContainer(targetContainer, user, List.of(objectLSID)); + } + + public static int updateContainer(Container targetContainer, User user, @NotNull List objectLSIDs) + { + return Table.updateContainer(getTinfoObject(), "objectURI", objectLSIDs, targetContainer, user, false); } /** diff --git a/query/src/org/labkey/query/controllers/QueryController.java b/query/src/org/labkey/query/controllers/QueryController.java index da1f6703863..a25d7f875f7 100644 --- a/query/src/org/labkey/query/controllers/QueryController.java +++ b/query/src/org/labkey/query/controllers/QueryController.java @@ -4968,7 +4968,8 @@ public void validateForm(MoveRowsForm form, Errors errors) else { String queryName = json.optString(PROP_QUERY_NAME, null); - _targetContainer = ContainerManager.getMoveTargetContainer(queryName, getContainer(), getUser(), getTargetContainerProp(), errors); + String schemaName = json.optString(PROP_SCHEMA_NAME, null); + _targetContainer = ContainerManager.getMoveTargetContainer(schemaName, queryName, getContainer(), getUser(), getTargetContainerProp(), errors); } } }