##// END OF EJS Templates
Ability to load relations on /issues API (#7366)....
Jean-Philippe Lang -
r6193:521eaa79cb56
parent child
Show More
@@ -90,7 +90,9 class IssuesController < ApplicationController
90
90
91 respond_to do |format|
91 respond_to do |format|
92 format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? }
92 format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? }
93 format.api
93 format.api {
94 Issue.load_relations(@issues) if include_in_api_response?('relations')
95 }
94 format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") }
96 format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") }
95 format.csv { send_data(issues_to_csv(@issues, @project), :type => 'text/csv; header=present', :filename => 'export.csv') }
97 format.csv { send_data(issues_to_csv(@issues, @project), :type => 'text/csv; header=present', :filename => 'export.csv') }
96 format.pdf { send_data(issues_to_pdf(@issues, @project, @query), :type => 'application/pdf', :filename => 'export.pdf') }
98 format.pdf { send_data(issues_to_pdf(@issues, @project, @query), :type => 'application/pdf', :filename => 'export.pdf') }
@@ -508,7 +508,17 class Issue < ActiveRecord::Base
508 end
508 end
509
509
510 def relations
510 def relations
511 (relations_from + relations_to).sort
511 @relations ||= (relations_from + relations_to).sort
512 end
513
514 # Preloads relations for a collection of issues
515 def self.load_relations(issues)
516 if issues.any?
517 relations = IssueRelation.all(:conditions => ["issue_from_id IN (:ids) OR issue_to_id IN (:ids)", {:ids => issues.map(&:id)}])
518 issues.each do |issue|
519 issue.instance_variable_set "@relations", relations.select {|r| r.issue_from_id == issue.id || r.issue_to_id == issue.id}
520 end
521 end
512 end
522 end
513
523
514 # Finds an issue relation given its id.
524 # Finds an issue relation given its id.
@@ -23,6 +23,12 api.array :issues, api_meta(:total_count => @issue_count, :offset => @offset, :l
23
23
24 api.created_on issue.created_on
24 api.created_on issue.created_on
25 api.updated_on issue.updated_on
25 api.updated_on issue.updated_on
26
27 api.array :relations do
28 issue.relations.each do |relation|
29 api.relation(:id => relation.id, :issue_id => relation.issue_from_id, :issue_to_id => relation.issue_to_id, :relation_type => relation.relation_type, :delay => relation.delay)
30 end
31 end if include_in_api_response?('relations')
26 end
32 end
27 end
33 end
28 end
34 end
@@ -47,7 +47,7 class ApiTest::IssuesTest < ActionController::IntegrationTest
47 Setting.rest_api_enabled = '1'
47 Setting.rest_api_enabled = '1'
48 end
48 end
49
49
50 context "/index.xml" do
50 context "/issues" do
51 # Use a private project to make sure auth is really working and not just
51 # Use a private project to make sure auth is really working and not just
52 # only showing public issues.
52 # only showing public issues.
53 should_allow_api_authentication(:get, "/projects/private-child/issues.xml")
53 should_allow_api_authentication(:get, "/projects/private-child/issues.xml")
@@ -102,6 +102,25 class ApiTest::IssuesTest < ActionController::IntegrationTest
102 end
102 end
103 end
103 end
104
104
105 context "with relations" do
106 should "display relations" do
107 get '/issues.xml?include=relations'
108
109 assert_response :success
110 assert_equal 'application/xml', @response.content_type
111 assert_tag 'relations',
112 :parent => {:tag => 'issue', :child => {:tag => 'id', :content => '3'}},
113 :children => {:count => 1},
114 :child => {
115 :tag => 'relation',
116 :attributes => {:id => '2', :issue_id => '2', :issue_to_id => '3', :relation_type => 'relates'}
117 }
118 assert_tag 'relations',
119 :parent => {:tag => 'issue', :child => {:tag => 'id', :content => '1'}},
120 :children => {:count => 0}
121 end
122 end
123
105 context "with invalid query params" do
124 context "with invalid query params" do
106 should "return errors" do
125 should "return errors" do
107 get '/issues.xml', {:f => ['start_date'], :op => {:start_date => '='}}
126 get '/issues.xml', {:f => ['start_date'], :op => {:start_date => '='}}
General Comments 0
You need to be logged in to leave comments. Login now