diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index e1a3d860c0..10bd07c221 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -23,6 +23,7 @@ class IssuesController < ApplicationController before_action :authorize, :except => [:index, :new, :create] before_action :find_optional_project, :only => [:index, :new, :create] before_action :build_new_issue_from_params, :only => [:new, :create] + before_action :with_default_query, only: [:index] accept_rss_auth :index, :show accept_api_auth :index, :show, :create, :update, :destroy @@ -414,6 +415,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[:issue_query] + query_id, project_id = session[:issue_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 a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 7945461635..b44ce4f6b9 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -95,6 +95,17 @@ module ProjectsHelper principals_options_for_select(assignable_users, project.default_assigned_to) 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 + IssueQuery.only_public.where(project: project).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 a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index 01d10d883c..e2b8ed6cf5 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -335,9 +335,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 a/app/models/issue_query.rb b/app/models/issue_query.rb index 6bb2bc217a..b374be22e3 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -50,11 +50,29 @@ class IssueQuery < Query QueryColumn.new(:last_notes, :caption => :label_last_notes, :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 :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 => [""]} } end + def public_visibility? + visibility == VISIBILITY_PUBLIC + end + def draw_relations r = options[:draw_relations] r.nil? || r == '1' diff --git a/app/models/project.rb b/app/models/project.rb index 5f2f2fb102..b112f6f30a 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -56,6 +56,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, @@ -756,7 +758,8 @@ class Project < ActiveRecord::Base 'issue_custom_field_ids', 'parent_id', 'default_version_id', - 'default_assigned_to_id' + 'default_assigned_to_id', + 'default_query_id' safe_attributes 'enabled_module_names', :if => lambda {|project, user| diff --git a/app/views/issues/_sidebar.html.erb b/app/views/issues/_sidebar.html.erb index 38d682b048..5b64687618 100644 --- a/app/views/issues/_sidebar.html.erb +++ b/app/views/issues/_sidebar.html.erb @@ -1,7 +1,7 @@

<%= l(:label_issue_plural) %>