Skip to content

Commit 26a60da

Browse files
meek0kazoompa
authored andcommitted
config to make comments required for git documents (#4195)
* config to make comments required for git documents * translations * typo
1 parent 121bb1c commit 26a60da

File tree

16 files changed

+123
-8
lines changed

16 files changed

+123
-8
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.obiba.mica.core.service;
2+
3+
public class MissingCommentException extends RuntimeException {
4+
5+
public MissingCommentException(String message) {
6+
super(message);
7+
}
8+
}

mica-core/src/main/java/org/obiba/mica/dataset/service/CollectedDatasetService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.obiba.mica.core.domain.PublishCascadingScope;
2424
import org.obiba.mica.core.domain.StudyTable;
2525
import org.obiba.mica.core.repository.EntityStateRepository;
26+
import org.obiba.mica.core.service.MissingCommentException;
2627
import org.obiba.mica.dataset.NoSuchDatasetException;
2728
import org.obiba.mica.dataset.StudyDatasetRepository;
2829
import org.obiba.mica.dataset.StudyDatasetStateRepository;
@@ -37,6 +38,7 @@
3738
import org.obiba.mica.dataset.service.support.QueryTermsUtil;
3839
import org.obiba.mica.file.FileUtils;
3940
import org.obiba.mica.file.service.FileSystemService;
41+
import org.obiba.mica.micaConfig.service.MicaConfigService;
4042
import org.obiba.mica.micaConfig.service.OpalService;
4143
import org.obiba.mica.network.service.NetworkService;
4244
import org.obiba.mica.study.NoSuchStudyException;
@@ -103,6 +105,9 @@ public class CollectedDatasetService extends DatasetService<StudyDataset, StudyD
103105
@Inject
104106
private PublishedStudyService publishedStudyService;
105107

108+
@Inject
109+
private MicaConfigService micaConfigService;
110+
106111
@Inject
107112
private EventBus eventBus;
108113

@@ -521,6 +526,10 @@ private <T> T execute(StudyTable studyTable, DatasourceCallback<T> callback) {
521526
}
522527

523528
private void saveInternal(StudyDataset dataset, String comment) {
529+
if (micaConfigService.getConfig().isCommentsRequiredOnDocumentSave() && Strings.isNullOrEmpty(comment)) {
530+
throw new MissingCommentException("Due to the server configuration, comments are required when saving this document.");
531+
}
532+
524533
StudyDataset saved = prepareSave(dataset);
525534

526535
StudyDatasetState studyDatasetState = findEntityState(dataset, StudyDatasetState::new);

mica-core/src/main/java/org/obiba/mica/dataset/service/HarmonizedDatasetService.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import com.google.common.base.Strings;
1414
import com.google.common.base.Throwables;
1515
import com.google.common.collect.Lists;
16-
import com.google.common.collect.Maps;
1716
import com.google.common.collect.Sets;
1817
import com.google.common.eventbus.EventBus;
1918
import org.joda.time.DateTime;
@@ -23,6 +22,7 @@
2322
import org.obiba.mica.core.domain.OpalTable;
2423
import org.obiba.mica.core.domain.PublishCascadingScope;
2524
import org.obiba.mica.core.repository.EntityStateRepository;
25+
import org.obiba.mica.core.service.MissingCommentException;
2626
import org.obiba.mica.dataset.HarmonizationDatasetRepository;
2727
import org.obiba.mica.dataset.HarmonizationDatasetStateRepository;
2828
import org.obiba.mica.dataset.NoSuchDatasetException;
@@ -36,6 +36,7 @@
3636
import org.obiba.mica.dataset.service.support.QueryTermsUtil;
3737
import org.obiba.mica.file.FileUtils;
3838
import org.obiba.mica.file.service.FileSystemService;
39+
import org.obiba.mica.micaConfig.service.MicaConfigService;
3940
import org.obiba.mica.micaConfig.service.OpalService;
4041
import org.obiba.mica.network.service.NetworkService;
4142
import org.obiba.mica.study.NoSuchStudyException;
@@ -97,15 +98,14 @@ public class HarmonizedDatasetService extends DatasetService<HarmonizationDatase
9798

9899
private final FileSystemService fileSystemService;
99100

101+
private final MicaConfigService micaConfigService;
102+
100103
@Inject
101-
public HarmonizedDatasetService(
102-
StudyService studyService,
103-
NetworkService networkService, OpalService opalService,
104+
public HarmonizedDatasetService(StudyService studyService, NetworkService networkService, OpalService opalService,
104105
HarmonizationDatasetRepository harmonizationDatasetRepository,
105106
HarmonizationDatasetStateRepository harmonizationDatasetStateRepository,
106-
HarmonizationStudyService harmonizationStudyService,
107-
PublishedStudyService publishedStudyService,
108-
EventBus eventBus, FileSystemService fileSystemService) {
107+
HarmonizationStudyService harmonizationStudyService, PublishedStudyService publishedStudyService, EventBus eventBus,
108+
FileSystemService fileSystemService, MicaConfigService micaConfigService) {
109109
this.studyService = studyService;
110110
this.networkService = networkService;
111111
this.opalService = opalService;
@@ -115,6 +115,7 @@ public HarmonizedDatasetService(
115115
this.publishedStudyService = publishedStudyService;
116116
this.eventBus = eventBus;
117117
this.fileSystemService = fileSystemService;
118+
this.micaConfigService = micaConfigService;
118119

119120
this.helper = new Helper(this, this.eventBus);
120121
}
@@ -445,6 +446,10 @@ protected EventBus getEventBus() {
445446

446447
@SuppressWarnings("OverlyLongMethod")
447448
private void saveInternal(HarmonizationDataset dataset, String comment) {
449+
if (micaConfigService.getConfig().isCommentsRequiredOnDocumentSave() && Strings.isNullOrEmpty(comment)) {
450+
throw new MissingCommentException("Due to the server configuration, comments are required when saving this document.");
451+
}
452+
448453
HarmonizationDataset saved = prepareSave(dataset);
449454

450455
HarmonizationDatasetState harmonizationDatasetState = findEntityState(dataset, HarmonizationDatasetState::new);

mica-core/src/main/java/org/obiba/mica/micaConfig/domain/MicaConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ public class MicaConfig extends AbstractAuditableDocument {
173173

174174
private boolean isDataAccessRequestCountEnabled = true;
175175

176+
private boolean commentsRequiredOnDocumentSave = false;
177+
176178
@Transient
177179
private String contextPath;
178180

@@ -669,6 +671,14 @@ public String getContextPath() {
669671
return contextPath;
670672
}
671673

674+
public boolean isCommentsRequiredOnDocumentSave() {
675+
return commentsRequiredOnDocumentSave;
676+
}
677+
678+
public void setCommentsRequiredOnDocumentSave(boolean commentsRequiredOnDocumentSave) {
679+
this.commentsRequiredOnDocumentSave = commentsRequiredOnDocumentSave;
680+
}
681+
672682
public enum OpalViewsGrouping {
673683
PROJECT_TABLE,
674684
PROJECT_ENTITY_TYPE,

mica-core/src/main/java/org/obiba/mica/network/service/NetworkService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.obiba.mica.core.domain.PublishCascadingScope;
2424
import org.obiba.mica.core.repository.EntityStateRepository;
2525
import org.obiba.mica.core.service.AbstractGitPersistableService;
26+
import org.obiba.mica.core.service.MissingCommentException;
2627
import org.obiba.mica.dataset.HarmonizationDatasetRepository;
2728
import org.obiba.mica.file.FileStoreService;
2829
import org.obiba.mica.file.FileUtils;
@@ -102,6 +103,10 @@ public void save(@NotNull @Valid Network network, String comment) {
102103

103104
@SuppressWarnings("OverlyLongMethod")
104105
private void saveInternal(@NotNull Network network, String comment, boolean cascade) {
106+
if (micaConfigService.getConfig().isCommentsRequiredOnDocumentSave() && Strings.isNullOrEmpty(comment)) {
107+
throw new MissingCommentException("Due to the server configuration, comments are required when saving this document.");
108+
}
109+
105110
Network saved = network;
106111

107112
if(network.isNew()) {

mica-core/src/main/java/org/obiba/mica/project/service/ProjectService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.obiba.mica.core.domain.PublishCascadingScope;
2626
import org.obiba.mica.core.repository.EntityStateRepository;
2727
import org.obiba.mica.core.service.AbstractGitPersistableService;
28+
import org.obiba.mica.core.service.MissingCommentException;
2829
import org.obiba.mica.file.FileUtils;
2930
import org.obiba.mica.file.service.FileSystemService;
3031
import org.obiba.mica.micaConfig.service.MicaConfigService;
@@ -111,6 +112,10 @@ public Project findDraft(@NotNull String id) throws NoSuchEntityException {
111112

112113
@Override
113114
public void save(@NotNull @Valid Project project, String comments) {
115+
if (micaConfigService.getConfig().isCommentsRequiredOnDocumentSave() && Strings.isNullOrEmpty(comments)) {
116+
throw new MissingCommentException("Due to the server configuration, comments are required when saving this document.");
117+
}
118+
114119
Project saved = project;
115120

116121
if(project.isNew()) {

mica-core/src/main/java/org/obiba/mica/study/service/HarmonizationStudyService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010

1111
package org.obiba.mica.study.service;
1212

13+
import com.google.common.base.Strings;
1314
import com.google.common.collect.ImmutableSet;
1415
import com.google.common.collect.Lists;
1516
import com.google.common.collect.Maps;
1617
import com.google.common.collect.Sets;
1718
import org.joda.time.DateTime;
1819
import org.obiba.mica.core.domain.AbstractGitPersistable;
1920
import org.obiba.mica.core.repository.EntityStateRepository;
21+
import org.obiba.mica.core.service.MissingCommentException;
2022
import org.obiba.mica.dataset.HarmonizationDatasetRepository;
2123
import org.obiba.mica.dataset.HarmonizationDatasetStateRepository;
2224
import org.obiba.mica.dataset.domain.HarmonizationDataset;
@@ -78,6 +80,10 @@ public class HarmonizationStudyService extends AbstractStudyService<Harmonizatio
7880

7981
@Override
8082
protected void saveInternal(final HarmonizationStudy study, String comment, boolean cascade) {
83+
if (micaConfigService.getConfig().isCommentsRequiredOnDocumentSave() && Strings.isNullOrEmpty(comment)) {
84+
throw new MissingCommentException("Due to the server configuration, comments are required when saving this document.");
85+
}
86+
8187
log.info("Saving harmonization study: {}", study.getId());
8288

8389
// checks if population and dce are still the same

mica-core/src/main/java/org/obiba/mica/study/service/IndividualStudyService.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
package org.obiba.mica.study.service;
1212

13+
import com.google.common.base.Strings;
1314
import com.google.common.base.Throwables;
1415
import com.google.common.collect.Lists;
1516
import com.google.common.collect.Maps;
@@ -18,11 +19,13 @@
1819
import org.json.JSONObject;
1920
import org.obiba.mica.core.domain.AbstractGitPersistable;
2021
import org.obiba.mica.core.repository.EntityStateRepository;
22+
import org.obiba.mica.core.service.MissingCommentException;
2123
import org.obiba.mica.dataset.HarmonizationDatasetRepository;
2224
import org.obiba.mica.dataset.StudyDatasetRepository;
2325
import org.obiba.mica.dataset.StudyDatasetStateRepository;
2426
import org.obiba.mica.dataset.domain.StudyDataset;
2527
import org.obiba.mica.file.FileStoreService;
28+
import org.obiba.mica.micaConfig.service.MicaConfigService;
2629
import org.obiba.mica.network.NetworkRepository;
2730
import org.obiba.mica.study.ConstraintException;
2831
import org.obiba.mica.study.StudyRepository;
@@ -80,12 +83,19 @@ public class IndividualStudyService extends AbstractStudyService<StudyState, Stu
8083
@Inject
8184
private HarmonizationDatasetRepository harmonizationDatasetRepository;
8285

86+
@Inject
87+
private MicaConfigService micaConfigService;
88+
8389
@Override
8490
protected void saveInternal(final Study study, String comment, boolean cascade) {
8591
saveInternal(study, comment, cascade, false);
8692
}
8793

8894
public void saveInternal(final Study study, String comment, boolean cascade, boolean weightChanged) {
95+
if (micaConfigService.getConfig().isCommentsRequiredOnDocumentSave() && Strings.isNullOrEmpty(comment)) {
96+
throw new MissingCommentException("Due to the server configuration, comments are required when saving this document.");
97+
}
98+
8999
log.info("Saving study: {}", study.getId());
90100

91101
// checks if population and dce are still the same

mica-core/src/main/java/org/obiba/mica/web/model/MicaConfigDtos.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ Mica.MicaConfigDto asDto(@NotNull MicaConfig config, String language) {
111111
builder.setVersion(config.getMicaVersion().toString());
112112
}
113113

114+
builder.setIsCommentsRequiredOnDocumentSave(config.isCommentsRequiredOnDocumentSave());
115+
114116
builder.addAllRoles(config.getRoles());
115117

116118
builder.setIsFsNotificationsEnabled(config.isFsNotificationsEnabled());
@@ -197,6 +199,8 @@ MicaConfig fromDto(@NotNull Mica.MicaConfigDtoOrBuilder dto) {
197199

198200
config.setOpalViewsGrouping(OpalViewsGrouping.valueOf(dto.getOpalViewsGrouping()));
199201

202+
config.setCommentsRequiredOnDocumentSave(dto.getIsCommentsRequiredOnDocumentSave());
203+
200204
if (dto.hasSearchLayout()) config.setSearchLayout(dto.getSearchLayout());
201205

202206
if(dto.hasPublicUrl()) config.setPublicUrl(dto.getPublicUrl());

mica-core/src/test/java/org/obiba/mica/dataset/service/CollectedDatasetServiceTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@
2525
import org.obiba.mica.dataset.StudyDatasetStateRepository;
2626
import org.obiba.mica.dataset.domain.StudyDataset;
2727
import org.obiba.mica.dataset.domain.StudyDatasetState;
28+
import org.obiba.mica.micaConfig.domain.MicaConfig;
29+
import org.obiba.mica.micaConfig.service.MicaConfigService;
2830
import org.obiba.mica.micaConfig.service.OpalService;
2931
import org.obiba.mica.study.domain.Study;
3032
import org.obiba.mica.study.service.IndividualStudyService;
3133
import org.obiba.opal.rest.client.magma.RestDatasource;
32-
3334
import com.google.common.eventbus.EventBus;
3435

3536
import static org.mockito.Matchers.any;
@@ -61,6 +62,9 @@ public class CollectedDatasetServiceTest {
6162
@Mock
6263
private StudyDatasetStateRepository studyDatasetStateRepository;
6364

65+
@Mock
66+
private MicaConfigService micaConfigService;
67+
6468
private Study study;
6569

6670
private StudyDataset dataset;
@@ -75,6 +79,7 @@ public void init() {
7579
state = buildStudyDatasetState(dataset);
7680
doNothing().when(gitService).save(any(StudyDataset.class), anyString());
7781
when(gitService.hasGitRepository(any(StudyDataset.class))).thenReturn(true);
82+
when(micaConfigService.getConfig()).thenReturn(new MicaConfig());
7883
}
7984

8085
@Test
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.obiba.mica;
2+
3+
import javax.ws.rs.core.Response;
4+
import javax.ws.rs.ext.Provider;
5+
6+
import org.obiba.jersey.exceptionmapper.AbstractErrorDtoExceptionMapper;
7+
import org.obiba.mica.core.service.MissingCommentException;
8+
import org.obiba.web.model.ErrorDtos;
9+
10+
import com.google.protobuf.GeneratedMessage;
11+
12+
@Provider
13+
public class MissingCommentExceptionMapper extends AbstractErrorDtoExceptionMapper<MissingCommentException> {
14+
@Override
15+
protected Response.Status getStatus() {
16+
return Response.Status.BAD_REQUEST;
17+
}
18+
19+
@Override
20+
protected GeneratedMessage.ExtendableMessage<?> getErrorDto(MissingCommentException e) {
21+
return ErrorDtos.ClientErrorDto.newBuilder()
22+
.setCode(getStatus().getStatusCode())
23+
.setMessageTemplate("server.error.document-comment")
24+
.setMessage(e.getMessage())
25+
.build();
26+
}
27+
}

mica-web-model/src/main/protobuf/Mica.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,7 @@ message MicaConfigDto {
456456
optional bool isContactNotificationsEnabled = 59;
457457
optional string contactNotificationsSubject = 60;
458458
repeated string contactGroups = 61;
459+
optional bool isCommentsRequiredOnDocumentSave = 62 [default = false];
459460
}
460461

461462
message PublicMicaConfigDto {

mica-webapp/src/main/resources/i18n/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,8 @@
308308
"anonymous-username-help": "User that is configured for unauthenticated Portal usage.",
309309
"cart-enabled": "Cart enabled",
310310
"cart-enabled-help": "Cart creation and management is enabled.",
311+
"comments-required": "Comments Required",
312+
"comments-required-help": "Make adding a comment be mandatory when saving an entity document (e.g. saving a dataset)",
311313
"cart-time-to-live": "Cart Life Span",
312314
"cart-time-to-live-help": "Cart life span in days.",
313315
"set-time-to-live": "List Time Span",
@@ -1531,6 +1533,7 @@
15311533
"delete-conflict-message": "Found conflicts when trying to delete network. Remove all references from the following networks: {{arg0}}."
15321534
}
15331535
},
1536+
"document-comment": "A comment is required on document save.",
15341537
"taxonomy": {
15351538
"name-not-found": "The taxonomy with the name '{{arg0}}' is not found.",
15361539
"range-criterion-missing-terms": "The criterion '{{arg0}}' must have terms to define its range intervals.",

mica-webapp/src/main/resources/i18n/fr.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,8 @@
308308
"anonymous-username-help": "L'utilisateur configuré pour le fonctionnement anonyme du Portail.",
309309
"cart-enabled": "Panier activé",
310310
"cart-enabled-help": "La création et la gestion de panier est activée",
311+
"comments-required": "Commentaires requis",
312+
"comments-required-help": "Rendre l’ajout d’un commentaire obligatoire lors de l’enregistrement d’un document d’entité (p. ex. enregistrement d’un jeu de données)",
311313
"cart-time-to-live": "Durée de vie du panier",
312314
"cart-time-to-live-help": "Durée de vie du panier en jours.",
313315
"set-time-to-live": "Durée de vie de la liste",
@@ -1533,6 +1535,7 @@
15331535
"range-criterion-missing-range-attribute": "Le critère '{{arg0}}' avec des termes doit être marqué comme ayant des intervalles de portée.",
15341536
"duplicate-criterion-alias": "Le champ '{{arg0}}' a déjà un critère associé. Seul un champ numérique peut avoir deux critères, un critère discret et un critère de portée."
15351537
},
1538+
"document-comment": "Un commentaire est requis lors de la sauvegarde du document.",
15361539
"data-access-amendment": {
15371540
"not-enabled": "Les opérations d'amendement d'accès aux données sont désactivées. Contactez votre administrateur pour activer cette fonctionnalité."
15381541
}

mica-webapp/src/main/webapp/app/config/views/config-form.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ <h4 translate>config.sections</h4>
109109
<div form-checkbox name="isImportStudiesFeatureEnabled" model="micaConfig.isImportStudiesFeatureEnabled"
110110
label="config.import-studies-feature-enabled" help="config.import-studies-feature-enabled-help"></div>
111111

112+
<div form-checkbox name="isSetsAnalysisEnabled" model="micaConfig.isCommentsRequiredOnDocumentSave"
113+
label="config.comments-required" help="config.comments-required-help">
114+
</div>
115+
112116
<h4 translate class="voffset4">config.data-analyses.title</h4>
113117
<span class="help-block" translate>config.data-analyses.help</span>
114118
<div form-checkbox name="isContingencyEnabled" model="micaConfig.isContingencyEnabled"

mica-webapp/src/main/webapp/app/config/views/config-view.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,16 @@ <h5 translate>config.sections</h5>
352352
<i class="fa fa-square-o" ng-hide="micaConfig.isImportStudiesFeatureEnabled"></i>
353353
</td>
354354
</tr>
355+
<tr>
356+
<td>
357+
<span translate>config.comments-required</span>
358+
<span class="help-block" translate>config.comments-required-help</span>
359+
</td>
360+
<td>
361+
<i class="fa fa-check-square-o" ng-hide="!micaConfig.isCommentsRequiredOnDocumentSave"></i>
362+
<i class="fa fa-square-o" ng-hide="micaConfig.isCommentsRequiredOnDocumentSave"></i>
363+
</td>
364+
</tr>
355365
</tbody>
356366
</table>
357367

0 commit comments

Comments
 (0)