Skip to content

Commit 0e2a7b6

Browse files
committed
Merge branch 'develop' into 12354-timezone-bug
2 parents 0d5883d + a07a2f8 commit 0e2a7b6

17 files changed

Lines changed: 195 additions & 45 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
All API endpoints that return information about role assignments (such as `/api/dataverses/$ID/assignments`) now include additional fields in their JSON responses: `assigneeName`, `roleDescription`, `definitionPointName`, `definitionPointType`, and `definitionPointGlobalId` (if available).
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
## Bug: Publish and Submit for review must contain files
2+
When `requireFilesToPublishDataset` is set on a Dataverse a Dataset must contain files to be published or submitted for review. This fix make sure the dataset version contains files, and not just the dataset. It also adds this check to the `Submit for Review` functionality.

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ This API changelog is experimental and we would love feedback on its usefulness.
1010
v6.11
1111
-----
1212

13+
- The following API will now return ``403`` if the ``requireFilesToPublishDataset`` flag is set and the dataset version contains 0 files.
14+
15+
- **/api/datasets/{Id}/submitForReview**
16+
1317
- The Croissant :ref:`metadata export format <metadata-export-formats>` has been updated from version 1.0 to 1.1, which is reflected in the ``conformsTo`` property. The unused ``wd`` property has been dropped.
1418

1519
v6.10

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1299,7 +1299,7 @@ The following attributes are supported:
12991299
* ``description`` Description
13001300
* ``affiliation`` Affiliation
13011301
* ``filePIDsEnabled`` ("true" or "false") Restricted to use by superusers and only when the :ref:`:AllowEnablingFilePIDsPerCollection <:AllowEnablingFilePIDsPerCollection>` setting is true. Enables or disables registration of file-level PIDs in datasets within the collection (overriding the instance-wide setting).
1302-
* ``requireFilesToPublishDataset`` ("true" or "false") Restricted to use by superusers. Defines if Dataset needs files in order to be published. If not set the determination will be made through inheritance by checking the owners of this collection. Publishing by a superusers will not be blocked.
1302+
* ``requireFilesToPublishDataset`` ("true" or "false") Restricted to use by superusers. Defines if Dataset version needs files in order to be published or submitted for review. If not set the determination will be made through inheritance by checking the owners of this collection. Publishing by a superusers will not be blocked.
13031303
* ``allowedDatasetTypes`` Restricted to use by superusers. By default "dataset" is implied. Pass a comma-separated list of dataset types (e.g. "dataset,software"). You cannot unset this attribute so if you want to delete a dataset type, set ``allowedDatasetTypes`` to a dataset type you won't be deleting. See also :ref:`dataset-types`.
13041304

13051305
See also :ref:`update-dataverse-api`.

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,18 @@ public String getReminderString(Dataset dataset, boolean canPublishDataset, bool
835835

836836
String reminderString;
837837

838+
if (dataset.getOwner().getEffectiveRequiresFilesToPublishDataset()) {
839+
List<FileMetadata> files = dataset.getLatestVersion().getFileMetadatas();
840+
if (files.size() < 1) {
841+
if (canPublishDataset) {
842+
reminderString = BundleUtil.getStringFromBundle("dataset.mayNotPublish.FilesRequired");
843+
} else {
844+
reminderString = BundleUtil.getStringFromBundle("dataset.mayNotSubmitForReview.FilesRequired");
845+
}
846+
return reminderString;
847+
}
848+
}
849+
838850
if (canPublishDataset) {
839851
reminderString = BundleUtil.getStringFromBundle("dataset.message.publish.warning");
840852
} else {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ public String visit(DataFile df) {
140140

141141
@Column(insertable = false, updatable = false) private String dtype;
142142

143+
public String getDtype() {
144+
return dtype;
145+
}
146+
143147
@OneToMany(mappedBy="dvobject",fetch = FetchType.LAZY,cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
144148
private List<DataverseFeaturedItem> dataverseFeaturedItems;
145149

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

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
1313
import edu.harvard.iq.dataverse.engine.command.impl.*;
1414
import java.util.HashMap;
15+
import java.util.List;
1516
import java.util.Map;
1617
import java.util.logging.Logger;
1718
import jakarta.ejb.EJB;
@@ -253,9 +254,38 @@ public boolean canIssueDeleteDatasetCommand(DvObject dvo){
253254

254255
// PUBLISH DATASET
255256
public boolean canIssuePublishDatasetCommand(DvObject dvo){
257+
User u = session.getUser();
258+
if (u != null && u.isSuperuser()) {
259+
return true;
260+
}
261+
// Return false if dataset has 0 files and user want to 'publish' or 'submit for review' and 'publish dataset requires files' flag is set
262+
if (dvo.isInstanceofDataset()) {
263+
Dataverse dv =((Dataset)dvo).getOwner();
264+
if (dv != null) {
265+
List<FileMetadata> metadataList = ((Dataset) dvo).getLatestVersion().getFileMetadatas();
266+
if (metadataList.size() == 0 && dv.getEffectiveRequiresFilesToPublishDataset()) {
267+
return false;
268+
}
269+
}
270+
}
256271
return canIssueCommand(dvo, PublishDatasetCommand.class);
257272
}
258-
273+
274+
// SUBMIT DATASET FOR REVIEW
275+
public boolean canIssueSubmitDatasetForReviewCommand(DvObject dvo){
276+
// Return false if dataset has 0 files and user want to 'publish' or 'submit for review' and 'publish dataset requires files' flag is set
277+
if (dvo.isInstanceofDataset()) {
278+
Dataverse dv =((Dataset)dvo).getOwner();
279+
if (dv != null) {
280+
List<FileMetadata> metadataList = ((Dataset) dvo).getLatestVersion().getFileMetadatas();
281+
if (metadataList.size() == 0 && dv.getEffectiveRequiresFilesToPublishDataset()) {
282+
return false;
283+
}
284+
}
285+
}
286+
return canIssueCommand(dvo, SubmitDatasetForReviewCommand.class);
287+
}
288+
259289
// For the dataverse_header fragment (and therefore, most of the pages),
260290
// we need to know if authenticated users can add dataverses and datasets to the
261291
// root collection. For the "Add Data" menu further in the search include fragment

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommand.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,4 +315,14 @@ protected void registerExternalVocabValuesIfAny(CommandContext ctxt, DatasetVers
315315
}
316316
}
317317
}
318+
319+
// To block Publishing dataset or Submitting dataset for review
320+
protected boolean getEffectiveRequiresFilesToPublishDataset() {
321+
if (getUser().isSuperuser()) {
322+
return false;
323+
} else {
324+
Dataverse dv = getDataset().getOwner();
325+
return dv != null && dv.getEffectiveRequiresFilesToPublishDataset();
326+
}
327+
}
318328
}

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/PublishDatasetCommand.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package edu.harvard.iq.dataverse.engine.command.impl;
22

3-
import edu.harvard.iq.dataverse.Dataset;
4-
import edu.harvard.iq.dataverse.DatasetLock;
5-
import edu.harvard.iq.dataverse.Dataverse;
3+
import edu.harvard.iq.dataverse.*;
64
import edu.harvard.iq.dataverse.authorization.Permission;
75
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
86
import edu.harvard.iq.dataverse.engine.command.CommandContext;
@@ -17,6 +15,7 @@
1715

1816
import jakarta.persistence.OptimisticLockException;
1917

18+
import java.util.List;
2019
import java.util.Optional;
2120
import java.util.logging.Level;
2221
import java.util.logging.Logger;
@@ -233,19 +232,12 @@ private void verifyCommandArguments(CommandContext ctxt) throws IllegalCommandEx
233232
throw new IllegalCommandException("Cannot release as minor version. Re-try as major release.", this);
234233
}
235234

236-
if (getDataset().getFiles().isEmpty() && getEffectiveRequiresFilesToPublishDataset()) {
235+
List<FileMetadata> files = getDataset().getLatestVersion().getFileMetadatas();
236+
if ((files == null || files.isEmpty()) && getEffectiveRequiresFilesToPublishDataset()) {
237237
throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.mayNotPublish.FilesRequired"), this);
238238
}
239239
}
240240
}
241-
private boolean getEffectiveRequiresFilesToPublishDataset() {
242-
if (getUser().isSuperuser()) {
243-
return false;
244-
} else {
245-
Dataverse dv = getDataset().getOwner();
246-
return dv != null && dv.getEffectiveRequiresFilesToPublishDataset();
247-
}
248-
}
249241

250242
@Override
251243
public boolean onSuccess(CommandContext ctxt, Object r) {

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommand.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,17 @@
11
package edu.harvard.iq.dataverse.engine.command.impl;
22

3-
import edu.harvard.iq.dataverse.Dataset;
4-
import edu.harvard.iq.dataverse.DatasetLock;
5-
import edu.harvard.iq.dataverse.DatasetVersionUser;
6-
import edu.harvard.iq.dataverse.UserNotification;
3+
import edu.harvard.iq.dataverse.*;
74
import edu.harvard.iq.dataverse.authorization.Permission;
85
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
9-
import edu.harvard.iq.dataverse.batch.util.LoggingUtil;
10-
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
116
import edu.harvard.iq.dataverse.engine.command.CommandContext;
127
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
138
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
149
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
1510
import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException;
1611
import edu.harvard.iq.dataverse.util.BundleUtil;
17-
import java.io.IOException;
1812
import java.sql.Timestamp;
1913
import java.util.Date;
2014
import java.util.List;
21-
import java.util.concurrent.Future;
22-
import org.apache.solr.client.solrj.SolrServerException;
2315

2416
@RequiredPermissions(Permission.EditDataset)
2517
public class SubmitDatasetForReviewCommand extends AbstractDatasetCommand<Dataset> {
@@ -41,6 +33,11 @@ public Dataset execute(CommandContext ctxt) throws CommandException {
4133
throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.submit.failure.inReview"), this);
4234
}
4335

36+
List<FileMetadata> files = getDataset().getLatestVersion().getFileMetadatas();
37+
if ((files == null || files.isEmpty()) && getEffectiveRequiresFilesToPublishDataset()) {
38+
throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.mayNotSubmitForReview.FilesRequired"), this);
39+
}
40+
4441
//SEK 9-1 Add Lock before saving dataset
4542
DatasetLock inReviewLock = new DatasetLock(DatasetLock.Reason.InReview, getRequest().getAuthenticatedUser());
4643
ctxt.engine().submit(new AddLockCommand(getRequest(), getDataset(), inReviewLock));

0 commit comments

Comments
 (0)