Merge "Support changing of group options via REST"
This commit is contained in:
@@ -16,6 +16,7 @@ package com.google.gerrit.client.admin;
|
|||||||
|
|
||||||
import com.google.gerrit.client.Dispatcher;
|
import com.google.gerrit.client.Dispatcher;
|
||||||
import com.google.gerrit.client.Gerrit;
|
import com.google.gerrit.client.Gerrit;
|
||||||
|
import com.google.gerrit.client.VoidResult;
|
||||||
import com.google.gerrit.client.groups.GroupApi;
|
import com.google.gerrit.client.groups.GroupApi;
|
||||||
import com.google.gerrit.client.rpc.GerritCallback;
|
import com.google.gerrit.client.rpc.GerritCallback;
|
||||||
import com.google.gerrit.client.ui.AccountGroupSuggestOracle;
|
import com.google.gerrit.client.ui.AccountGroupSuggestOracle;
|
||||||
@@ -23,7 +24,6 @@ import com.google.gerrit.client.ui.OnEditEnabler;
|
|||||||
import com.google.gerrit.client.ui.RPCSuggestOracle;
|
import com.google.gerrit.client.ui.RPCSuggestOracle;
|
||||||
import com.google.gerrit.client.ui.SmallHeading;
|
import com.google.gerrit.client.ui.SmallHeading;
|
||||||
import com.google.gerrit.common.data.GroupDetail;
|
import com.google.gerrit.common.data.GroupDetail;
|
||||||
import com.google.gerrit.common.data.GroupOptions;
|
|
||||||
import com.google.gerrit.reviewdb.client.AccountGroup;
|
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||||
import com.google.gwt.event.dom.client.ClickEvent;
|
import com.google.gwt.event.dom.client.ClickEvent;
|
||||||
import com.google.gwt.event.dom.client.ClickHandler;
|
import com.google.gwt.event.dom.client.ClickHandler;
|
||||||
@@ -34,7 +34,6 @@ import com.google.gwt.user.client.ui.VerticalPanel;
|
|||||||
import com.google.gwtexpui.clippy.client.CopyableLabel;
|
import com.google.gwtexpui.clippy.client.CopyableLabel;
|
||||||
import com.google.gwtexpui.globalkey.client.NpTextArea;
|
import com.google.gwtexpui.globalkey.client.NpTextArea;
|
||||||
import com.google.gwtexpui.globalkey.client.NpTextBox;
|
import com.google.gwtexpui.globalkey.client.NpTextBox;
|
||||||
import com.google.gwtjsonrpc.common.VoidResult;
|
|
||||||
|
|
||||||
public class AccountGroupInfoScreen extends AccountGroupScreen {
|
public class AccountGroupInfoScreen extends AccountGroupScreen {
|
||||||
private CopyableLabel groupUUIDLabel;
|
private CopyableLabel groupUUIDLabel;
|
||||||
@@ -130,8 +129,8 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
|
|||||||
final String newOwner = ownerTxt.getText().trim();
|
final String newOwner = ownerTxt.getText().trim();
|
||||||
if (newOwner.length() > 0) {
|
if (newOwner.length() > 0) {
|
||||||
GroupApi.setGroupOwner(getGroupUUID(), newOwner,
|
GroupApi.setGroupOwner(getGroupUUID(), newOwner,
|
||||||
new GerritCallback<com.google.gerrit.client.VoidResult>() {
|
new GerritCallback<VoidResult>() {
|
||||||
public void onSuccess(final com.google.gerrit.client.VoidResult result) {
|
public void onSuccess(final VoidResult result) {
|
||||||
saveOwner.setEnabled(false);
|
saveOwner.setEnabled(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -161,8 +160,8 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
|
|||||||
public void onClick(final ClickEvent event) {
|
public void onClick(final ClickEvent event) {
|
||||||
final String txt = descTxt.getText().trim();
|
final String txt = descTxt.getText().trim();
|
||||||
GroupApi.setGroupDescription(getGroupUUID(), txt,
|
GroupApi.setGroupDescription(getGroupUUID(), txt,
|
||||||
new GerritCallback<com.google.gerrit.client.VoidResult>() {
|
new GerritCallback<VoidResult>() {
|
||||||
public void onSuccess(final com.google.gerrit.client.VoidResult result) {
|
public void onSuccess(final VoidResult result) {
|
||||||
saveDesc.setEnabled(false);
|
saveDesc.setEnabled(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -190,10 +189,8 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
|
|||||||
saveGroupOptions.addClickHandler(new ClickHandler() {
|
saveGroupOptions.addClickHandler(new ClickHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(final ClickEvent event) {
|
public void onClick(final ClickEvent event) {
|
||||||
final GroupOptions groupOptions =
|
GroupApi.setGroupOptions(getGroupUUID(),
|
||||||
new GroupOptions(visibleToAllCheckBox.getValue());
|
visibleToAllCheckBox.getValue(), new GerritCallback<VoidResult>() {
|
||||||
Util.GROUP_SVC.changeGroupOptions(getGroupId(), groupOptions,
|
|
||||||
new GerritCallback<VoidResult>() {
|
|
||||||
public void onSuccess(final VoidResult result) {
|
public void onSuccess(final VoidResult result) {
|
||||||
saveGroupOptions.setEnabled(false);
|
saveGroupOptions.setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ public class GroupTable extends NavigationTable<GroupInfo> {
|
|||||||
table.setHTML(row, 1, Util.highlight(k.name(), toHighlight));
|
table.setHTML(row, 1, Util.highlight(k.name(), toHighlight));
|
||||||
}
|
}
|
||||||
table.setText(row, 2, k.description());
|
table.setText(row, 2, k.description());
|
||||||
if (k.isVisibleToAll()) {
|
if (k.options().isVisibleToAll()) {
|
||||||
table.setWidget(row, 3, new Image(Gerrit.RESOURCES.greenCheck()));
|
table.setWidget(row, 3, new Image(Gerrit.RESOURCES.greenCheck()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,14 @@ public class GroupApi {
|
|||||||
group(group).view("owner").put(in, cb);
|
group(group).view("owner").put(in, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set the options for a group */
|
||||||
|
public static void setGroupOptions(AccountGroup.UUID group,
|
||||||
|
boolean isVisibleToAll, AsyncCallback<VoidResult> cb) {
|
||||||
|
GroupOptionsInput in = GroupOptionsInput.create();
|
||||||
|
in.isVisibleToAll(isVisibleToAll);
|
||||||
|
group(group).view("options").put(in, cb);
|
||||||
|
}
|
||||||
|
|
||||||
/** Add member to a group. */
|
/** Add member to a group. */
|
||||||
public static void addMember(AccountGroup.UUID group, String member,
|
public static void addMember(AccountGroup.UUID group, String member,
|
||||||
AsyncCallback<MemberInfo> cb) {
|
AsyncCallback<MemberInfo> cb) {
|
||||||
@@ -185,6 +193,16 @@ public class GroupApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class GroupOptionsInput extends JavaScriptObject {
|
||||||
|
final native void isVisibleToAll(boolean v) /*-{ if(v)this.is_visible_to_all=v; }-*/;
|
||||||
|
|
||||||
|
static GroupOptionsInput create() {
|
||||||
|
return (GroupOptionsInput) createObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected GroupOptionsInput() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static class MemberInput extends JavaScriptObject {
|
private static class MemberInput extends JavaScriptObject {
|
||||||
final native void init() /*-{ this.members = []; }-*/;
|
final native void init() /*-{ this.members = []; }-*/;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public class GroupInfo extends JavaScriptObject {
|
|||||||
|
|
||||||
public final native String id() /*-{ return this.id; }-*/;
|
public final native String id() /*-{ return this.id; }-*/;
|
||||||
public final native String name() /*-{ return this.name; }-*/;
|
public final native String name() /*-{ return this.name; }-*/;
|
||||||
public final native boolean isVisibleToAll() /*-{ return this['visible_to_all'] ? true : false; }-*/;
|
public final native GroupOptionsInfo options() /*-{ return this.options; }-*/;
|
||||||
public final native String description() /*-{ return this.description; }-*/;
|
public final native String description() /*-{ return this.description; }-*/;
|
||||||
public final native String url() /*-{ return this.url; }-*/;
|
public final native String url() /*-{ return this.url; }-*/;
|
||||||
|
|
||||||
@@ -46,4 +46,11 @@ public class GroupInfo extends JavaScriptObject {
|
|||||||
|
|
||||||
protected GroupInfo() {
|
protected GroupInfo() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class GroupOptionsInfo extends JavaScriptObject {
|
||||||
|
public final native boolean isVisibleToAll() /*-{ return this['is_visible_to_all'] ? true : false; }-*/;
|
||||||
|
|
||||||
|
protected GroupOptionsInfo() {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.gerrit.extensions.restapi.RestReadView;
|
||||||
|
|
||||||
|
public class GetOptions implements RestReadView<GroupResource> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GroupOptionsInfo apply(GroupResource resource) {
|
||||||
|
return new GroupOptionsInfo(resource.getGroup());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,7 +25,7 @@ public class GroupInfo {
|
|||||||
public String id;
|
public String id;
|
||||||
public String name;
|
public String name;
|
||||||
public String url;
|
public String url;
|
||||||
public Boolean visibleToAll;
|
public GroupOptionsInfo options;
|
||||||
|
|
||||||
// These fields are only supplied for internal groups.
|
// These fields are only supplied for internal groups.
|
||||||
public String description;
|
public String description;
|
||||||
@@ -36,7 +36,7 @@ public class GroupInfo {
|
|||||||
id = Url.encode(group.getGroupUUID().get());
|
id = Url.encode(group.getGroupUUID().get());
|
||||||
name = Strings.emptyToNull(group.getName());
|
name = Strings.emptyToNull(group.getName());
|
||||||
url = Strings.emptyToNull(group.getUrl());
|
url = Strings.emptyToNull(group.getUrl());
|
||||||
visibleToAll = group.isVisibleToAll() ? true : null;
|
options = new GroupOptionsInfo(group);
|
||||||
|
|
||||||
AccountGroup internalGroup = GroupDescriptions.toAccountGroup(group);
|
AccountGroup internalGroup = GroupDescriptions.toAccountGroup(group);
|
||||||
if (internalGroup != null) {
|
if (internalGroup != null) {
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.gerrit.common.data.GroupDescription;
|
||||||
|
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||||
|
|
||||||
|
public class GroupOptionsInfo {
|
||||||
|
final String kind = "gerritcodereview#groupoptions";
|
||||||
|
public Boolean isVisibleToAll;
|
||||||
|
|
||||||
|
public GroupOptionsInfo(GroupDescription.Basic group) {
|
||||||
|
isVisibleToAll = group.isVisibleToAll() ? true : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GroupOptionsInfo(AccountGroup group) {
|
||||||
|
isVisibleToAll = group.isVisibleToAll() ? true : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -49,6 +49,8 @@ public class Module extends RestApiModule {
|
|||||||
put(GROUP_KIND, "name").to(PutName.class);
|
put(GROUP_KIND, "name").to(PutName.class);
|
||||||
get(GROUP_KIND, "owner").to(GetOwner.class);
|
get(GROUP_KIND, "owner").to(GetOwner.class);
|
||||||
put(GROUP_KIND, "owner").to(PutOwner.class);
|
put(GROUP_KIND, "owner").to(PutOwner.class);
|
||||||
|
get(GROUP_KIND, "options").to(GetOptions.class);
|
||||||
|
put(GROUP_KIND, "options").to(PutOptions.class);
|
||||||
|
|
||||||
child(GROUP_KIND, "members").to(MembersCollection.class);
|
child(GROUP_KIND, "members").to(MembersCollection.class);
|
||||||
get(MEMBER_KIND).to(GetMember.class);
|
get(MEMBER_KIND).to(GetMember.class);
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
|
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
|
||||||
|
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
|
||||||
|
import com.google.gerrit.extensions.restapi.RestModifyView;
|
||||||
|
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||||
|
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||||
|
import com.google.gerrit.server.account.GroupCache;
|
||||||
|
import com.google.gerrit.server.group.PutOptions.Input;
|
||||||
|
import com.google.gwtorm.server.OrmException;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
public class PutOptions implements RestModifyView<GroupResource, Input> {
|
||||||
|
static class Input {
|
||||||
|
Boolean isVisibleToAll;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final GroupCache groupCache;
|
||||||
|
private final ReviewDb db;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
PutOptions(GroupCache groupCache, ReviewDb db) {
|
||||||
|
this.groupCache = groupCache;
|
||||||
|
this.db = db;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GroupOptionsInfo apply(GroupResource resource, Input input)
|
||||||
|
throws MethodNotAllowedException, AuthException, BadRequestException,
|
||||||
|
ResourceNotFoundException, OrmException {
|
||||||
|
if (resource.toAccountGroup() == null) {
|
||||||
|
throw new MethodNotAllowedException();
|
||||||
|
} else if (!resource.getControl().isOwner()) {
|
||||||
|
throw new AuthException("Not group owner");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input == null) {
|
||||||
|
throw new BadRequestException("options are required");
|
||||||
|
}
|
||||||
|
if (input.isVisibleToAll == null) {
|
||||||
|
input.isVisibleToAll = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
AccountGroup group = db.accountGroups().get(
|
||||||
|
resource.toAccountGroup().getId());
|
||||||
|
if (group == null) {
|
||||||
|
throw new ResourceNotFoundException();
|
||||||
|
}
|
||||||
|
|
||||||
|
group.setVisibleToAll(input.isVisibleToAll);
|
||||||
|
db.accountGroups().update(Collections.singleton(group));
|
||||||
|
groupCache.evict(group);
|
||||||
|
|
||||||
|
return new GroupOptionsInfo(group);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -88,8 +88,8 @@ public class ListGroupsCommand extends BaseCommand {
|
|||||||
formatter.addColumn(Strings.nullToEmpty(info.description));
|
formatter.addColumn(Strings.nullToEmpty(info.description));
|
||||||
formatter.addColumn(o != null ? o.getName() : "n/a");
|
formatter.addColumn(o != null ? o.getName() : "n/a");
|
||||||
formatter.addColumn(o != null ? o.getGroupUUID().get() : "");
|
formatter.addColumn(o != null ? o.getGroupUUID().get() : "");
|
||||||
formatter.addColumn(Boolean.toString(
|
formatter.addColumn(Boolean.toString(Objects.firstNonNull(
|
||||||
Objects.firstNonNull(info.visibleToAll, Boolean.FALSE)));
|
info.options.isVisibleToAll, Boolean.FALSE)));
|
||||||
}
|
}
|
||||||
formatter.nextLine();
|
formatter.nextLine();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user