remove trailing white-spaces from query model source.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@5822 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
e357057559
commit
22e80f04ae
|
@ -5,20 +5,20 @@
|
||||||
# modify it under the terms of the GNU General Public License
|
# modify it under the terms of the GNU General Public License
|
||||||
# as published by the Free Software Foundation; either version 2
|
# as published by the Free Software Foundation; either version 2
|
||||||
# of the License, or (at your option) any later version.
|
# of the License, or (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
class QueryColumn
|
class QueryColumn
|
||||||
attr_accessor :name, :sortable, :groupable, :default_order
|
attr_accessor :name, :sortable, :groupable, :default_order
|
||||||
include Redmine::I18n
|
include Redmine::I18n
|
||||||
|
|
||||||
def initialize(name, options={})
|
def initialize(name, options={})
|
||||||
self.name = name
|
self.name = name
|
||||||
self.sortable = options[:sortable]
|
self.sortable = options[:sortable]
|
||||||
|
@ -29,20 +29,20 @@ class QueryColumn
|
||||||
self.default_order = options[:default_order]
|
self.default_order = options[:default_order]
|
||||||
@caption_key = options[:caption] || "field_#{name}"
|
@caption_key = options[:caption] || "field_#{name}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def caption
|
def caption
|
||||||
l(@caption_key)
|
l(@caption_key)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns true if the column is sortable, otherwise false
|
# Returns true if the column is sortable, otherwise false
|
||||||
def sortable?
|
def sortable?
|
||||||
!sortable.nil?
|
!sortable.nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
def value(issue)
|
def value(issue)
|
||||||
issue.send name
|
issue.send name
|
||||||
end
|
end
|
||||||
|
|
||||||
def css_classes
|
def css_classes
|
||||||
name
|
name
|
||||||
end
|
end
|
||||||
|
@ -59,20 +59,20 @@ class QueryCustomFieldColumn < QueryColumn
|
||||||
self.groupable ||= false
|
self.groupable ||= false
|
||||||
@cf = custom_field
|
@cf = custom_field
|
||||||
end
|
end
|
||||||
|
|
||||||
def caption
|
def caption
|
||||||
@cf.name
|
@cf.name
|
||||||
end
|
end
|
||||||
|
|
||||||
def custom_field
|
def custom_field
|
||||||
@cf
|
@cf
|
||||||
end
|
end
|
||||||
|
|
||||||
def value(issue)
|
def value(issue)
|
||||||
cv = issue.custom_values.detect {|v| v.custom_field_id == @cf.id}
|
cv = issue.custom_values.detect {|v| v.custom_field_id == @cf.id}
|
||||||
cv && @cf.cast_value(cv.value)
|
cv && @cf.cast_value(cv.value)
|
||||||
end
|
end
|
||||||
|
|
||||||
def css_classes
|
def css_classes
|
||||||
@css_classes ||= "#{name} #{@cf.field_format}"
|
@css_classes ||= "#{name} #{@cf.field_format}"
|
||||||
end
|
end
|
||||||
|
@ -81,19 +81,19 @@ end
|
||||||
class Query < ActiveRecord::Base
|
class Query < ActiveRecord::Base
|
||||||
class StatementInvalid < ::ActiveRecord::StatementInvalid
|
class StatementInvalid < ::ActiveRecord::StatementInvalid
|
||||||
end
|
end
|
||||||
|
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
serialize :filters
|
serialize :filters
|
||||||
serialize :column_names
|
serialize :column_names
|
||||||
serialize :sort_criteria, Array
|
serialize :sort_criteria, Array
|
||||||
|
|
||||||
attr_protected :project_id, :user_id
|
attr_protected :project_id, :user_id
|
||||||
|
|
||||||
validates_presence_of :name, :on => :save
|
validates_presence_of :name, :on => :save
|
||||||
validates_length_of :name, :maximum => 255
|
validates_length_of :name, :maximum => 255
|
||||||
|
|
||||||
@@operators = { "=" => :label_equals,
|
@@operators = { "=" => :label_equals,
|
||||||
"!" => :label_not_equals,
|
"!" => :label_not_equals,
|
||||||
"o" => :label_open_issues,
|
"o" => :label_open_issues,
|
||||||
"c" => :label_closed_issues,
|
"c" => :label_closed_issues,
|
||||||
|
@ -113,7 +113,7 @@ class Query < ActiveRecord::Base
|
||||||
"!~" => :label_not_contains }
|
"!~" => :label_not_contains }
|
||||||
|
|
||||||
cattr_reader :operators
|
cattr_reader :operators
|
||||||
|
|
||||||
@@operators_by_filter_type = { :list => [ "=", "!" ],
|
@@operators_by_filter_type = { :list => [ "=", "!" ],
|
||||||
:list_status => [ "o", "=", "!", "c", "*" ],
|
:list_status => [ "o", "=", "!", "c", "*" ],
|
||||||
:list_optional => [ "=", "!", "!*", "*" ],
|
:list_optional => [ "=", "!", "!*", "*" ],
|
||||||
|
@ -145,27 +145,27 @@ class Query < ActiveRecord::Base
|
||||||
QueryColumn.new(:created_on, :sortable => "#{Issue.table_name}.created_on", :default_order => 'desc'),
|
QueryColumn.new(:created_on, :sortable => "#{Issue.table_name}.created_on", :default_order => 'desc'),
|
||||||
]
|
]
|
||||||
cattr_reader :available_columns
|
cattr_reader :available_columns
|
||||||
|
|
||||||
def initialize(attributes = nil)
|
def initialize(attributes = nil)
|
||||||
super attributes
|
super attributes
|
||||||
self.filters ||= { 'status_id' => {:operator => "o", :values => [""]} }
|
self.filters ||= { 'status_id' => {:operator => "o", :values => [""]} }
|
||||||
end
|
end
|
||||||
|
|
||||||
def after_initialize
|
def after_initialize
|
||||||
# Store the fact that project is nil (used in #editable_by?)
|
# Store the fact that project is nil (used in #editable_by?)
|
||||||
@is_for_all = project.nil?
|
@is_for_all = project.nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate
|
def validate
|
||||||
filters.each_key do |field|
|
filters.each_key do |field|
|
||||||
errors.add label_for(field), :blank unless
|
errors.add label_for(field), :blank unless
|
||||||
# filter requires one or more values
|
# filter requires one or more values
|
||||||
(values_for(field) and !values_for(field).first.blank?) or
|
(values_for(field) and !values_for(field).first.blank?) or
|
||||||
# filter doesn't require any value
|
# filter doesn't require any value
|
||||||
["o", "c", "!*", "*", "t", "w"].include? operator_for(field)
|
["o", "c", "!*", "*", "t", "w"].include? operator_for(field)
|
||||||
end if filters
|
end if filters
|
||||||
end
|
end
|
||||||
|
|
||||||
def editable_by?(user)
|
def editable_by?(user)
|
||||||
return false unless user
|
return false unless user
|
||||||
# Admin can edit them all and regular users can edit their private queries
|
# Admin can edit them all and regular users can edit their private queries
|
||||||
|
@ -173,23 +173,23 @@ class Query < ActiveRecord::Base
|
||||||
# Members can not edit public queries that are for all project (only admin is allowed to)
|
# Members can not edit public queries that are for all project (only admin is allowed to)
|
||||||
is_public && !@is_for_all && user.allowed_to?(:manage_public_queries, project)
|
is_public && !@is_for_all && user.allowed_to?(:manage_public_queries, project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def available_filters
|
def available_filters
|
||||||
return @available_filters if @available_filters
|
return @available_filters if @available_filters
|
||||||
|
|
||||||
trackers = project.nil? ? Tracker.find(:all, :order => 'position') : project.rolled_up_trackers
|
trackers = project.nil? ? Tracker.find(:all, :order => 'position') : project.rolled_up_trackers
|
||||||
|
|
||||||
@available_filters = { "status_id" => { :type => :list_status, :order => 1, :values => IssueStatus.find(:all, :order => 'position').collect{|s| [s.name, s.id.to_s] } },
|
@available_filters = { "status_id" => { :type => :list_status, :order => 1, :values => IssueStatus.find(:all, :order => 'position').collect{|s| [s.name, s.id.to_s] } },
|
||||||
"tracker_id" => { :type => :list, :order => 2, :values => trackers.collect{|s| [s.name, s.id.to_s] } },
|
"tracker_id" => { :type => :list, :order => 2, :values => trackers.collect{|s| [s.name, s.id.to_s] } },
|
||||||
"priority_id" => { :type => :list, :order => 3, :values => IssuePriority.all.collect{|s| [s.name, s.id.to_s] } },
|
"priority_id" => { :type => :list, :order => 3, :values => IssuePriority.all.collect{|s| [s.name, s.id.to_s] } },
|
||||||
"subject" => { :type => :text, :order => 8 },
|
"subject" => { :type => :text, :order => 8 },
|
||||||
"created_on" => { :type => :date_past, :order => 9 },
|
"created_on" => { :type => :date_past, :order => 9 },
|
||||||
"updated_on" => { :type => :date_past, :order => 10 },
|
"updated_on" => { :type => :date_past, :order => 10 },
|
||||||
"start_date" => { :type => :date, :order => 11 },
|
"start_date" => { :type => :date, :order => 11 },
|
||||||
"due_date" => { :type => :date, :order => 12 },
|
"due_date" => { :type => :date, :order => 12 },
|
||||||
"estimated_hours" => { :type => :integer, :order => 13 },
|
"estimated_hours" => { :type => :integer, :order => 13 },
|
||||||
"done_ratio" => { :type => :integer, :order => 14 }}
|
"done_ratio" => { :type => :integer, :order => 14 }}
|
||||||
|
|
||||||
user_values = []
|
user_values = []
|
||||||
user_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged?
|
user_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged?
|
||||||
if project
|
if project
|
||||||
|
@ -199,7 +199,7 @@ class Query < ActiveRecord::Base
|
||||||
if all_projects.any?
|
if all_projects.any?
|
||||||
# members of visible projects
|
# members of visible projects
|
||||||
user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", all_projects.collect(&:id)]).sort.collect{|s| [s.name, s.id.to_s] }
|
user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", all_projects.collect(&:id)]).sort.collect{|s| [s.name, s.id.to_s] }
|
||||||
|
|
||||||
# project filter
|
# project filter
|
||||||
project_values = []
|
project_values = []
|
||||||
Project.project_tree(all_projects) do |p, level|
|
Project.project_tree(all_projects) do |p, level|
|
||||||
|
@ -217,11 +217,11 @@ class Query < ActiveRecord::Base
|
||||||
|
|
||||||
role_values = Role.givable.collect {|r| [r.name, r.id.to_s] }
|
role_values = Role.givable.collect {|r| [r.name, r.id.to_s] }
|
||||||
@available_filters["assigned_to_role"] = { :type => :list_optional, :order => 7, :values => role_values } unless role_values.empty?
|
@available_filters["assigned_to_role"] = { :type => :list_optional, :order => 7, :values => role_values } unless role_values.empty?
|
||||||
|
|
||||||
if User.current.logged?
|
if User.current.logged?
|
||||||
@available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] }
|
@available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] }
|
||||||
end
|
end
|
||||||
|
|
||||||
if project
|
if project
|
||||||
# project specific filters
|
# project specific filters
|
||||||
categories = @project.issue_categories.all
|
categories = @project.issue_categories.all
|
||||||
|
@ -249,7 +249,7 @@ class Query < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
@available_filters
|
@available_filters
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_filter(field, operator, values)
|
def add_filter(field, operator, values)
|
||||||
# values must be an array
|
# values must be an array
|
||||||
return unless values and values.is_a? Array # and !values.first.empty?
|
return unless values and values.is_a? Array # and !values.first.empty?
|
||||||
|
@ -264,7 +264,7 @@ class Query < ActiveRecord::Base
|
||||||
filters[field] = {:operator => operator, :values => values }
|
filters[field] = {:operator => operator, :values => values }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_short_filter(field, expression)
|
def add_short_filter(field, expression)
|
||||||
return unless expression
|
return unless expression
|
||||||
parms = expression.scan(/^(o|c|!\*|!|\*)?(.*)$/).first
|
parms = expression.scan(/^(o|c|!\*|!|\*)?(.*)$/).first
|
||||||
|
@ -279,19 +279,19 @@ class Query < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_filter?(field)
|
def has_filter?(field)
|
||||||
filters and filters[field]
|
filters and filters[field]
|
||||||
end
|
end
|
||||||
|
|
||||||
def operator_for(field)
|
def operator_for(field)
|
||||||
has_filter?(field) ? filters[field][:operator] : nil
|
has_filter?(field) ? filters[field][:operator] : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def values_for(field)
|
def values_for(field)
|
||||||
has_filter?(field) ? filters[field][:values] : nil
|
has_filter?(field) ? filters[field][:values] : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def label_for(field)
|
def label_for(field)
|
||||||
label = available_filters[field][:name] if available_filters.has_key?(field)
|
label = available_filters[field][:name] if available_filters.has_key?(field)
|
||||||
label ||= field.gsub(/\_id$/, "")
|
label ||= field.gsub(/\_id$/, "")
|
||||||
|
@ -303,17 +303,17 @@ class Query < ActiveRecord::Base
|
||||||
@available_columns += (project ?
|
@available_columns += (project ?
|
||||||
project.all_issue_custom_fields :
|
project.all_issue_custom_fields :
|
||||||
IssueCustomField.find(:all)
|
IssueCustomField.find(:all)
|
||||||
).collect {|cf| QueryCustomFieldColumn.new(cf) }
|
).collect {|cf| QueryCustomFieldColumn.new(cf) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.available_columns=(v)
|
def self.available_columns=(v)
|
||||||
self.available_columns = (v)
|
self.available_columns = (v)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.add_available_column(column)
|
def self.add_available_column(column)
|
||||||
self.available_columns << (column) if column.is_a?(QueryColumn)
|
self.available_columns << (column) if column.is_a?(QueryColumn)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns an array of columns that can be used to group the results
|
# Returns an array of columns that can be used to group the results
|
||||||
def groupable_columns
|
def groupable_columns
|
||||||
available_columns.select {|c| c.groupable}
|
available_columns.select {|c| c.groupable}
|
||||||
|
@ -326,7 +326,7 @@ class Query < ActiveRecord::Base
|
||||||
h
|
h
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
def columns
|
def columns
|
||||||
if has_default_columns?
|
if has_default_columns?
|
||||||
available_columns.select do |c|
|
available_columns.select do |c|
|
||||||
|
@ -338,7 +338,7 @@ class Query < ActiveRecord::Base
|
||||||
column_names.collect {|name| available_columns.find {|col| col.name == name}}.compact
|
column_names.collect {|name| available_columns.find {|col| col.name == name}}.compact
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def column_names=(names)
|
def column_names=(names)
|
||||||
if names
|
if names
|
||||||
names = names.select {|n| n.is_a?(Symbol) || !n.blank? }
|
names = names.select {|n| n.is_a?(Symbol) || !n.blank? }
|
||||||
|
@ -350,15 +350,15 @@ class Query < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
write_attribute(:column_names, names)
|
write_attribute(:column_names, names)
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_column?(column)
|
def has_column?(column)
|
||||||
column_names && column_names.include?(column.name)
|
column_names && column_names.include?(column.name)
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_default_columns?
|
def has_default_columns?
|
||||||
column_names.nil? || column_names.empty?
|
column_names.nil? || column_names.empty?
|
||||||
end
|
end
|
||||||
|
|
||||||
def sort_criteria=(arg)
|
def sort_criteria=(arg)
|
||||||
c = []
|
c = []
|
||||||
if arg.is_a?(Hash)
|
if arg.is_a?(Hash)
|
||||||
|
@ -367,19 +367,19 @@ class Query < ActiveRecord::Base
|
||||||
c = arg.select {|k,o| !k.to_s.blank?}.slice(0,3).collect {|k,o| [k.to_s, o == 'desc' ? o : 'asc']}
|
c = arg.select {|k,o| !k.to_s.blank?}.slice(0,3).collect {|k,o| [k.to_s, o == 'desc' ? o : 'asc']}
|
||||||
write_attribute(:sort_criteria, c)
|
write_attribute(:sort_criteria, c)
|
||||||
end
|
end
|
||||||
|
|
||||||
def sort_criteria
|
def sort_criteria
|
||||||
read_attribute(:sort_criteria) || []
|
read_attribute(:sort_criteria) || []
|
||||||
end
|
end
|
||||||
|
|
||||||
def sort_criteria_key(arg)
|
def sort_criteria_key(arg)
|
||||||
sort_criteria && sort_criteria[arg] && sort_criteria[arg].first
|
sort_criteria && sort_criteria[arg] && sort_criteria[arg].first
|
||||||
end
|
end
|
||||||
|
|
||||||
def sort_criteria_order(arg)
|
def sort_criteria_order(arg)
|
||||||
sort_criteria && sort_criteria[arg] && sort_criteria[arg].last
|
sort_criteria && sort_criteria[arg] && sort_criteria[arg].last
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the SQL sort order that should be prepended for grouping
|
# Returns the SQL sort order that should be prepended for grouping
|
||||||
def group_by_sort_order
|
def group_by_sort_order
|
||||||
if grouped? && (column = group_by_column)
|
if grouped? && (column = group_by_column)
|
||||||
|
@ -388,20 +388,20 @@ class Query < ActiveRecord::Base
|
||||||
"#{column.sortable} #{column.default_order}"
|
"#{column.sortable} #{column.default_order}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns true if the query is a grouped query
|
# Returns true if the query is a grouped query
|
||||||
def grouped?
|
def grouped?
|
||||||
!group_by_column.nil?
|
!group_by_column.nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
def group_by_column
|
def group_by_column
|
||||||
groupable_columns.detect {|c| c.groupable && c.name.to_s == group_by}
|
groupable_columns.detect {|c| c.groupable && c.name.to_s == group_by}
|
||||||
end
|
end
|
||||||
|
|
||||||
def group_by_statement
|
def group_by_statement
|
||||||
group_by_column.try(:groupable)
|
group_by_column.try(:groupable)
|
||||||
end
|
end
|
||||||
|
|
||||||
def project_statement
|
def project_statement
|
||||||
project_clauses = []
|
project_clauses = []
|
||||||
if project && !@project.descendants.active.empty?
|
if project && !@project.descendants.active.empty?
|
||||||
|
@ -435,12 +435,12 @@ class Query < ActiveRecord::Base
|
||||||
v = values_for(field).clone
|
v = values_for(field).clone
|
||||||
next unless v and !v.empty?
|
next unless v and !v.empty?
|
||||||
operator = operator_for(field)
|
operator = operator_for(field)
|
||||||
|
|
||||||
# "me" value subsitution
|
# "me" value subsitution
|
||||||
if %w(assigned_to_id author_id watcher_id).include?(field)
|
if %w(assigned_to_id author_id watcher_id).include?(field)
|
||||||
v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me")
|
v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me")
|
||||||
end
|
end
|
||||||
|
|
||||||
sql = ''
|
sql = ''
|
||||||
if field =~ /^cf_(\d+)$/
|
if field =~ /^cf_(\d+)$/
|
||||||
# custom field
|
# custom field
|
||||||
|
@ -472,7 +472,7 @@ class Query < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
user_ids.flatten.uniq.compact
|
user_ids.flatten.uniq.compact
|
||||||
}.sort.collect(&:to_s)
|
}.sort.collect(&:to_s)
|
||||||
|
|
||||||
sql << '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')'
|
sql << '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')'
|
||||||
|
|
||||||
elsif field == "assigned_to_role" # named field
|
elsif field == "assigned_to_role" # named field
|
||||||
|
@ -486,14 +486,14 @@ class Query < ActiveRecord::Base
|
||||||
roles = Role.givable.find_all_by_id(v)
|
roles = Role.givable.find_all_by_id(v)
|
||||||
end
|
end
|
||||||
roles ||= []
|
roles ||= []
|
||||||
|
|
||||||
members_of_roles = roles.inject([]) {|user_ids, role|
|
members_of_roles = roles.inject([]) {|user_ids, role|
|
||||||
if role && role.members
|
if role && role.members
|
||||||
user_ids << role.members.collect(&:user_id)
|
user_ids << role.members.collect(&:user_id)
|
||||||
end
|
end
|
||||||
user_ids.flatten.uniq.compact
|
user_ids.flatten.uniq.compact
|
||||||
}.sort.collect(&:to_s)
|
}.sort.collect(&:to_s)
|
||||||
|
|
||||||
sql << '(' + sql_for_field("assigned_to_id", operator, members_of_roles, Issue.table_name, "assigned_to_id", false) + ')'
|
sql << '(' + sql_for_field("assigned_to_id", operator, members_of_roles, Issue.table_name, "assigned_to_id", false) + ')'
|
||||||
else
|
else
|
||||||
# regular field
|
# regular field
|
||||||
|
@ -502,22 +502,22 @@ class Query < ActiveRecord::Base
|
||||||
sql << '(' + sql_for_field(field, operator, v, db_table, db_field) + ')'
|
sql << '(' + sql_for_field(field, operator, v, db_table, db_field) + ')'
|
||||||
end
|
end
|
||||||
filters_clauses << sql
|
filters_clauses << sql
|
||||||
|
|
||||||
end if filters and valid?
|
end if filters and valid?
|
||||||
|
|
||||||
filters_clauses << project_statement
|
filters_clauses << project_statement
|
||||||
filters_clauses.reject!(&:blank?)
|
filters_clauses.reject!(&:blank?)
|
||||||
|
|
||||||
filters_clauses.any? ? filters_clauses.join(' AND ') : nil
|
filters_clauses.any? ? filters_clauses.join(' AND ') : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the issue count
|
# Returns the issue count
|
||||||
def issue_count
|
def issue_count
|
||||||
Issue.count(:include => [:status, :project], :conditions => statement)
|
Issue.count(:include => [:status, :project], :conditions => statement)
|
||||||
rescue ::ActiveRecord::StatementInvalid => e
|
rescue ::ActiveRecord::StatementInvalid => e
|
||||||
raise StatementInvalid.new(e.message)
|
raise StatementInvalid.new(e.message)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the issue count by group or nil if query is not grouped
|
# Returns the issue count by group or nil if query is not grouped
|
||||||
def issue_count_by_group
|
def issue_count_by_group
|
||||||
r = nil
|
r = nil
|
||||||
|
@ -537,13 +537,13 @@ class Query < ActiveRecord::Base
|
||||||
rescue ::ActiveRecord::StatementInvalid => e
|
rescue ::ActiveRecord::StatementInvalid => e
|
||||||
raise StatementInvalid.new(e.message)
|
raise StatementInvalid.new(e.message)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the issues
|
# Returns the issues
|
||||||
# Valid options are :order, :offset, :limit, :include, :conditions
|
# Valid options are :order, :offset, :limit, :include, :conditions
|
||||||
def issues(options={})
|
def issues(options={})
|
||||||
order_option = [group_by_sort_order, options[:order]].reject {|s| s.blank?}.join(',')
|
order_option = [group_by_sort_order, options[:order]].reject {|s| s.blank?}.join(',')
|
||||||
order_option = nil if order_option.blank?
|
order_option = nil if order_option.blank?
|
||||||
|
|
||||||
Issue.visible.find :all, :include => ([:status, :project] + (options[:include] || [])).uniq,
|
Issue.visible.find :all, :include => ([:status, :project] + (options[:include] || [])).uniq,
|
||||||
:conditions => Query.merge_conditions(statement, options[:conditions]),
|
:conditions => Query.merge_conditions(statement, options[:conditions]),
|
||||||
:order => order_option,
|
:order => order_option,
|
||||||
|
@ -564,7 +564,7 @@ class Query < ActiveRecord::Base
|
||||||
rescue ::ActiveRecord::StatementInvalid => e
|
rescue ::ActiveRecord::StatementInvalid => e
|
||||||
raise StatementInvalid.new(e.message)
|
raise StatementInvalid.new(e.message)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the versions
|
# Returns the versions
|
||||||
# Valid options are :conditions
|
# Valid options are :conditions
|
||||||
def versions(options={})
|
def versions(options={})
|
||||||
|
@ -573,9 +573,9 @@ class Query < ActiveRecord::Base
|
||||||
rescue ::ActiveRecord::StatementInvalid => e
|
rescue ::ActiveRecord::StatementInvalid => e
|
||||||
raise StatementInvalid.new(e.message)
|
raise StatementInvalid.new(e.message)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# Helper method to generate the WHERE sql for a +field+, +operator+ and a +value+
|
# Helper method to generate the WHERE sql for a +field+, +operator+ and a +value+
|
||||||
def sql_for_field(field, operator, value, db_table, db_field, is_custom_filter=false)
|
def sql_for_field(field, operator, value, db_table, db_field, is_custom_filter=false)
|
||||||
sql = ''
|
sql = ''
|
||||||
|
@ -632,13 +632,13 @@ class Query < ActiveRecord::Base
|
||||||
when "!~"
|
when "!~"
|
||||||
sql = "LOWER(#{db_table}.#{db_field}) NOT LIKE '%#{connection.quote_string(value.first.to_s.downcase)}%'"
|
sql = "LOWER(#{db_table}.#{db_field}) NOT LIKE '%#{connection.quote_string(value.first.to_s.downcase)}%'"
|
||||||
end
|
end
|
||||||
|
|
||||||
return sql
|
return sql
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_custom_fields_filters(custom_fields)
|
def add_custom_fields_filters(custom_fields)
|
||||||
@available_filters ||= {}
|
@available_filters ||= {}
|
||||||
|
|
||||||
custom_fields.select(&:is_filter?).each do |field|
|
custom_fields.select(&:is_filter?).each do |field|
|
||||||
case field.field_format
|
case field.field_format
|
||||||
when "text"
|
when "text"
|
||||||
|
@ -658,7 +658,7 @@ class Query < ActiveRecord::Base
|
||||||
@available_filters["cf_#{field.id}"] = options.merge({ :name => field.name })
|
@available_filters["cf_#{field.id}"] = options.merge({ :name => field.name })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a SQL clause for a date or datetime field.
|
# Returns a SQL clause for a date or datetime field.
|
||||||
def date_range_clause(table, field, from, to)
|
def date_range_clause(table, field, from, to)
|
||||||
s = []
|
s = []
|
||||||
|
|
Loading…
Reference in New Issue