Feature #2009 » manual-changeset-relation.patch
| app/controllers/changeset_relations_controller.rb | ||
|---|---|---|
| 1 | 
    class ChangesetRelationsController < ApplicationController  | 
|
| 2 | ||
| 3 | ||
| 4 | 
    before_filter :find_project, :authorize  | 
|
| 5 | 
     | 
|
| 6 | 
    def new  | 
|
| 7 | 
        @changeset = Changeset.find(:first, :conditions => {:revision => params[:changeset][:revision], :repository_id => @project.repository})
   | 
|
| 8 | 
    if @changeset.nil?  | 
|
| 9 | 
    @changeset = Changeset.new(:revision => params[:changeset][:revision])  | 
|
| 10 | 
    @changeset.errors.add l(:revision_not_found_error)  | 
|
| 11 | 
    else  | 
|
| 12 | 
    @changeset.issues << @issue  | 
|
| 13 | 
    @changeset.save if request.post?  | 
|
| 14 | 
    end  | 
|
| 15 | 
    @issue.reload  | 
|
| 16 | 
    respond_to do |format|  | 
|
| 17 | 
          format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
   | 
|
| 18 | 
    format.js do  | 
|
| 19 | 
    render :update do |page|  | 
|
| 20 | 
              page.replace_html "changeset_list", :partial => 'issues/changeset_list', :locals => { :changesets => @issue.changesets}
   | 
|
| 21 | 
              page.replace_html "issue-changesets-list", :partial => 'issues/changesets', :locals => { :changesets => @issue.changesets}
   | 
|
| 22 | 
    if @changeset.errors.empty?  | 
|
| 23 | 
                page << "$('changeset_revision').value = ''"
   | 
|
| 24 | 
    end  | 
|
| 25 | 
    end  | 
|
| 26 | 
    end  | 
|
| 27 | 
    end  | 
|
| 28 | 
    end  | 
|
| 29 | 
     | 
|
| 30 | 
    def destroy  | 
|
| 31 | 
    changeset = Changeset.find(params[:id])  | 
|
| 32 | 
    if request.post? && ! changeset.nil? && changeset.issues.include?(@issue)  | 
|
| 33 | 
    changeset.issues.delete(@issue)  | 
|
| 34 | 
    @issue.reload  | 
|
| 35 | 
    end  | 
|
| 36 | 
    respond_to do |format|  | 
|
| 37 | 
          format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
   | 
|
| 38 | 
    format.js do  | 
|
| 39 | 
    render(:update) do |page|  | 
|
| 40 | 
              page.replace_html "changeset_list", :partial => 'issues/changeset_list', :locals => { :changesets => @issue.changesets}
   | 
|
| 41 | 
              page.replace_html "issue-changesets-list", :partial => 'issues/changesets', :locals => { :changesets => @issue.changesets}
   | 
|
| 42 | 
    end  | 
|
| 43 | 
    end  | 
|
| 44 | 
    end  | 
|
| 45 | 
    end  | 
|
| 46 | ||
| 47 | ||
| 48 | 
    private  | 
|
| 49 | 
    def find_project  | 
|
| 50 | 
    @issue = Issue.find(params[:issue_id])  | 
|
| 51 | 
    @project = @issue.project  | 
|
| 52 | 
    rescue ActiveRecord::RecordNotFound  | 
|
| 53 | 
    render_404  | 
|
| 54 | 
    end  | 
|
| 55 | 
    end  | 
|
| app/helpers/changeset_relations_helper.rb | ||
|---|---|---|
| 1 | 
    module ChangesetRelationsHelper  | 
|
| 2 | 
    end  | 
|
| app/views/changeset_relations/_form.html.erb | ||
|---|---|---|
| 1 | 
    <%= error_messages_for 'changeset' %>  | 
|
| 2 | ||
| 3 | 
    <p><%= l(:label_revision) %> <%= f.text_field :revision, :size => 6 %>  | 
|
| 4 | 
    <%= submit_tag l(:button_add) %>  | 
|
| 5 | 
    <%= toggle_link l(:button_cancel), 'new-changeset-form'%>  | 
|
| 6 | 
    </p>  | 
|
| 7 | ||
| 8 | 
    <%= javascript_tag "setPredecessorFieldsVisibility();" %>  | 
|
| app/views/issues/_changeset_list.rhtml | ||
|---|---|---|
| 1 | 
    <div class="contextual">  | 
|
| 2 | 
    <% if authorize_for('changeset_relations', 'new') %>
   | 
|
| 3 | 
    <%= toggle_link l(:button_add), 'new-changeset-form'%>  | 
|
| 4 | 
    <% end %>  | 
|
| 5 | 
    </div>  | 
|
| 6 | ||
| 7 | 
    <p><strong><%=l(:label_associated_revisions)%></strong></p>  | 
|
| 8 | ||
| 9 | 
    <% if changesets.any? %>  | 
|
| 10 | 
    <table style="width:100%">  | 
|
| 11 | 
    <% changesets.each do |changeset| %>  | 
|
| 12 | 
    <tr>  | 
|
| 13 | 
      <td><%= link_to("#{l(:label_revision)} #{changeset.revision}",
   | 
|
| 14 | 
    :controller => 'repositories', :action => 'revision', :id => changeset.project, :rev => changeset.revision) %>  | 
|
| 15 | 
    </td>  | 
|
| 16 | 
    <td><%= h changeset.author %></td>  | 
|
| 17 | 
      <td><%= h truncate changeset.comments.split("\n").first, :length => 40 %></td>
   | 
|
| 18 | 
    <td><%= format_date(changeset.committed_on) %></td>  | 
|
| 19 | 
      <td><%= link_to_remote(image_tag('delete.png'), { :url => {:controller => 'changeset_relations', :action => 'destroy', :issue_id => @issue, :id => changeset},
   | 
|
| 20 | 
    :method => :post  | 
|
| 21 | 
                                                    }, :title => l(:label_changeset_delete)) if authorize_for('changeset_relations', 'destroy') %>
   | 
|
| 22 | 
    </td>  | 
|
| 23 | 
    </tr>  | 
|
| 24 | 
    <% end %>  | 
|
| 25 | 
    </table>  | 
|
| 26 | 
    <% end %>  | 
|
| 27 | ||
| 28 | 
    <% remote_form_for(:changeset, @changeset,  | 
|
| 29 | 
                     :url => {:controller => 'changeset_relations', :action => 'new', :issue_id => @issue},
   | 
|
| 30 | 
    :method => :post,  | 
|
| 31 | 
                     :html => {:id => 'new-changeset-form', :style => (@changeset ? '' : 'display: none;')}) do |f| %>
   | 
|
| 32 | 
    <%= render :partial => 'changeset_relations/form', :locals => {:f => f}%>
   | 
|
| 33 | 
    <% end %>  | 
|
| app/views/issues/show.rhtml | ||
|---|---|---|
| 70 | 70 | 
    </div>  | 
| 71 | 71 | 
    <% end %>  | 
| 72 | 72 | |
| 73 | 
    <% if !@project.repository.nil? && (authorize_for('changeset_relations', 'new') || @changesets.relations.any?) %>
   | 
|
| 74 | 
    <hr />  | 
|
| 75 | 
    <div id="changeset_list">  | 
|
| 76 | 
    <%= render :partial => 'changeset_list', :locals => { :changesets => @changesets} %>
   | 
|
| 77 | 
    </div>  | 
|
| 78 | 
    <% end %>  | 
|
| 79 | ||
| 73 | 80 | 
    <% if User.current.allowed_to?(:add_issue_watchers, @project) ||  | 
| 74 | 81 | 
    (@issue.watchers.any? && User.current.allowed_to?(:view_issue_watchers, @project)) %>  | 
| 75 | 82 | 
    <hr />  | 
| ... | ... | |
| 83 | 90 | 
    <% if @changesets.any? && User.current.allowed_to?(:view_changesets, @project) %>  | 
| 84 | 91 | 
    <div id="issue-changesets">  | 
| 85 | 92 | 
    <h3><%=l(:label_associated_revisions)%></h3>  | 
| 93 | 
    <div id="issue-changesets-list">  | 
|
| 86 | 94 | 
    <%= render :partial => 'changesets', :locals => { :changesets => @changesets} %>
   | 
| 87 | 95 | 
    </div>  | 
| 96 | 
    </div>  | 
|
| 88 | 97 | 
    <% end %>  | 
| 89 | 98 | |
| 90 | 99 | 
    <% if @journals.any? %>  | 
| config/locales/de.yml | ||
|---|---|---|
| 833 | 833 | 
    label_view_all_revisions: View all revisions  | 
| 834 | 834 | 
    label_tag: Tag  | 
| 835 | 835 | 
    label_branch: Branch  | 
| 836 | 
    revision_not_found_error: Revision nicht gefunden im SCM des Projektes  | 
|
| config/locales/en.yml | ||
|---|---|---|
| 804 | 804 | 
    enumeration_issue_priorities: Issue priorities  | 
| 805 | 805 | 
    enumeration_doc_categories: Document categories  | 
| 806 | 806 | 
    enumeration_activities: Activities (time tracking)  | 
| 807 | 
    revision_not_found_error: Revision not found at project SCM  | 
|
| db/migrate/20090821144826_add_manage_changeset_relations_permission.rb | ||
|---|---|---|
| 1 | 
    class AddManageChangesetRelationsPermission < ActiveRecord::Migration  | 
|
| 2 | 
    def self.up  | 
|
| 3 | 
    Role.find(:all).each do |r|  | 
|
| 4 | 
    r.add_permission!(:manage_changeset_relations) if r.has_permission?(:manage_issue_relations)  | 
|
| 5 | 
    end  | 
|
| 6 | 
    end  | 
|
| 7 | ||
| 8 | 
    def self.down  | 
|
| 9 | 
    Role.find(:all).each do |r|  | 
|
| 10 | 
    r.remove_permission!(:manage_changeset_relations)  | 
|
| 11 | 
    end  | 
|
| 12 | 
    end  | 
|
| 13 | 
    end  | 
|
| lib/redmine.rb | ||
|---|---|---|
| 38 | 38 | 
        map.permission :add_issues, {:issues => :new}
   | 
| 39 | 39 | 
        map.permission :edit_issues, {:issues => [:edit, :reply, :bulk_edit]}
   | 
| 40 | 40 | 
        map.permission :manage_issue_relations, {:issue_relations => [:new, :destroy]}
   | 
| 41 | 
        map.permission :manage_changeset_relations, {:changeset_relations => [:new, :destroy]}
   | 
|
| 41 | 42 | 
        map.permission :add_issue_notes, {:issues => [:edit, :reply]}
   | 
| 42 | 43 | 
        map.permission :edit_issue_notes, {:journals => :edit}, :require => :loggedin
   | 
| 43 | 44 | 
        map.permission :edit_own_issue_notes, {:journals => :edit}, :require => :loggedin
   | 
| test/functional/changeset_relations_controller_test.rb | ||
|---|---|---|
| 1 | 
    require 'test_helper'  | 
|
| 2 | ||
| 3 | 
    class ChangesetRelationsControllerTest < ActionController::TestCase  | 
|
| 4 | 
    # Replace this with your real tests.  | 
|
| 5 | 
    test "the truth" do  | 
|
| 6 | 
    assert true  | 
|
| 7 | 
    end  | 
|
| 8 | 
    end  | 
|