Mercurial > hg > soundsoftware-site
diff app/controllers/issues_controller.rb @ 511:107d36338b70 live
Merge from branch "cannam"
author | Chris Cannam |
---|---|
date | Thu, 14 Jul 2011 10:43:07 +0100 |
parents | 851510f1b535 |
children | 5e80956cc792 |
line wrap: on
line diff
--- a/app/controllers/issues_controller.rb Thu Jun 09 16:51:06 2011 +0100 +++ b/app/controllers/issues_controller.rb Thu Jul 14 10:43:07 2011 +0100 @@ -1,16 +1,16 @@ # Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +# Copyright (C) 2006-2011 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. -# +# # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -18,7 +18,7 @@ class IssuesController < ApplicationController menu_item :new_issue, :only => [:new, :create] default_search_scope :issues - + before_filter :find_issue, :only => [:show, :edit, :update] before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :move, :perform_move, :destroy] before_filter :check_project_uniqueness, :only => [:move, :perform_move] @@ -27,13 +27,14 @@ before_filter :find_optional_project, :only => [:index] before_filter :check_for_default_issue_status, :only => [:new, :create] before_filter :build_new_issue_from_params, :only => [:new, :create] - accept_key_auth :index, :show, :create, :update, :destroy + accept_rss_auth :index, :show + accept_api_auth :index, :show, :create, :update, :destroy rescue_from Query::StatementInvalid, :with => :query_statement_invalid - + helper :journals helper :projects - include ProjectsHelper + include ProjectsHelper helper :custom_fields include CustomFieldsHelper helper :issue_relations @@ -44,6 +45,8 @@ include AttachmentsHelper helper :queries include QueriesHelper + helper :repositories + include RepositoriesHelper helper :sort include SortHelper include IssuesHelper @@ -58,34 +61,36 @@ verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed } verify :method => :post, :only => :bulk_update, :render => {:nothing => true, :status => :method_not_allowed } verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed } - + def index retrieve_query sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria) sort_update(@query.sortable_columns) - + if @query.valid? - limit = case params[:format] + case params[:format] when 'csv', 'pdf' - Setting.issues_export_limit.to_i + @limit = Setting.issues_export_limit.to_i when 'atom' - Setting.feeds_limit.to_i + @limit = Setting.feeds_limit.to_i + when 'xml', 'json' + @offset, @limit = api_offset_and_limit else - per_page_option + @limit = per_page_option end - + @issue_count = @query.issue_count - @issue_pages = Paginator.new self, @issue_count, limit, params['page'] + @issue_pages = Paginator.new self, @issue_count, @limit, params['page'] + @offset ||= @issue_pages.current.offset @issues = @query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version], - :order => sort_clause, - :offset => @issue_pages.current.offset, - :limit => limit) + :order => sort_clause, + :offset => @offset, + :limit => @limit) @issue_count_by_group = @query.issue_count_by_group - + respond_to do |format| format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? } - format.xml { render :layout => false } - format.json { render :text => @issues.to_json, :layout => false } + format.api format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") } format.csv { send_data(issues_to_csv(@issues, @project), :type => 'text/csv; header=present', :filename => 'export.csv') } format.pdf { send_data(issues_to_pdf(@issues, @project, @query), :type => 'application/pdf', :filename => 'export.pdf') } @@ -97,21 +102,25 @@ rescue ActiveRecord::RecordNotFound render_404 end - + def show @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC") @journals.each_with_index {|j,i| j.indice = i+1} @journals.reverse! if User.current.wants_comments_in_reverse_order? - @changesets = @issue.changesets.visible.all - @changesets.reverse! if User.current.wants_comments_in_reverse_order? + + if User.current.allowed_to?(:view_changesets, @project) + @changesets = @issue.changesets.visible.all + @changesets.reverse! if User.current.wants_comments_in_reverse_order? + end + + @relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? } @allowed_statuses = @issue.new_statuses_allowed_to(User.current) @edit_allowed = User.current.allowed_to?(:edit_issues, @project) @priorities = IssuePriority.all - @time_entry = TimeEntry.new + @time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project) respond_to do |format| format.html { render :template => 'issues/show.rhtml' } - format.xml { render :layout => false } - format.json { render :text => @issue.to_json, :layout => false } + format.api format.atom { render :template => 'journals/index', :layout => false, :content_type => 'application/atom+xml' } format.pdf { send_data(issue_to_pdf(@issue), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") } end @@ -147,19 +156,17 @@ redirect_to(params[:continue] ? { :action => 'new', :project_id => @project, :issue => {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} } : { :action => 'show', :id => @issue }) } - format.xml { render :action => 'show', :status => :created, :location => url_for(:controller => 'issues', :action => 'show', :id => @issue) } - format.json { render :text => @issue.to_json, :status => :created, :location => url_for(:controller => 'issues', :action => 'show'), :layout => false } + format.api { render :action => 'show', :status => :created, :location => issue_url(@issue) } end return else respond_to do |format| format.html { render :action => 'new' } - format.xml { render(:xml => @issue.errors, :status => :unprocessable_entity); return } - format.json { render :text => object_errors_to_json(@issue), :status => :unprocessable_entity, :layout => false } + format.api { render_validation_errors(@issue) } end end end - + def edit update_issue_from_params @@ -180,8 +187,7 @@ respond_to do |format| format.html { redirect_back_or_default({:action => 'show', :id => @issue}) } - format.xml { head :ok } - format.json { head :ok } + format.api { head :ok } end else render_attachment_warning_if_needed(@issue) @@ -190,8 +196,7 @@ respond_to do |format| format.html { render :action => 'edit' } - format.xml { render :xml => @issue.errors, :status => :unprocessable_entity } - format.json { render :text => object_errors_to_json(@issue), :status => :unprocessable_entity, :layout => false } + format.api { render_validation_errors(@issue) } end end end @@ -223,7 +228,7 @@ set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids) redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project}) end - + def destroy @hours = TimeEntry.sum(:hours, :conditions => ['issue_id IN (?)', @issues]).to_f if @hours > 0 @@ -241,35 +246,44 @@ TimeEntry.update_all("issue_id = #{reassign_to.id}", ['issue_id IN (?)', @issues]) end else - unless params[:format] == 'xml' || params[:format] == 'json' - # display the destroy form if it's a user request - return - end + # display the destroy form if it's a user request + return unless api_request? end end - @issues.each(&:destroy) + @issues.each do |issue| + begin + issue.reload.destroy + rescue ::ActiveRecord::RecordNotFound # raised by #reload if issue no longer exists + # nothing to do, issue was already deleted (eg. by a parent) + end + end respond_to do |format| format.html { redirect_back_or_default(:action => 'index', :project_id => @project) } - format.xml { head :ok } - format.json { head :ok } + format.api { head :ok } end end private def find_issue + # Issue.visible.find(...) can not be used to redirect user to the login form + # if the issue actually exists but requires authentication @issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category]) + unless @issue.visible? + deny_access + return + end @project = @issue.project rescue ActiveRecord::RecordNotFound render_404 end - + def find_project project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id] @project = Project.find(project_id) rescue ActiveRecord::RecordNotFound render_404 end - + # Used by #edit and #update to set some common instance variables # from the params # TODO: Refactor, not everything in here is needed by #edit @@ -277,9 +291,9 @@ @allowed_statuses = @issue.new_statuses_allowed_to(User.current) @priorities = IssuePriority.all @edit_allowed = User.current.allowed_to?(:edit_issues, @project) - @time_entry = TimeEntry.new + @time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project) @time_entry.attributes = params[:time_entry] - + @notes = params[:notes] || (params[:issue].present? ? params[:issue][:notes] : nil) @issue.init_journal(User.current, @notes) @issue.safe_attributes = params[:issue] @@ -288,7 +302,7 @@ # is in this issues watcher's list # if not, adds it. - if params[:issue][:assigned_to_id] && !params[:issue][:assigned_to_id].empty?: + if params[:issue] && params[:issue][:assigned_to_id] && !params[:issue][:assigned_to_id].empty?: unless @issue.watched_by?(User.find(params[:issue][:assigned_to_id])): @issue.add_watcher(User.find(params[:issue][:assigned_to_id])) end @@ -307,8 +321,9 @@ else @issue = @project.issues.visible.find(params[:id]) end - + @issue.project = @project + @issue.author = User.current # Tracker must be set before custom field values @issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first) if @issue.tracker.nil? @@ -322,7 +337,6 @@ @issue.watcher_user_ids = params[:issue]['watcher_user_ids'] end end - @issue.author = User.current @priorities = IssuePriority.all @allowed_statuses = @issue.new_statuses_allowed_to(User.current, true) end