diff options
Diffstat (limited to 'app/controllers/issues_controller.rb')
-rw-r--r-- | app/controllers/issues_controller.rb | 95 |
1 files changed, 64 insertions, 31 deletions
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 228597931..602d551f3 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -16,9 +16,10 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class IssuesController < ApplicationController - layout 'base', :except => :export_pdf - before_filter :find_project, :authorize, :except => [:index, :preview] - accept_key_auth :index + layout 'base' + before_filter :find_project, :authorize, :except => [:index, :changes, :preview] + before_filter :find_optional_project, :only => [:index, :changes] + accept_key_auth :index, :changes cache_sweeper :issue_sweeper, :only => [ :edit, :change_status, :destroy ] @@ -37,37 +38,54 @@ class IssuesController < ApplicationController helper :queries helper :sort include SortHelper + include IssuesHelper def index sort_init "#{Issue.table_name}.id", "desc" sort_update retrieve_query if @query.valid? - @issue_count = Issue.count(:include => [:status, :project], :conditions => @query.statement) - @issue_pages = Paginator.new self, @issue_count, 25, params['page'] + limit = %w(pdf csv).include?(params[:format]) ? Setting.issues_export_limit.to_i : 25 + @issue_count = Issue.count(:include => [:status, :project], :conditions => @query.statement) + @issue_pages = Paginator.new self, @issue_count, limit, params['page'] @issues = Issue.find :all, :order => sort_clause, :include => [ :assigned_to, :status, :tracker, :project, :priority, :category ], :conditions => @query.statement, - :limit => @issue_pages.items_per_page, - :offset => @issue_pages.current.offset + :limit => limit, + :offset => @issue_pages.current.offset + respond_to do |format| + format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? } + format.atom { render_feed(@issues, :title => l(:label_issue_plural)) } + format.csv { send_data(issues_to_csv(@issues, @project).read, :type => 'text/csv; header=present', :filename => 'export.csv') } + format.pdf { send_data(render(:template => 'issues/index.rfpdf', :layout => false), :type => 'application/pdf', :filename => 'export.pdf') } + end + else + # Send html if the query is not valid + render(:template => 'issues/index.rhtml', :layout => !request.xhr?) end - respond_to do |format| - format.html { render :layout => false if request.xhr? } - format.atom { render_feed(@issues, :title => l(:label_issue_plural)) } + end + + def changes + sort_init "#{Issue.table_name}.id", "desc" + sort_update + retrieve_query + if @query.valid? + @changes = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ], + :conditions => @query.statement, + :limit => 25, + :order => "#{Journal.table_name}.created_on DESC" end + @title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name) + render :layout => false, :content_type => 'application/atom+xml' end def show @custom_values = @issue.custom_values.find(:all, :include => :custom_field) @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC") - - if params[:format]=='pdf' - @options_for_rfpdf ||= {} - @options_for_rfpdf[:file_name] = "#{@project.identifier}-#{@issue.id}.pdf" - render :template => 'issues/show.rfpdf', :layout => false - else - @status_options = @issue.status.find_new_statuses_allowed_to(logged_in_user.role_for_project(@project), @issue.tracker) if logged_in_user - render :template => 'issues/show.rhtml' + @status_options = @issue.status.find_new_statuses_allowed_to(logged_in_user.role_for_project(@project), @issue.tracker) if logged_in_user + respond_to do |format| + format.html { render :template => 'issues/show.rhtml' } + format.pdf { send_data(render(:template => 'issues/show.rfpdf', :layout => false), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") } end end @@ -152,7 +170,7 @@ class IssuesController < ApplicationController def destroy @issue.destroy - redirect_to :controller => 'projects', :action => 'list_issues', :id => @project + redirect_to :action => 'index', :project_id => @project end def destroy_attachment @@ -195,23 +213,38 @@ private render_404 end + def find_optional_project + return true unless params[:project_id] + @project = Project.find(params[:project_id]) + authorize + rescue ActiveRecord::RecordNotFound + render_404 + end + # Retrieve query from session or build a new query def retrieve_query - if params[:set_filter] or !session[:query] or session[:query].project_id - # Give it a name, required to be valid - @query = Query.new(:name => "_", :executed_by => logged_in_user) - if params[:fields] and params[:fields].is_a? Array - params[:fields].each do |field| - @query.add_filter(field, params[:operators][field], params[:values][field]) + if params[:query_id] + @query = Query.find(params[:query_id], :conditions => {:project_id => (@project ? @project.id : nil)}) + @query.executed_by = logged_in_user + session[:query] = @query + else + if params[:set_filter] or !session[:query] or session[:query].project != @project + # Give it a name, required to be valid + @query = Query.new(:name => "_", :executed_by => logged_in_user) + @query.project = @project + if params[:fields] and params[:fields].is_a? Array + params[:fields].each do |field| + @query.add_filter(field, params[:operators][field], params[:values][field]) + end + else + @query.available_filters.keys.each do |field| + @query.add_short_filter(field, params[field]) if params[field] + end end + session[:query] = @query else - @query.available_filters.keys.each do |field| - @query.add_short_filter(field, params[field]) if params[field] - end + @query = session[:query] end - session[:query] = @query - else - @query = session[:query] end end end |