James Moger
2014-03-08 cc1c3ffa7d261d2e8bcdc600253528e8d09e1d06
Allow selection of integration branch in new ticket page
5 files modified
170 ■■■■■ changed files
src/main/java/com/gitblit/models/UserModel.java 12 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/EditTicketPage.java 120 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/NewTicketPage.html 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/NewTicketPage.java 31 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/TicketPage.java 2 ●●● 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
                 */