diff --git a/redmine/app/controllers/projects_controller.rb b/redmine/app/controllers/projects_controller.rb index 2e74045..a9737aa 100644 --- a/redmine/app/controllers/projects_controller.rb +++ b/redmine/app/controllers/projects_controller.rb @@ -16,21 +16,21 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class ProjectsController < ApplicationController - layout 'base' - before_filter :find_project, :authorize, :except => [ :index, :list, :add ] + layout 'base' + before_filter :find_project, :authorize, :except => [ :index, :list, :add ] before_filter :require_admin, :only => [ :add, :destroy ] helper :sort - include SortHelper - helper :search_filter - include SearchFilterHelper - helper :custom_fields - include CustomFieldsHelper + include SortHelper + helper :search_filter + include SearchFilterHelper + helper :custom_fields + include CustomFieldsHelper - def index - list - render :action => 'list' - end + def index + list + render :action => 'list' + end # Lists public projects def list @@ -181,29 +181,47 @@ class ProjectsController < ApplicationController end end - # Show issues list of @project - def list_issues - sort_init 'issues.id', 'desc' - sort_update - - search_filter_criteria 'issues.tracker_id', :values => "Tracker.find(:all)" - search_filter_criteria 'issues.priority_id', :values => "Enumeration.find(:all, :conditions => ['opt=?','IPRI'])" - search_filter_criteria 'issues.category_id', :values => "@project.issue_categories" - search_filter_criteria 'issues.status_id', :values => "IssueStatus.find(:all)" - search_filter_criteria 'issues.author_id', :values => "User.find(:all)", :label => "display_name" - search_filter_update if params[:set_filter] or request.post? - - @issue_count = @project.issues.count(search_filter_clause) - @issue_pages = Paginator.new self, @issue_count, - 15, - @params['page'] - @issues = @project.issues.find :all, :order => sort_clause, + # Show issues list of @project + def list_issues + sort_init 'issues.id', 'desc' + sort_update + + search_filter_init_list_issues + search_filter_update if params[:set_filter] or request.post? + + @issue_count = Issue.count(:include => :status, :conditions => search_filter_clause) + @issue_pages = Paginator.new self, @issue_count, 15, @params['page'] + @issues = Issue.find :all, :order => sort_clause, :include => [ :author, :status, :tracker ], :conditions => search_filter_clause, :limit => @issue_pages.items_per_page, :offset => @issue_pages.current.offset - end + end + + # Export filtered/sorted issues list to CSV + def export_issues_csv + sort_init 'issues.id', 'desc' + sort_update + + search_filter_init_list_issues + + @issues = Issue.find :all, :order => sort_clause, + :include => [ :author, :status, :tracker ], + :conditions => search_filter_clause + export = StringIO.new + CSV::Writer.generate(export, ',') do |csv| + csv << %w(Id Status Tracker Subject Author Created Updated) + @issues.each do |issue| + csv << [issue.id, issue.status.name, issue.tracker.name, issue.subject, issue.author.display_name, _('(time)', issue.created_on), _('(time)', issue.updated_on)] + end + end + export.rewind + send_data(export.read, + :type => 'text/csv; charset=utf-8; header=present', + :filename => 'export.csv') + end + # Add a news to @project def add_news @news = @project.news.build(params[:news]) @@ -216,9 +234,9 @@ class ProjectsController < ApplicationController end # Show news list of @project - def list_news + def list_news @news_pages, @news = paginate :news, :per_page => 10, :conditions => ["project_id=?", @project.id], :include => :author, :order => "news.created_on DESC" - end + end def add_file if request.post? @@ -238,13 +256,13 @@ class ProjectsController < ApplicationController @versions = @project.versions end - # Show changelog of @project - def changelog - @fixed_issues = @project.issues.find(:all, - :include => [ :fixed_version, :status, :tracker ], - :conditions => [ "issue_statuses.is_closed=? and trackers.is_in_chlog=? and issues.fixed_version_id is not null", true, true] - ) - end + # Show changelog of @project + def changelog + @fixed_issues = @project.issues.find(:all, + :include => [ :fixed_version, :status, :tracker ], + :conditions => [ "issue_statuses.is_closed=? and trackers.is_in_chlog=? and issues.fixed_version_id is not null", true, true] + ) + end private # Find project of id params[:id] diff --git a/redmine/app/helpers/search_filter_helper.rb b/redmine/app/helpers/search_filter_helper.rb index 3a76b3f..7acc8b2 100644 --- a/redmine/app/helpers/search_filter_helper.rb +++ b/redmine/app/helpers/search_filter_helper.rb @@ -17,39 +17,69 @@ module SearchFilterHelper - def search_filter_criteria(field, options = {}) - session[:search_filter] ||= {} - session[:search_filter][field] ||= options - # session[:search_filter][field][:values] = options[:values] unless options[:values].nil? - # session[:search_filter][field][:label] = options[:label] unless options[:label].nil? - end + def search_filter_criteria(name, options = {}) + session[:search_filter] ||= {} + session[:search_filter][name] ||= {} + unless session[:search_filter][name][:options] and session[:search_filter][name][:conditions] + session[:search_filter][name][:options] = [] + session[:search_filter][name][:conditions] = {} + yield.each { |c| + session[:search_filter][name][:options] << [c[0], c[1].to_s] + session[:search_filter][name][:conditions].store(c[1].to_s, c[2]) + } + end + end - def search_filter_update - session[:search_filter].each_key {|field| session[:search_filter][field][:value] = params[field] } - #@search_filter[:value] = params[@search_filter[:field]] - end + def search_filter_update + session[:search_filter].each_key {|field| session[:search_filter][field][:value] = params[field] } + end - def search_filter_clause - clause = "1=1" - session[:search_filter].each {|field, criteria| clause = clause + " AND " + field + "='" + session[:search_filter][field][:value] + "'" unless session[:search_filter][field][:value].nil? || session[:search_filter][field][:value].empty? } - clause - #@search_filter[:field] + "='" + @search_filter[:value] + "'" unless @search_filter[:value].nil? || @search_filter[:value].empty? - end + def search_filter_clause + clause = ["issues.project_id=?", @project.id] + session[:search_filter].each { |k, v| + v[:value] ||= v[:options][0][1] + if (!v[:conditions][v[:value]][0].empty?) + clause[0] = clause[0] + " AND " + v[:conditions][v[:value]][0] + clause << v[:conditions][v[:value]][1] if !v[:conditions][v[:value]][1].nil? + end + } + clause + end - def search_filter_tag(field) - option_values = [] - #values = eval @search_filter[:values_expr] - option_values = eval session[:search_filter][field][:values] - - content_tag("select", - content_tag("option", "[All]", :value => "") + - options_from_collection_for_select(option_values, - "id", - session[:search_filter][field][:label] || "name", - session[:search_filter][field][:value].to_i - ), - :name => field + def search_filter_tag(criteria) + content_tag("select", + options_for_select(session[:search_filter][criteria][:options], session[:search_filter][criteria][:value]), + :name => criteria ) - end + end + + def search_filter_init_list_issues + search_filter_criteria('status_id') { + [ ["[Open]", "O", ["issue_statuses.is_closed=?", false]], + ["[All]", "A", ["", false]] + ] + IssueStatus.find(:all).collect {|s| [s.name, s.id, ["issues.status_id=?", s.id]] } + } + + search_filter_criteria('tracker_id') { + [ ["[All]", "A", ["", false]] + ] + Tracker.find(:all).collect {|s| [s.name, s.id, ["issues.tracker_id=?", s.id]] } + } + + search_filter_criteria('priority_id') { + [ ["[All]", "A", ["", false]] + ] + Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect {|s| [s.name, s.id, ["issues.priority_id=?", s.id]] } + } + + search_filter_criteria('category_id') { + [ ["[All]", "A", ["", false]], + ["[None]", "N", ["issues.category_id is null"]] + ] + @project.issue_categories.find(:all).collect {|s| [s.name, s.id, ["issues.category_id=?", s.id]] } + } + search_filter_criteria('assigned_to_id') { + [ ["[All]", "A", ["", false]], + ["[Nobody]", "N", ["issues.assigned_to_id is null"]] + ] + User.find(:all).collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] } + } + end end \ No newline at end of file diff --git a/redmine/app/views/projects/list_issues.rhtml b/redmine/app/views/projects/list_issues.rhtml index 5be81b1..c01358e 100644 --- a/redmine/app/views/projects/list_issues.rhtml +++ b/redmine/app/views/projects/list_issues.rhtml @@ -3,11 +3,11 @@