]> source.dussan.org Git - redmine.git/commitdiff
Adds subtasks to GET /issues/:id API (#5338).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 4 Dec 2010 13:02:14 +0000 (13:02 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 4 Dec 2010 13:02:14 +0000 (13:02 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4465 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/helpers/issues_helper.rb
app/views/issues/show.apit
test/integration/api_test/issues_test.rb

index 321041b7c28702bb0333c16bc96f523a6b9177ed..ce23668ef7bcb691b5ed8f5b2264b460ba4771e7 100644 (file)
@@ -189,6 +189,20 @@ module IssuesHelper
     end
   end
   
+  # Renders issue children recursively
+  def render_api_issue_children(issue, api)
+    return if issue.leaf?
+    api.array :children do
+      issue.children.each do |child|
+        api.issue(:id => child.id) do
+          api.tracker(:id => child.tracker_id, :name => child.tracker.name) unless child.tracker.nil?
+          api.subject child.subject
+          render_api_issue_children(child, api)
+        end
+      end
+    end
+  end
+  
   def issues_to_csv(issues, project = nil)
     ic = Iconv.new(l(:general_csv_encoding), 'UTF-8')    
     decimal_separator = l(:general_csv_decimal_separator)
index 224026d1f67bbad4bfbc32374776aa4c08906e51..001cabe11b091660f5e78bbb9162398f23ef069a 100644 (file)
@@ -29,6 +29,8 @@ api.issue do
   api.created_on @issue.created_on
   api.updated_on @issue.updated_on
   
+  render_api_issue_children(@issue, api)
+  
   api.array :relations do
        @issue.relations.select {|r| r.other_issue(@issue).visible? }.each do |relation|
                api.relation(:id => relation.id, :issue_id => relation.other_issue(@issue).id, :relation_type => relation.relation_type_for(@issue), :delay => relation.delay)
index d7bc785c0c3b3604321266edf1e8f1fa12850bdc..0ef9de8e242433fe571b3b0430c58b5063e8fc03 100644 (file)
@@ -89,6 +89,60 @@ class ApiTest::IssuesTest < ActionController::IntegrationTest
   context "/issues/6.json" do
     should_allow_api_authentication(:get, "/issues/6.json")
   end
+  
+  context "GET /issues/:id" do
+    context "with subtasks" do
+      setup do
+        @c1 = Issue.generate!(:status_id => 1, :subject => "child c1", :tracker_id => 1, :project_id => 1, :parent_issue_id => 1)
+        @c2 = Issue.generate!(:status_id => 1, :subject => "child c2", :tracker_id => 1, :project_id => 1, :parent_issue_id => 1)
+        @c3 = Issue.generate!(:status_id => 1, :subject => "child c3", :tracker_id => 1, :project_id => 1, :parent_issue_id => @c1.id)
+      end
+      
+      context ".xml" do
+        should "display children" do
+          get '/issues/1.xml'
+          
+          assert_tag :tag => 'issue', 
+            :child => {
+              :tag => 'children',
+              :children => {:count => 2},
+              :child => {
+                :tag => 'issue',
+                :attributes => {:id => @c1.id.to_s},
+                :child => {
+                  :tag => 'subject',
+                  :content => 'child c1',
+                  :sibling => {
+                    :tag => 'children',
+                    :children => {:count => 1},
+                    :child => {
+                      :tag => 'issue',
+                      :attributes => {:id => @c3.id.to_s}
+                    }
+                  }
+                }
+              }
+            }
+        end
+        
+        context ".json" do
+          should "display children" do
+            get '/issues/1.json'
+            
+            json = ActiveSupport::JSON.decode(response.body)
+            assert_equal([
+              {
+                'id' => @c1.id, 'subject' => 'child c1', 'tracker' => {'id' => 1, 'name' => 'Bug'},
+                'children' => [{ 'id' => @c3.id, 'subject' => 'child c3', 'tracker' => {'id' => 1, 'name' => 'Bug'} }]
+              },
+              { 'id' => @c2.id, 'subject' => 'child c2', 'tracker' => {'id' => 1, 'name' => 'Bug'} }
+              ],
+              json['issue']['children'])
+          end
+        end
+      end
+    end
+  end
 
   context "POST /issues.xml" do
     should_allow_api_authentication(:post,