Allow extra group suggestions for project owners.

The suggestGroupOwner currently only returns groups that are visible
to the user.  When editing a project config, include the
Project.NameKey so owners can be shown and add groups to which they
are not a member.

Change-Id: I1df4a025b6e11e92a44e77e2e96e16f4e187f1a1
This commit is contained in:
Colby Ranger
2012-05-17 15:53:35 -07:00
parent eeaf37a509
commit b1cb0bc7a7
7 changed files with 62 additions and 9 deletions

View File

@@ -29,9 +29,16 @@ public interface SuggestService extends RemoteJsonService {
void suggestAccount(String query, Boolean enabled, int limit,
AsyncCallback<List<AccountInfo>> callback);
/**
* @see #suggestAccountGroup(com.google.gerrit.reviewdb.client.Project.NameKey, String, int, AsyncCallback)
*/
@Deprecated
void suggestAccountGroup(String query, int limit,
AsyncCallback<List<GroupReference>> callback);
void suggestAccountGroupForProject(Project.NameKey project, String query,
int limit, AsyncCallback<List<GroupReference>> callback);
/**
* @see #suggestChangeReviewer(com.google.gerrit.reviewdb.client.Change.Id, String, int, AsyncCallback)
*/

View File

@@ -276,7 +276,8 @@ public class AccessSectionEditor extends Composite implements
private class PermissionEditorSource extends EditorSource<PermissionEditor> {
@Override
public PermissionEditor create(int index) {
PermissionEditor subEditor = new PermissionEditor(readOnly, value);
PermissionEditor subEditor =
new PermissionEditor(projectAccess.getProjectName(), readOnly, value);
permissionContainer.insert(subEditor, index);
return subEditor;
}

View File

@@ -17,6 +17,7 @@ package com.google.gerrit.client.admin;
import com.google.gerrit.client.ui.AccountGroupSuggestOracle;
import com.google.gerrit.client.ui.RPCSuggestOracle;
import com.google.gerrit.common.data.GroupReference;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.editor.client.LeafValueEditor;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
@@ -140,4 +141,8 @@ public class GroupReferenceBox extends Composite implements
public void setAccessKey(char key) {
suggestBox.setAccessKey(key);
}
public void setProject(Project.NameKey projectName) {
oracle.setProject(projectName);
}
}

View File

@@ -25,6 +25,7 @@ import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.PermissionRange;
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.common.data.RefConfigSection;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
@@ -98,20 +99,25 @@ public class PermissionEditor extends Composite implements Editor<Permission>,
@UiField
DivElement deleted;
private final Project.NameKey projectName;
private final boolean readOnly;
private final AccessSection section;
private Permission value;
private PermissionRange.WithDefaults validRange;
private boolean isDeleted;
public PermissionEditor(boolean readOnly, AccessSection section) {
public PermissionEditor(Project.NameKey projectName,
boolean readOnly,
AccessSection section) {
this.readOnly = readOnly;
this.section = section;
this.projectName = projectName;
normalName = new ValueLabel<String>(PermissionNameRenderer.INSTANCE);
deletedName = new ValueLabel<String>(PermissionNameRenderer.INSTANCE);
initWidget(uiBinder.createAndBindUi(this));
groupToAdd.setProject(projectName);
rules = ListEditor.of(new RuleEditorSource());
exclusiveGroup.setEnabled(!readOnly);
@@ -223,7 +229,8 @@ public class PermissionEditor extends Composite implements Editor<Permission>,
// If the oracle didn't get to complete a UUID, resolve it now.
//
addRule.setEnabled(false);
SuggestUtil.SVC.suggestAccountGroup(ref.getName(), 1,
SuggestUtil.SVC.suggestAccountGroupForProject(
projectName, ref.getName(), 1,
new GerritCallback<List<GroupReference>>() {
@Override
public void onSuccess(List<GroupReference> result) {

View File

@@ -18,6 +18,7 @@ import com.google.gerrit.client.RpcStatus;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.common.data.GroupReference;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.user.client.ui.SuggestOracle;
import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle;
@@ -31,11 +32,14 @@ public class AccountGroupSuggestOracle extends HighlightSuggestOracle {
private Map<String, AccountGroup.UUID> priorResults =
new HashMap<String, AccountGroup.UUID>();
private Project.NameKey projectName;
@Override
public void onRequestSuggestions(final Request req, final Callback callback) {
RpcStatus.hide(new Runnable() {
public void run() {
SuggestUtil.SVC.suggestAccountGroup(req.getQuery(), req.getLimit(),
SuggestUtil.SVC.suggestAccountGroupForProject(
projectName, req.getQuery(), req.getLimit(),
new GerritCallback<List<GroupReference>>() {
public void onSuccess(final List<GroupReference> result) {
priorResults.clear();
@@ -52,6 +56,10 @@ public class AccountGroupSuggestOracle extends HighlightSuggestOracle {
});
}
public void setProject(Project.NameKey projectName) {
this.projectName = projectName;
}
private static class AccountGroupSuggestion implements
SuggestOracle.Suggestion {
private final GroupReference info;

View File

@@ -31,6 +31,7 @@ import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.account.AccountControl;
import com.google.gerrit.server.account.AccountVisibility;
import com.google.gerrit.server.account.GroupBackend;
import com.google.gerrit.server.account.GroupBackends;
import com.google.gerrit.server.account.GroupControl;
import com.google.gerrit.server.account.GroupMembers;
import com.google.gerrit.server.config.GerritServerConfig;
@@ -38,6 +39,7 @@ import com.google.gerrit.server.patch.AddReviewer;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectControl;
import com.google.gwtjsonrpc.common.AsyncCallback;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@@ -52,6 +54,8 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
class SuggestServiceImpl extends BaseServiceImplementation implements
SuggestService {
private static final String MAX_SUFFIX = "\u9fa5";
@@ -63,6 +67,7 @@ class SuggestServiceImpl extends BaseServiceImplementation implements
private final IdentifiedUser.GenericFactory identifiedUserFactory;
private final AccountControl.Factory accountControlFactory;
private final ChangeControl.Factory changeControlFactory;
private final ProjectControl.Factory projectControlFactory;
private final Config cfg;
private final GroupBackend groupBackend;
private final boolean suggestAccounts;
@@ -76,6 +81,7 @@ class SuggestServiceImpl extends BaseServiceImplementation implements
final IdentifiedUser.GenericFactory identifiedUserFactory,
final AccountControl.Factory accountControlFactory,
final ChangeControl.Factory changeControlFactory,
final ProjectControl.Factory projectControlFactory,
@GerritServerConfig final Config cfg, final GroupBackend groupBackend) {
super(schema, currentUser);
this.reviewDbProvider = schema;
@@ -85,6 +91,7 @@ class SuggestServiceImpl extends BaseServiceImplementation implements
this.identifiedUserFactory = identifiedUserFactory;
this.accountControlFactory = accountControlFactory;
this.changeControlFactory = changeControlFactory;
this.projectControlFactory = projectControlFactory;
this.cfg = cfg;
this.groupBackend = groupBackend;
@@ -175,19 +182,37 @@ class SuggestServiceImpl extends BaseServiceImplementation implements
public void suggestAccountGroup(final String query, final int limit,
final AsyncCallback<List<GroupReference>> callback) {
suggestAccountGroupForProject(null, query, limit, callback);
}
public void suggestAccountGroupForProject(final Project.NameKey project,
final String query, final int limit,
final AsyncCallback<List<GroupReference>> callback) {
run(callback, new Action<List<GroupReference>>() {
public List<GroupReference> run(final ReviewDb db) {
return suggestAccountGroup(query, limit);
ProjectControl projectControl = null;
if (project != null) {
try {
projectControl = projectControlFactory.controlFor(project);
} catch (NoSuchProjectException e) {
return Collections.emptyList();
}
}
return suggestAccountGroup(projectControl, query, limit);
}
});
}
private List<GroupReference> suggestAccountGroup(final String query, final int limit) {
private List<GroupReference> suggestAccountGroup(
@Nullable final ProjectControl projectControl, final String query, final int limit) {
final int n = limit <= 0 ? 10 : Math.min(limit, 10);
List<GroupReference> out = Lists.newArrayListWithCapacity(n);
for (GroupReference g : groupBackend.suggest(query)) {
try {
if (groupControlFactory.controlFor(g.getUUID()).isVisible()) {
if (groupControlFactory.controlFor(g.getUUID()).isVisible()
|| (GroupBackends.isExactSuggestion(g, query)
&& projectControl != null
&& projectControl.isOwnerAnyRef())) {
out.add(g);
if (out.size() == n) {
break;
@@ -238,7 +263,7 @@ class SuggestServiceImpl extends BaseServiceImplementation implements
reviewer.add(new ReviewerInfo(a));
}
final List<GroupReference> suggestedAccountGroups =
suggestAccountGroup(query, limit);
suggestAccountGroup(changeControl.getProjectControl(), query, limit);
for (final GroupReference g : suggestedAccountGroups) {
if (suggestGroupAsReviewer(changeControl.getProject().getNameKey(), g)) {
reviewer.add(new ReviewerInfo(g));

View File

@@ -144,7 +144,7 @@ public class LdapGroupBackend implements GroupBackend {
@Override
public boolean isVisibleToAll() {
return true;
return false;
}
};
}