src/main/java/com/gitblit/models/UserModel.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/com/gitblit/wicket/pages/EditTicketPage.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/com/gitblit/wicket/pages/NewTicketPage.html | ●●●●● patch | view | raw | blame | history | |
src/main/java/com/gitblit/wicket/pages/NewTicketPage.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/com/gitblit/wicket/pages/TicketPage.java | ●●●●● patch | view | raw | blame | history |
src/main/java/com/gitblit/models/UserModel.java
@@ -449,9 +449,15 @@ public boolean canEdit(TicketModel ticket, RepositoryModel repository) { return isAuthenticated() && (username.equals(ticket.createdBy) || username.equals(ticket.responsible) || canPush(repository)); (canPush(repository) || (ticket != null && username.equals(ticket.responsible)) || (ticket != null && username.equals(ticket.createdBy))); } public boolean canAdmin(TicketModel ticket, RepositoryModel repository) { return isAuthenticated() && (canPush(repository) || ticket != null && username.equals(ticket.responsible)); } public boolean canReviewPatchset(RepositoryModel model) { src/main/java/com/gitblit/wicket/pages/EditTicketPage.java
@@ -250,71 +250,77 @@ status.add(new DropDownChoice<TicketModel.Status>("status", statusModel, statusChoices)); form.add(status); // responsible Set<String> userlist = new TreeSet<String>(ticket.getParticipants()); if (currentUser.canAdmin(ticket, getRepositoryModel())) { // responsible Set<String> userlist = new TreeSet<String>(ticket.getParticipants()); for (RegistrantAccessPermission rp : app().repositories().getUserAccessPermissions(getRepositoryModel())) { if (rp.permission.atLeast(AccessPermission.PUSH) && !rp.isTeam()) { userlist.add(rp.registrant); } } List<TicketResponsible> responsibles = new ArrayList<TicketResponsible>(); for (String username : userlist) { UserModel user = app().users().getUserModel(username); if (user != null) { TicketResponsible responsible = new TicketResponsible(user); responsibles.add(responsible); if (user.username.equals(ticket.responsible)) { responsibleModel.setObject(responsible); for (RegistrantAccessPermission rp : app().repositories().getUserAccessPermissions(getRepositoryModel())) { if (rp.permission.atLeast(AccessPermission.PUSH) && !rp.isTeam()) { userlist.add(rp.registrant); } } } Collections.sort(responsibles); responsibles.add(new TicketResponsible(NIL, "", "")); Fragment responsible = new Fragment("responsible", "responsibleFragment", this); responsible.add(new DropDownChoice<TicketResponsible>("responsible", responsibleModel, responsibles)); form.add(responsible.setVisible(!responsibles.isEmpty())); // milestone List<TicketMilestone> milestones = app().tickets().getMilestones(getRepositoryModel(), Status.Open); for (TicketMilestone milestone : milestones) { if (milestone.name.equals(ticket.milestone)) { milestoneModel.setObject(milestone); break; List<TicketResponsible> responsibles = new ArrayList<TicketResponsible>(); for (String username : userlist) { UserModel user = app().users().getUserModel(username); if (user != null) { TicketResponsible responsible = new TicketResponsible(user); responsibles.add(responsible); if (user.username.equals(ticket.responsible)) { responsibleModel.setObject(responsible); } } } } if (milestoneModel.getObject() == null && !StringUtils.isEmpty(ticket.milestone)) { // ensure that this unrecognized milestone is listed // so that we get the <nil> selection. TicketMilestone tms = new TicketMilestone(ticket.milestone); milestones.add(tms); milestoneModel.setObject(tms); } if (!milestones.isEmpty()) { milestones.add(new TicketMilestone(NIL)); } Collections.sort(responsibles); responsibles.add(new TicketResponsible(NIL, "", "")); Fragment responsible = new Fragment("responsible", "responsibleFragment", this); responsible.add(new DropDownChoice<TicketResponsible>("responsible", responsibleModel, responsibles)); form.add(responsible.setVisible(!responsibles.isEmpty())); Fragment milestone = new Fragment("milestone", "milestoneFragment", this); milestone.add(new DropDownChoice<TicketMilestone>("milestone", milestoneModel, milestones)); form.add(milestone.setVisible(!milestones.isEmpty())); // mergeTo (integration branch) List<String> branches = new ArrayList<String>(); for (String branch : getRepositoryModel().getLocalBranches()) { // exclude ticket branches if (!branch.startsWith(Constants.R_TICKET)) { branches.add(Repository.shortenRefName(branch)); // milestone List<TicketMilestone> milestones = app().tickets().getMilestones(getRepositoryModel(), Status.Open); for (TicketMilestone milestone : milestones) { if (milestone.name.equals(ticket.milestone)) { milestoneModel.setObject(milestone); break; } } if (milestoneModel.getObject() == null && !StringUtils.isEmpty(ticket.milestone)) { // ensure that this unrecognized milestone is listed // so that we get the <nil> selection. TicketMilestone tms = new TicketMilestone(ticket.milestone); milestones.add(tms); milestoneModel.setObject(tms); } if (!milestones.isEmpty()) { milestones.add(new TicketMilestone(NIL)); } Fragment milestone = new Fragment("milestone", "milestoneFragment", this); milestone.add(new DropDownChoice<TicketMilestone>("milestone", milestoneModel, milestones)); form.add(milestone.setVisible(!milestones.isEmpty())); // mergeTo (integration branch) List<String> branches = new ArrayList<String>(); for (String branch : getRepositoryModel().getLocalBranches()) { // exclude ticket branches if (!branch.startsWith(Constants.R_TICKET)) { branches.add(Repository.shortenRefName(branch)); } } branches.remove(Repository.shortenRefName(getRepositoryModel().HEAD)); branches.add(0, Repository.shortenRefName(getRepositoryModel().HEAD)); Fragment mergeto = new Fragment("mergeto", "mergeToFragment", this); mergeto.add(new DropDownChoice<String>("mergeto", mergeToModel, branches)); form.add(mergeto.setVisible(!branches.isEmpty())); } else { // user can not admin this ticket form.add(new Label("responsible").setVisible(false)); form.add(new Label("milestone").setVisible(false)); form.add(new Label("mergeto").setVisible(false)); } branches.remove(Repository.shortenRefName(getRepositoryModel().HEAD)); branches.add(0, Repository.shortenRefName(getRepositoryModel().HEAD)); Fragment mergeto = new Fragment("mergeto", "mergeToFragment", this); mergeto.add(new DropDownChoice<String>("mergeto", mergeToModel, branches)); form.add(mergeto.setVisible(!branches.isEmpty())); form.add(new Button("update")); Button cancel = new Button("cancel") { private static final long serialVersionUID = 1L; src/main/java/com/gitblit/wicket/pages/NewTicketPage.html
@@ -41,6 +41,7 @@ <tr><th><wicket:message key="gb.type"></wicket:message><span style="color:red;">*</span></th><td class="edit"><select class="input-large" wicket:id="type"></select></td></tr> <tr wicket:id="responsible"></tr> <tr wicket:id="milestone"></tr> <tr wicket:id="mergeto"></tr> </table> </div> </div> @@ -62,5 +63,9 @@ <th><wicket:message key="gb.milestone"></wicket:message></th><td class="edit"><select class="input-large" wicket:id="milestone"></select></td> </wicket:fragment> <wicket:fragment wicket:id="mergeToFragment"> <th><wicket:message key="gb.mergeTo"></wicket:message></th><td class="edit"><select class="input-large" wicket:id="mergeto"></select></td> </wicket:fragment> </wicket:extend> </html> src/main/java/com/gitblit/wicket/pages/NewTicketPage.java
@@ -29,7 +29,9 @@ import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.eclipse.jgit.lib.Repository; import com.gitblit.Constants; import com.gitblit.Constants.AccessPermission; import com.gitblit.models.RegistrantAccessPermission; import com.gitblit.models.TicketModel; @@ -61,6 +63,8 @@ private IModel<String> topicModel; private IModel<String> mergeToModel; private IModel<TicketResponsible> responsibleModel; private IModel<TicketMilestone> milestoneModel; @@ -83,6 +87,7 @@ typeModel = Model.of(TicketModel.Type.defaultType); titleModel = Model.of(); topicModel = Model.of(); mergeToModel = Model.of(Repository.shortenRefName(getRepositoryModel().HEAD)); responsibleModel = Model.of(); milestoneModel = Model.of(); @@ -123,6 +128,12 @@ change.setField(Field.milestone, milestone.name); } // integration branch String mergeTo = mergeToModel.getObject(); if (!StringUtils.isEmpty(mergeTo)) { change.setField(Field.mergeTo, mergeTo); } TicketModel ticket = app().tickets().createTicket(getRepositoryModel(), 0L, change); if (ticket != null) { TicketNotifier notifier = app().tickets().createNotifier(); @@ -149,7 +160,7 @@ descriptionEditor.setRepository(repositoryName); form.add(descriptionEditor); if (currentUser != null && currentUser.isAuthenticated && currentUser.canPush(getRepositoryModel())) { if (currentUser.canAdmin(null, getRepositoryModel())) { // responsible List<TicketResponsible> responsibles = new ArrayList<TicketResponsible>(); for (RegistrantAccessPermission rp : app().repositories().getUserAccessPermissions(getRepositoryModel())) { @@ -170,10 +181,26 @@ Fragment milestone = new Fragment("milestone", "milestoneFragment", this); milestone.add(new DropDownChoice<TicketMilestone>("milestone", milestoneModel, milestones)); form.add(milestone.setVisible(!milestones.isEmpty())); // integration branch List<String> branches = new ArrayList<String>(); for (String branch : getRepositoryModel().getLocalBranches()) { // exclude ticket branches if (!branch.startsWith(Constants.R_TICKET)) { branches.add(Repository.shortenRefName(branch)); } } branches.remove(Repository.shortenRefName(getRepositoryModel().HEAD)); branches.add(0, Repository.shortenRefName(getRepositoryModel().HEAD)); Fragment mergeto = new Fragment("mergeto", "mergeToFragment", this); mergeto.add(new DropDownChoice<String>("mergeto", mergeToModel, branches)); form.add(mergeto.setVisible(!branches.isEmpty())); } else { // user does not have permission to assign milestone or responsible // user does not have permission to assign milestone, responsible, or mergeto form.add(new Label("responsible").setVisible(false)); form.add(new Label("milestone").setVisible(false)); form.add(new Label("mergeto").setVisible(false)); } form.add(new Button("create")); src/main/java/com/gitblit/wicket/pages/TicketPage.java
@@ -327,7 +327,7 @@ * UPDATE FORM (DISCUSSION TAB) */ if (user.canEdit(ticket, repository) && app().tickets().isAcceptingTicketUpdates(repository)) { if (ticket.isOpen()) { if (user.canAdmin(ticket, repository) && ticket.isOpen()) { /* * OPEN TICKET */