issue.comment.delete_confirm_title=Delete Comment
issue.comment.delete_confirm_message=Do you want to delete this comment?
issue.comment.delete_confirm_button=Delete
+issue.send_notifications=Send notifications
issue.transition=Transition
issue.transition.confirm=Confirm
issue.transition.unconfirm=Unconfirm
private final IssueBulkChangeService issueBulkChangeService;
public InternalRubyIssueService(IssueService issueService,
- IssueCommentService commentService,
- IssueChangelogService changelogService, ActionPlanService actionPlanService,
- IssueStatsFinder issueStatsFinder, ResourceDao resourceDao, ActionService actionService,
- IssueFilterService issueFilterService, IssueBulkChangeService issueBulkChangeService) {
+ IssueCommentService commentService,
+ IssueChangelogService changelogService, ActionPlanService actionPlanService,
+ IssueStatsFinder issueStatsFinder, ResourceDao resourceDao, ActionService actionService,
+ IssueFilterService issueFilterService, IssueBulkChangeService issueBulkChangeService) {
this.issueService = issueService;
this.commentService = commentService;
this.changelogService = changelogService;
}
public IssueQuery emptyIssueQuery() {
- return PublicRubyIssueService.toQuery(Maps.<String, Object>newHashMap());
+ return PublicRubyIssueService.toQuery(Maps.<String, Object> newHashMap());
}
@CheckForNull
/**
* Execute a bulk change
*/
- public IssueBulkChangeResult bulkChange(Map<String, Object> props, String comment) {
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(props, comment);
+ public IssueBulkChangeResult bulkChange(Map<String, Object> props, String comment, boolean sendNotifications) {
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(props, comment, sendNotifications);
return issueBulkChangeService.execute(issueBulkChangeQuery, UserSession.get());
}
private List<String> issues;
private List<String> actions;
private boolean hasComment;
+ private boolean sendNotifications;
Map<String, Map<String, Object>> propertiesByActions = new HashMap<String, Map<String, Object>>();
- public IssueBulkChangeQuery(Map<String, Object> props, String comment) {
+ public IssueBulkChangeQuery(Map<String, Object> props, String comment, boolean sendNotifications) {
+ this.sendNotifications = sendNotifications;
parse(props, comment);
}
@VisibleForTesting
- IssueBulkChangeQuery(Map<String, Object> props) {
+ IssueBulkChangeQuery(Map<String, Object> props, boolean sendNotifications) {
+ this.sendNotifications = sendNotifications;
parse(props, null);
}
}
}
- private List<String> sanitizeList(List<String> list){
- if (list == null || list.isEmpty()){
+ private List<String> sanitizeList(List<String> list) {
+ if (list == null || list.isEmpty()) {
return Collections.emptyList();
}
return newArrayList(Iterables.filter(list, new Predicate<String>() {
return actions;
}
- public boolean hasComment(){
+ public boolean hasComment() {
return hasComment;
}
+ public boolean sendNotifications() {
+ return sendNotifications;
+ }
+
public Map<String, Object> properties(String action) {
return propertiesByActions.get(action);
}
applyAction(getAction(CommentAction.KEY), actionContext, issueBulkChangeQuery, result);
}
issueStorage.save((DefaultIssue) issue);
- issueNotifications.sendChanges((DefaultIssue) issue, issueChangeContext, issueQueryResult);
+ if (issueBulkChangeQuery.sendNotifications()) {
+ issueNotifications.sendChanges((DefaultIssue) issue, issueChangeContext, issueQueryResult);
+ }
concernedProjects.add(((DefaultIssue) issue).projectKey());
}
}
verify_post_request
comment = Api::Utils.read_post_request_param(params[:comment])
- result = Internal.issues.bulkChange(params, comment)
+ sendNotifications = params[:sendNotifications] || 'true'
+ result = Internal.issues.bulkChange(params, comment, sendNotifications == 'true')
hash = {}
hash[:issuesChanged] = {
:total => result.issuesChanged().size,
# POST /issues/bulk_change?criteria
def bulk_change
verify_post_request
- Internal.issues.bulkChange(params, params[:comment])
+ Internal.issues.bulkChange(params, params[:comment], params[:sendNotifications] == 'true')
render :text => '', :status => 200
end
</div>
</div>
</div>
+
+ <div class="modal-field">
+ <label for="send-notifications">
+ <%= message('issue.send_notifications') -%>
+ </label>
+ <input id="send-notifications" name="sendNotifications" type="checkbox" value="true" checked="checked" />
+ </div>
</div>
<div class="modal-foot">
<span id="bulk-change-loading-image" class="loading-image hidden"><%= image_tag 'loading.gif' %></span>
import static com.google.common.collect.Maps.newHashMap;
import static org.fest.assertions.Assertions.assertThat;
import static org.fest.assertions.Fail.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
public class InternalRubyIssueServiceTest {
@Test
public void test_changelog() throws Exception {
- IssueChangelog changelog = new IssueChangelog(Collections.<FieldDiffs>emptyList(), Collections.<User>emptyList());
+ IssueChangelog changelog = new IssueChangelog(Collections.<FieldDiffs> emptyList(), Collections.<User> emptyList());
when(changelogService.changelog(eq("ABCDE"), any(UserSession.class))).thenReturn(changelog);
IssueChangelog result = service.changelog("ABCDE");
@Test
public void should_execute_issue_filter_from_issue_query() {
- service.execute(Maps.<String, Object>newHashMap());
+ service.execute(Maps.<String, Object> newHashMap());
verify(issueFilterService).execute(any(IssueQuery.class));
}
}
@Test
- public void should_check_if_user_can_share_issue_filter(){
+ public void should_check_if_user_can_share_issue_filter() {
service.canUserShareIssueFilter();
verify(issueFilterService).canShareFilter(any(UserSession.class));
}
params.put("assign.assignee", "arthur");
params.put("set_severity.severity", "MINOR");
params.put("plan.plan", "3.7");
- service.bulkChange(params, "My comment");
+ service.bulkChange(params, "My comment", true);
verify(issueBulkChangeService).execute(any(IssueBulkChangeQuery.class), any(UserSession.class));
}
params.put("set_severity.severity", "MINOR");
params.put("plan.plan", "3.7");
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params, true);
assertThat(issueBulkChangeQuery.actions()).containsOnly("do_transition", "assign", "set_severity", "plan");
assertThat(issueBulkChangeQuery.issues()).containsOnly("ABCD", "EFGH");
}
params.put("actions", newArrayList("do_transition", "", null));
params.put("do_transition.transition", "confirm");
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params, true);
assertThat(issueBulkChangeQuery.actions()).containsOnly("do_transition");
assertThat(issueBulkChangeQuery.issues()).containsOnly("ABCD", "EFGH");
}
params.put("actions", newArrayList("do_transition"));
params.put("do_transition.transition", "confirm");
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params, true);
assertThat(issueBulkChangeQuery.actions()).containsOnly("do_transition");
assertThat(issueBulkChangeQuery.issues()).containsOnly("ABCD", "EFGH");
}
params.put("actions", newArrayList("assign"));
params.put("assign.assignee", "arthur");
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params, "My comment for bulk change");
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params, "My comment for bulk change", true);
assertThat(issueBulkChangeQuery.hasComment()).isTrue();
assertThat(issueBulkChangeQuery.actions()).containsOnly("assign");
assertThat(issueBulkChangeQuery.properties("comment").get("comment")).isEqualTo("My comment for bulk change");
params.put("actions", newArrayList("assign"));
params.put("assign.assignee", "arthur");
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params, true);
assertThat(issueBulkChangeQuery.properties("assign")).hasSize(1);
assertThat(issueBulkChangeQuery.properties("assign").get("assignee")).isEqualTo("arthur");
}
params.put("actions", newArrayList("assign"));
params.put("assign.assignee", "arthur");
try {
- new IssueBulkChangeQuery(params);
+ new IssueBulkChangeQuery(params, true);
fail();
} catch (Exception e) {
assertThat(e).isInstanceOf(BadRequestException.class);
params.put("actions", newArrayList("assign"));
params.put("assign.assignee", "arthur");
try {
- new IssueBulkChangeQuery(params);
+ new IssueBulkChangeQuery(params, true);
fail();
} catch (Exception e) {
assertThat(e).isInstanceOf(BadRequestException.class);
Map<String, Object> params = newHashMap();
params.put("issues", newArrayList("ABCD", "EFGH"));
try {
- new IssueBulkChangeQuery(params);
+ new IssueBulkChangeQuery(params, true);
fail();
} catch (Exception e) {
assertThat(e).isInstanceOf(BadRequestException.class);
params.put("issues", newArrayList("ABCD", "EFGH"));
params.put("actions", Collections.emptyList());
try {
- new IssueBulkChangeQuery(params);
+ new IssueBulkChangeQuery(params, true);
fail();
} catch (Exception e) {
assertThat(e).isInstanceOf(BadRequestException.class);
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
properties.put("assign.assignee", "fred");
actions.add(new MockAction("assign"));
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, true);
IssueBulkChangeResult result = service.execute(issueBulkChangeQuery, userSession);
assertThat(result.issuesChanged()).hasSize(1);
assertThat(result.issuesNotChanged()).isEmpty();
verifyNoMoreInteractions(issueNotifications);
}
+ @Test
+ public void should_skip_send_notifications() {
+ Map<String, Object> properties = newHashMap();
+ properties.put("issues", "ABCD");
+ properties.put("actions", "assign");
+ properties.put("assign.assignee", "fred");
+ actions.add(new MockAction("assign"));
+
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, false);
+ IssueBulkChangeResult result = service.execute(issueBulkChangeQuery, userSession);
+ assertThat(result.issuesChanged()).hasSize(1);
+ assertThat(result.issuesNotChanged()).isEmpty();
+
+ verify(issueStorage).save(eq(issue));
+ verifyNoMoreInteractions(issueStorage);
+ verify(issueNotifications, never()).sendChanges(eq(issue), any(IssueChangeContext.class), eq(issueQueryResult));
+ verifyNoMoreInteractions(issueNotifications);
+ }
+
@Test
public void should_execute_bulk_change_with_comment() {
Map<String, Object> properties = newHashMap();
actions.add(commentAction);
actions.add(new MockAction("assign"));
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, "my comment");
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, "my comment", true);
IssueBulkChangeResult result = service.execute(issueBulkChangeQuery, userSession);
assertThat(result.issuesChanged()).hasSize(1);
assertThat(result.issuesNotChanged()).isEmpty();
when(assignAction.execute(anyMap(), any(IssueBulkChangeService.ActionContext.class))).thenReturn(true).thenReturn(false);
actions.add(assignAction);
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, "my comment");
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, "my comment", true);
IssueBulkChangeResult result = service.execute(issueBulkChangeQuery, userSession);
assertThat(result.issuesChanged()).hasSize(1);
assertThat(result.issuesNotChanged()).hasSize(1);
actions.add(new MockAction("set_severity"));
actions.add(new MockAction("assign"));
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, true);
IssueBulkChangeResult result = service.execute(issueBulkChangeQuery, userSession);
assertThat(result.issuesChanged()).hasSize(1);
assertThat(result.issuesNotChanged()).isEmpty();
properties.put("assign.assignee", "fred");
actions.add(new MockAction("assign"));
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, true);
service.execute(issueBulkChangeQuery, userSession);
ArgumentCaptor<IssueQuery> captor = ArgumentCaptor.forClass(IssueQuery.class);
properties.put("assign.assignee", "fred");
actions.add(new MockAction("assign", true, true, false));
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, true);
IssueBulkChangeResult result = service.execute(issueBulkChangeQuery, userSession);
assertThat(result.issuesChanged()).isEmpty();
assertThat(result.issuesNotChanged()).hasSize(1);
properties.put("assign.assignee", "fred");
actions.add(new MockAction("assign", false, true, true));
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, true);
IssueBulkChangeResult result = service.execute(issueBulkChangeQuery, userSession);
assertThat(result.issuesChanged()).isEmpty();
assertThat(result.issuesNotChanged()).isEmpty();
properties.put("assign.assignee", "fred");
actions.add(new MockAction("assign", true, false, true));
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, true);
IssueBulkChangeResult result = service.execute(issueBulkChangeQuery, userSession);
assertThat(result.issuesChanged()).isEmpty();
assertThat(result.issuesNotChanged()).hasSize(1);
doThrow(new RuntimeException("Error")).when(action).execute(anyMap(), any(IssueBulkChangeService.ActionContext.class));
actions.add(action);
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, true);
IssueBulkChangeResult result = service.execute(issueBulkChangeQuery, userSession);
assertThat(result.issuesChanged()).isEmpty();
assertThat(result.issuesNotChanged()).hasSize(1);
properties.put("issues", "ABCD");
properties.put("actions", "assign");
properties.put("assign.assignee", "fred");
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, true);
try {
service.execute(issueBulkChangeQuery, userSession);
fail();
properties.put("issues", "ABCD");
properties.put("actions", "unknown");
properties.put("unknown.unknown", "unknown");
- IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties);
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties, true);
try {
service.execute(issueBulkChangeQuery, userSession);
fail();