You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

EditTeamPage.java 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /*
  2. * Copyright 2011 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit.wicket.pages;
  17. import java.text.MessageFormat;
  18. import java.util.ArrayList;
  19. import java.util.Collections;
  20. import java.util.HashSet;
  21. import java.util.Iterator;
  22. import java.util.List;
  23. import java.util.Set;
  24. import org.apache.wicket.PageParameters;
  25. import org.apache.wicket.behavior.SimpleAttributeModifier;
  26. import org.apache.wicket.extensions.markup.html.form.palette.Palette;
  27. import org.apache.wicket.markup.html.form.Button;
  28. import org.apache.wicket.markup.html.form.CheckBox;
  29. import org.apache.wicket.markup.html.form.Form;
  30. import org.apache.wicket.markup.html.form.TextField;
  31. import org.apache.wicket.model.CompoundPropertyModel;
  32. import org.apache.wicket.model.IModel;
  33. import org.apache.wicket.model.Model;
  34. import org.apache.wicket.model.util.CollectionModel;
  35. import org.apache.wicket.model.util.ListModel;
  36. import com.gitblit.Constants.RegistrantType;
  37. import com.gitblit.GitBlitException;
  38. import com.gitblit.Keys;
  39. import com.gitblit.models.RegistrantAccessPermission;
  40. import com.gitblit.models.TeamModel;
  41. import com.gitblit.utils.StringUtils;
  42. import com.gitblit.wicket.RequiresAdminRole;
  43. import com.gitblit.wicket.StringChoiceRenderer;
  44. import com.gitblit.wicket.WicketUtils;
  45. import com.gitblit.wicket.panels.BulletListPanel;
  46. import com.gitblit.wicket.panels.RegistrantPermissionsPanel;
  47. @RequiresAdminRole
  48. public class EditTeamPage extends RootSubPage {
  49. private final boolean isCreate;
  50. private IModel<String> mailingLists;
  51. public EditTeamPage() {
  52. // create constructor
  53. super();
  54. isCreate = true;
  55. setupPage(new TeamModel(""));
  56. setStatelessHint(false);
  57. setOutputMarkupId(true);
  58. }
  59. public EditTeamPage(PageParameters params) {
  60. // edit constructor
  61. super(params);
  62. isCreate = false;
  63. String name = WicketUtils.getTeamname(params);
  64. TeamModel model = app().users().getTeamModel(name);
  65. setupPage(model);
  66. setStatelessHint(false);
  67. setOutputMarkupId(true);
  68. }
  69. @Override
  70. protected boolean requiresPageMap() {
  71. return true;
  72. }
  73. @Override
  74. protected Class<? extends BasePage> getRootNavPageClass() {
  75. return UsersPage.class;
  76. }
  77. protected void setupPage(final TeamModel teamModel) {
  78. if (isCreate) {
  79. super.setupPage(getString("gb.newTeam"), "");
  80. } else {
  81. super.setupPage(getString("gb.edit"), teamModel.name);
  82. }
  83. CompoundPropertyModel<TeamModel> model = new CompoundPropertyModel<TeamModel>(teamModel);
  84. List<String> repos = getAccessRestrictedRepositoryList(true, null);
  85. List<String> teamUsers = new ArrayList<String>(teamModel.users);
  86. Collections.sort(teamUsers);
  87. List<String> preReceiveScripts = new ArrayList<String>();
  88. List<String> postReceiveScripts = new ArrayList<String>();
  89. final String oldName = teamModel.name;
  90. final List<RegistrantAccessPermission> permissions = teamModel.getRepositoryPermissions();
  91. // users palette
  92. final Palette<String> users = new Palette<String>("users", new ListModel<String>(
  93. new ArrayList<String>(teamUsers)), new CollectionModel<String>(app().users()
  94. .getAllUsernames()), new StringChoiceRenderer(), 10, false);
  95. // pre-receive palette
  96. if (teamModel.preReceiveScripts != null) {
  97. preReceiveScripts.addAll(teamModel.preReceiveScripts);
  98. }
  99. final Palette<String> preReceivePalette = new Palette<String>("preReceiveScripts",
  100. new ListModel<String>(preReceiveScripts), new CollectionModel<String>(app().repositories()
  101. .getPreReceiveScriptsUnused(null)), new StringChoiceRenderer(),
  102. 12, true);
  103. // post-receive palette
  104. if (teamModel.postReceiveScripts != null) {
  105. postReceiveScripts.addAll(teamModel.postReceiveScripts);
  106. }
  107. final Palette<String> postReceivePalette = new Palette<String>("postReceiveScripts",
  108. new ListModel<String>(postReceiveScripts), new CollectionModel<String>(app().repositories()
  109. .getPostReceiveScriptsUnused(null)), new StringChoiceRenderer(),
  110. 12, true);
  111. Form<TeamModel> form = new Form<TeamModel>("editForm", model) {
  112. private static final long serialVersionUID = 1L;
  113. /*
  114. * (non-Javadoc)
  115. *
  116. * @see org.apache.wicket.markup.html.form.Form#onSubmit()
  117. */
  118. @Override
  119. protected void onSubmit() {
  120. String teamname = teamModel.name;
  121. if (StringUtils.isEmpty(teamname)) {
  122. error(getString("gb.pleaseSetTeamName"));
  123. return;
  124. }
  125. if (isCreate) {
  126. TeamModel model = app().users().getTeamModel(teamname);
  127. if (model != null) {
  128. error(MessageFormat.format(getString("gb.teamNameUnavailable"), teamname));
  129. return;
  130. }
  131. }
  132. // update team permissions
  133. for (RegistrantAccessPermission repositoryPermission : permissions) {
  134. teamModel.setRepositoryPermission(repositoryPermission.registrant, repositoryPermission.permission);
  135. }
  136. Iterator<String> selectedUsers = users.getSelectedChoices();
  137. List<String> members = new ArrayList<String>();
  138. while (selectedUsers.hasNext()) {
  139. members.add(selectedUsers.next().toLowerCase());
  140. }
  141. teamModel.users.clear();
  142. teamModel.users.addAll(members);
  143. // set mailing lists
  144. String ml = mailingLists.getObject();
  145. if (!StringUtils.isEmpty(ml)) {
  146. Set<String> list = new HashSet<String>();
  147. for (String address : ml.split("(,|\\s)")) {
  148. if (StringUtils.isEmpty(address)) {
  149. continue;
  150. }
  151. list.add(address.toLowerCase());
  152. }
  153. teamModel.mailingLists.clear();
  154. teamModel.mailingLists.addAll(list);
  155. }
  156. // pre-receive scripts
  157. List<String> preReceiveScripts = new ArrayList<String>();
  158. Iterator<String> pres = preReceivePalette.getSelectedChoices();
  159. while (pres.hasNext()) {
  160. preReceiveScripts.add(pres.next());
  161. }
  162. teamModel.preReceiveScripts.clear();
  163. teamModel.preReceiveScripts.addAll(preReceiveScripts);
  164. // post-receive scripts
  165. List<String> postReceiveScripts = new ArrayList<String>();
  166. Iterator<String> post = postReceivePalette.getSelectedChoices();
  167. while (post.hasNext()) {
  168. postReceiveScripts.add(post.next());
  169. }
  170. teamModel.postReceiveScripts.clear();
  171. teamModel.postReceiveScripts.addAll(postReceiveScripts);
  172. try {
  173. app().gitblit().updateTeamModel(oldName, teamModel, isCreate);
  174. } catch (GitBlitException e) {
  175. error(e.getMessage());
  176. return;
  177. }
  178. setRedirect(false);
  179. if (isCreate) {
  180. // create another team
  181. info(MessageFormat.format(getString("gb.teamCreated"),
  182. teamModel.name));
  183. }
  184. // back to users page
  185. setResponsePage(UsersPage.class);
  186. }
  187. };
  188. // do not let the browser pre-populate these fields
  189. form.add(new SimpleAttributeModifier("autocomplete", "off"));
  190. // not all user services support manipulating team memberships
  191. boolean editMemberships = app().authentication().supportsTeamMembershipChanges(teamModel);
  192. // field names reflective match TeamModel fields
  193. form.add(new TextField<String>("name"));
  194. form.add(new CheckBox("canAdmin"));
  195. form.add(new CheckBox("canFork").setEnabled(app().settings().getBoolean(Keys.web.allowForking, true)));
  196. form.add(new CheckBox("canCreate"));
  197. form.add(users.setEnabled(editMemberships));
  198. mailingLists = new Model<String>(teamModel.mailingLists == null ? ""
  199. : StringUtils.flattenStrings(teamModel.mailingLists, " "));
  200. form.add(new TextField<String>("mailingLists", mailingLists));
  201. form.add(new RegistrantPermissionsPanel("repositories", RegistrantType.REPOSITORY,
  202. repos, permissions, getAccessPermissions()));
  203. form.add(preReceivePalette);
  204. form.add(new BulletListPanel("inheritedPreReceive", "inherited", app().repositories()
  205. .getPreReceiveScriptsInherited(null)));
  206. form.add(postReceivePalette);
  207. form.add(new BulletListPanel("inheritedPostReceive", "inherited", app().repositories()
  208. .getPostReceiveScriptsInherited(null)));
  209. form.add(new Button("save"));
  210. Button cancel = new Button("cancel") {
  211. private static final long serialVersionUID = 1L;
  212. @Override
  213. public void onSubmit() {
  214. setResponsePage(UsersPage.class);
  215. }
  216. };
  217. cancel.setDefaultFormProcessing(false);
  218. form.add(cancel);
  219. add(form);
  220. }
  221. }