diff --git app/controllers/issues_controller.rb app/controllers/issues_controller.rb index 5199954..544de34 100644 --- app/controllers/issues_controller.rb +++ app/controllers/issues_controller.rb @@ -24,6 +24,7 @@ class IssuesController < ApplicationController before_filter :authorize, :except => [:index, :new, :create] before_filter :find_optional_project, :only => [:index, :new, :create] before_filter :build_new_issue_from_params, :only => [:new, :create] + before_filter :with_default_query, only: [:index] accept_rss_auth :index, :show accept_api_auth :index, :show, :create, :update, :destroy @@ -353,6 +354,28 @@ class IssuesController < ApplicationController private + def with_default_query + return if params[:query_id].present? + return if api_request? + return if params[:set_filter] && params.key?(:op) && params.key?(:f) + params[:set_filter] = 1 and return if params[:without_default].present? + apply_default_query! and return if params[:set_filter] && [:op, :f].all? {|k| !params.key?(k) } + if session[:query] + query_id, project_id = session[:query].values_at(:id, :project_id) + unless query_id && (project_id == @project.id) && IssueQuery.available_query?(@project.id, query_id) + apply_default_query! + end + else + apply_default_query! + end + end + + def apply_default_query! + if default_query = find_default_query + params[:query_id] = default_query.id + end + end + def retrieve_previous_and_next_issue_ids if params[:prev_issue_id].present? || params[:next_issue_id].present? @prev_issue_id = params[:prev_issue_id].presence.try(:to_i) diff --git app/helpers/projects_helper.rb app/helpers/projects_helper.rb index 6e409f2..c6886cc 100644 --- app/helpers/projects_helper.rb +++ app/helpers/projects_helper.rb @@ -95,6 +95,17 @@ module ProjectsHelper version_options_for_select(versions, project.default_version) end + def project_default_query_options(project) + grouped = Hash.new {|h,k| h[k] = []} + IssueQuery.only_public.where(project_id: nil).each do |query| + grouped[l('label_default_queries.for_all_projects')] << [query.name, query.id] + end + project.queries.only_public.each do |query| + grouped[l('label_default_queries.for_current_project')] << [query.name, query.id] + end + grouped_options_for_select(grouped, project.default_query_id) + end + def format_version_sharing(sharing) sharing = 'none' unless Version::VERSION_SHARINGS.include?(sharing) l("label_version_sharing_#{sharing}") diff --git app/helpers/queries_helper.rb app/helpers/queries_helper.rb index 4b71d08..921c9e7 100644 --- app/helpers/queries_helper.rb +++ app/helpers/queries_helper.rb @@ -241,9 +241,17 @@ module QueriesHelper @query.project = @project end @query + else + @query = find_default_query end end + private + + def find_default_query + @project.default_query if @project.is_a?(Project) + end + # Returns the query definition as hidden field tags def query_as_hidden_field_tags(query) tags = hidden_field_tag("set_filter", "1", :id => nil) diff --git app/models/issue_query.rb app/models/issue_query.rb index c97de0a..e696750 100644 --- app/models/issue_query.rb +++ app/models/issue_query.rb @@ -16,7 +16,6 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class IssueQuery < Query - self.queried_class = Issue self.available_columns = [ @@ -46,6 +45,10 @@ class IssueQuery < Query QueryColumn.new(:description, :inline => false) ] + has_many :projects, :foreign_key => 'default_query_id' + after_update { self.projects.clear unless self.public_visibility? } + after_destroy { self.projects.clear } + scope :visible, lambda {|*args| user = args.shift || User.current base = Project.allowed_to_condition(user, :view_issues, *args) @@ -71,6 +74,16 @@ class IssueQuery < Query end } + scope :only_public, -> { + where(:visibility => VISIBILITY_PUBLIC) + } + + def self.available_query?(project_id, query_id) + self.only_public + .where('project_id is null or project_id = ?', project_id) + .where(id: query_id).exists? + end + def initialize(attributes=nil, *args) super attributes self.filters ||= { 'status_id' => {:operator => "o", :values => [""]} } @@ -102,6 +115,10 @@ class IssueQuery < Query !is_private? end + def public_visibility? + visibility == VISIBILITY_PUBLIC + end + def draw_relations r = options[:draw_relations] r.nil? || r == '1' diff --git app/models/project.rb app/models/project.rb index 2e3a106..a3c819c 100644 --- app/models/project.rb +++ app/models/project.rb @@ -55,6 +55,8 @@ class Project < ActiveRecord::Base :class_name => 'IssueCustomField', :join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}", :association_foreign_key => 'custom_field_id' + # Default Custom Query + belongs_to :default_query, :class_name => 'IssueQuery' acts_as_attachable :view_permission => :view_files, :edit_permission => :manage_files, @@ -692,7 +694,8 @@ class Project < ActiveRecord::Base 'tracker_ids', 'issue_custom_field_ids', 'parent_id', - 'default_version_id' + 'default_version_id', + 'default_query_id' safe_attributes 'enabled_module_names', :if => lambda {|project, user| project.new_record? || user.allowed_to?(:select_project_modules, project) } diff --git app/views/issues/_sidebar.html.erb app/views/issues/_sidebar.html.erb index df9f43b..53279f8 100644 --- app/views/issues/_sidebar.html.erb +++ app/views/issues/_sidebar.html.erb @@ -1,7 +1,7 @@

<%= l(:label_issue_plural) %>