##// END OF EJS Templates
Replaces find(:first/:all) calls....
Replaces find(:first/:all) calls. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10931 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r10704:ea296a109a86
r10704:ea296a109a86
Show More
query.rb
1086 lines | 41.0 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Adds support for free ticket filtering and custom queries on Calendar....
r1796 # Redmine - project management software
Jean-Philippe Lang
Copyright update....
r9453 # Copyright (C) 2006-2012 Jean-Philippe Lang
Jean-Philippe Lang
"queries" branch merged...
r92 #
# 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.
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702 #
Jean-Philippe Lang
"queries" branch merged...
r92 # 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.
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702 #
Jean-Philippe Lang
"queries" branch merged...
r92 # 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.
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702 class QueryColumn
Jean-Philippe Lang
Reverts r3072 (#4302: error raised when sorting on an association not included as column)....
r2983 attr_accessor :name, :sortable, :groupable, :default_order
Jean-Philippe Lang
Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2....
r2430 include Redmine::I18n
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 def initialize(name, options={})
self.name = name
self.sortable = options[:sortable]
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 self.groupable = options[:groupable] || false
Jean-Philippe Lang
Allow issue grouping by custom field (#2679)....
r2957 if groupable == true
self.groupable = name.to_s
end
Jean-Philippe Lang
More appropriate default sort order on sortable columns....
r1107 self.default_order = options[:default_order]
Jean-Philippe Lang
Issue list improvements for subtasking (#5196):...
r3504 @caption_key = options[:caption] || "field_#{name}"
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Custom fields can now be displayed as columns on the issue list....
r876 def caption
Jean-Philippe Lang
Issue list improvements for subtasking (#5196):...
r3504 l(@caption_key)
Jean-Philippe Lang
Custom fields can now be displayed as columns on the issue list....
r876 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Ability to save "sort order" in custom queries (#2899)....
r2504 # Returns true if the column is sortable, otherwise false
def sortable?
Jean-Philippe Lang
Sort the issue list by author/assignee according to user display format (#9669)....
r7818 !@sortable.nil?
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb...
r10262
Jean-Philippe Lang
Sort the issue list by author/assignee according to user display format (#9669)....
r7818 def sortable
@sortable.is_a?(Proc) ? @sortable.call : @sortable
Jean-Philippe Lang
Ability to save "sort order" in custom queries (#2899)....
r2504 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Fixed: "None" category issue count is empty while grouping by category (#4308)....
r2998 def value(issue)
issue.send name
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Wrap text custom fields in the issue list (#8064)....
r5212 def css_classes
name
end
Jean-Philippe Lang
Custom fields can now be displayed as columns on the issue list....
r876 end
class QueryCustomFieldColumn < QueryColumn
def initialize(custom_field)
self.name = "cf_#{custom_field.id}".to_sym
Jean-Philippe Lang
Ability to sort the issue list by text, list, date and boolean custom fields (#1139)....
r2255 self.sortable = custom_field.order_statement || false
Jean-Philippe Lang
Adds CustomField#group_statement....
r9888 self.groupable = custom_field.group_statement || false
Jean-Philippe Lang
Custom fields can now be displayed as columns on the issue list....
r876 @cf = custom_field
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Custom fields can now be displayed as columns on the issue list....
r876 def caption
@cf.name
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Custom fields can now be displayed as columns on the issue list....
r876 def custom_field
@cf
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Fixed: "None" category issue count is empty while grouping by category (#4308)....
r2998 def value(issue)
Jean-Philippe Lang
Call sort for array with more than one element only....
r10309 cv = issue.custom_values.select {|v| v.custom_field_id == @cf.id}.collect {|v| @cf.cast_value(v.value)}
cv.size > 1 ? cv.sort {|a,b| a.to_s <=> b.to_s} : cv.first
Jean-Philippe Lang
Fixed: "None" category issue count is empty while grouping by category (#4308)....
r2998 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Wrap text custom fields in the issue list (#8064)....
r5212 def css_classes
@css_classes ||= "#{name} #{@cf.field_format}"
end
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 end
Jean-Philippe Lang
"queries" branch merged...
r92 class Query < ActiveRecord::Base
Jean-Philippe Lang
Rescue invalid query statement error with an error message....
r2990 class StatementInvalid < ::ActiveRecord::StatementInvalid
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
"queries" branch merged...
r92 belongs_to :project
belongs_to :user
serialize :filters
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 serialize :column_names
Jean-Philippe Lang
Ability to save "sort order" in custom queries (#2899)....
r2504 serialize :sort_criteria, Array
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Fix query management broken by r1027....
r1018 attr_protected :project_id, :user_id
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Removed useless option....
r8858 validates_presence_of :name
Jean-Philippe Lang
Added several validates_length_of...
r590 validates_length_of :name, :maximum => 255
Toshi MARUYAMA
Rails3: replace deprecated 'validate' method at Query model...
r7305 validate :validate_query_filters
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
@@operators = { "=" => :label_equals,
Jean-Philippe Lang
"queries" branch merged...
r92 "!" => :label_not_equals,
"o" => :label_open_issues,
"c" => :label_closed_issues,
"!*" => :label_none,
Jean-Philippe Lang
Adds label_any string for filters....
r10351 "*" => :label_any,
Azamat Hackimov
Fixing bug #3009, trivial updates of locales...
r2538 ">=" => :label_greater_or_equal,
"<=" => :label_less_or_equal,
Jean-Philippe Lang
Adds "between" operator for numeric filters (#6180)....
r6097 "><" => :label_between,
Jean-Philippe Lang
"queries" branch merged...
r92 "<t+" => :label_in_less_than,
">t+" => :label_in_more_than,
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 "><t+"=> :label_in_the_next_days,
Jean-Philippe Lang
"queries" branch merged...
r92 "t+" => :label_in,
"t" => :label_today,
Jean-Philippe Lang
Added a new value for date filters: 'this week'...
r693 "w" => :label_this_week,
Jean-Philippe Lang
"queries" branch merged...
r92 ">t-" => :label_less_than_ago,
"<t-" => :label_more_than_ago,
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 "><t-"=> :label_in_the_past_days,
Jean-Philippe Lang
"queries" branch merged...
r92 "t-" => :label_ago,
"~" => :label_contains,
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 "!~" => :label_not_contains,
"=p" => :label_any_issues_in_project,
Jean-Philippe Lang
Adds no_issue_in_project operator for relations filter (#3265)....
r10348 "=!p" => :label_any_issues_not_in_project,
"!p" => :label_no_issues_in_project}
Jean-Philippe Lang
"queries" branch merged...
r92
cattr_reader :operators
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
"queries" branch merged...
r92 @@operators_by_filter_type = { :list => [ "=", "!" ],
:list_status => [ "o", "=", "!", "c", "*" ],
:list_optional => [ "=", "!", "!*", "*" ],
Jean-Philippe Lang
Include subprojects on the issue list, calendar and gantt by default....
r1164 :list_subprojects => [ "*", "!*", "=" ],
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 :date => [ "=", ">=", "<=", "><", "<t+", ">t+", "><t+", "t+", "t", "w", ">t-", "<t-", "><t-", "t-", "!*", "*" ],
:date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "><t-", "t-", "t", "w", "!*", "*" ],
Jean-Philippe Lang
Adds all/none operators to text custom field filters (#9790)....
r9488 :string => [ "=", "~", "!", "!~", "!*", "*" ],
:text => [ "~", "!~", "!*", "*" ],
Jean-Philippe Lang
Fixes "=" filter on float values....
r6136 :integer => [ "=", ">=", "<=", "><", "!*", "*" ],
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 :float => [ "=", ">=", "<=", "><", "!*", "*" ],
Jean-Philippe Lang
Adds no_issue_in_project operator for relations filter (#3265)....
r10348 :relation => ["=", "=p", "=!p", "!p", "!*", "*"]}
Jean-Philippe Lang
"queries" branch merged...
r92
cattr_reader :operators_by_filter_type
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 @@available_columns = [
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 QueryColumn.new(:project, :sortable => "#{Project.table_name}.name", :groupable => true),
Jean-Philippe Lang
Reverts r3072 (#4302: error raised when sorting on an association not included as column)....
r2983 QueryColumn.new(:tracker, :sortable => "#{Tracker.table_name}.position", :groupable => true),
Jean-Philippe Lang
Issue list improvements for subtasking (#5196):...
r3504 QueryColumn.new(:parent, :sortable => ["#{Issue.table_name}.root_id", "#{Issue.table_name}.lft ASC"], :default_order => 'desc', :caption => :field_parent_issue),
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 QueryColumn.new(:status, :sortable => "#{IssueStatus.table_name}.position", :groupable => true),
Eric Davis
Changed Enumerations to use a Single Table Inheritance...
r2677 QueryColumn.new(:priority, :sortable => "#{IssuePriority.table_name}.position", :default_order => 'desc', :groupable => true),
Jean-Philippe Lang
More appropriate default sort order on sortable columns....
r1107 QueryColumn.new(:subject, :sortable => "#{Issue.table_name}.subject"),
Jean-Philippe Lang
Sort the issue list by author/assignee according to user display format (#9669)....
r7818 QueryColumn.new(:author, :sortable => lambda {User.fields_for_order_statement("authors")}, :groupable => true),
QueryColumn.new(:assigned_to, :sortable => lambda {User.fields_for_order_statement}, :groupable => true),
Jean-Philippe Lang
More appropriate default sort order on sortable columns....
r1107 QueryColumn.new(:updated_on, :sortable => "#{Issue.table_name}.updated_on", :default_order => 'desc'),
Jean-Philippe Lang
Reverts r3072 (#4302: error raised when sorting on an association not included as column)....
r2983 QueryColumn.new(:category, :sortable => "#{IssueCategory.table_name}.name", :groupable => true),
Jean-Philippe Lang
Sort versions ascending when grouping issues by version (#11153)....
r9893 QueryColumn.new(:fixed_version, :sortable => lambda {Version.fields_for_order_statement}, :groupable => true),
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 QueryColumn.new(:start_date, :sortable => "#{Issue.table_name}.start_date"),
QueryColumn.new(:due_date, :sortable => "#{Issue.table_name}.due_date"),
QueryColumn.new(:estimated_hours, :sortable => "#{Issue.table_name}.estimated_hours"),
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 QueryColumn.new(:done_ratio, :sortable => "#{Issue.table_name}.done_ratio", :groupable => true),
Jean-Philippe Lang
More appropriate default sort order on sortable columns....
r1107 QueryColumn.new(:created_on, :sortable => "#{Issue.table_name}.created_on", :default_order => 'desc'),
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 QueryColumn.new(:relations, :caption => :label_related_issues)
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 ]
cattr_reader :available_columns
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Toshi MARUYAMA
model: replace Rails2 "named_scope" to Rails3 "scope"...
r9355 scope :visible, lambda {|*args|
Jean-Philippe Lang
Makes custom queries available through the REST API (#5737)....
r6066 user = args.shift || User.current
base = Project.allowed_to_condition(user, :view_issues, *args)
user_id = user.logged? ? user.id : 0
{
:conditions => ["(#{table_name}.project_id IS NULL OR (#{base})) AND (#{table_name}.is_public = ? OR #{table_name}.user_id = ?)", true, user_id],
:include => :project
}
}
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Makes models #initialize accept additional arguments....
r8167 def initialize(attributes=nil, *args)
Jean-Philippe Lang
"queries" branch merged...
r92 super attributes
self.filters ||= { 'status_id' => {:operator => "o", :values => [""]} }
Jean-Philippe Lang
Queries can be marked as 'For all projects'. Such queries will be available on all projects and on the global issue list (#897, closes #671)....
r1296 @is_for_all = project.nil?
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Toshi MARUYAMA
Rails3: replace deprecated 'validate' method at Query model...
r7305 def validate_query_filters
Jean-Philippe Lang
"queries" branch merged...
r92 filters.each_key do |field|
Jean-Philippe Lang
Fixes "=" filter on float values....
r6136 if values_for(field)
case type_for(field)
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345 when :integer
Jean-Philippe Lang
Fixed: Can't filter for negative numeric custom field (#11307)....
r9725 add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^[+-]?\d+$/) }
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345 when :float
Jean-Philippe Lang
Fixed: Can't filter for negative numeric custom field (#11307)....
r9725 add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^[+-]?\d+(\.\d*)?$/) }
Jean-Philippe Lang
Validate date filters values....
r6144 when :date, :date_past
case operator_for(field)
when "=", ">=", "<=", "><"
Jean-Philippe Lang
Do not add errors on attributes on fake attributes....
r8268 add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && (!v.match(/^\d{4}-\d{2}-\d{2}$/) || (Date.parse(v) rescue nil).nil?) }
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 when ">t-", "<t-", "t-", ">t+", "<t+", "t+", "><t+", "><t-"
Jean-Philippe Lang
Do not add errors on attributes on fake attributes....
r8268 add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+$/) }
Jean-Philippe Lang
Validate date filters values....
r6144 end
Jean-Philippe Lang
Fixes "=" filter on float values....
r6136 end
Jean-Philippe Lang
Keep invalid values and add validation error message....
r6109 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Do not add errors on attributes on fake attributes....
r8268 add_filter_error(field, :blank) unless
Jean-Philippe Lang
"queries" branch merged...
r92 # filter requires one or more values
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702 (values_for(field) and !values_for(field).first.blank?) or
Jean-Philippe Lang
"queries" branch merged...
r92 # filter doesn't require any value
Jean-Philippe Lang
Added a new value for date filters: 'this week'...
r693 ["o", "c", "!*", "*", "t", "w"].include? operator_for(field)
Jean-Philippe Lang
"queries" branch merged...
r92 end if filters
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Do not add errors on attributes on fake attributes....
r8268 def add_filter_error(field, message)
m = label_for(field) + " " + l(message, :scope => 'activerecord.errors.messages')
errors.add(:base, m)
end
Jean-Philippe Lang
Fixed: private queries should not be accessible to other users (#8729)....
r6043 # Returns true if the query is visible to +user+ or the current user.
def visible?(user=User.current)
Jean-Philippe Lang
Makes custom queries available through the REST API (#5737)....
r6066 (project.nil? || user.allowed_to?(:view_issues, project)) && (self.is_public? || self.user_id == user.id)
Jean-Philippe Lang
Fixed: private queries should not be accessible to other users (#8729)....
r6043 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Added per user custom queries....
r563 def editable_by?(user)
return false unless user
Jean-Philippe Lang
Queries can be marked as 'For all projects'. Such queries will be available on all projects and on the global issue list (#897, closes #671)....
r1296 # Admin can edit them all and regular users can edit their private queries
return true if user.admin? || (!is_public && self.user_id == user.id)
# 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)
Jean-Philippe Lang
Added per user custom queries....
r563 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Ability to disable standard fields on a per tracker basis (#1091)....
r9729 def trackers
Jean-Philippe Lang
Replaces find(:all) calls....
r10690 @trackers ||= project.nil? ? Tracker.sorted.all : project.rolled_up_trackers
Jean-Philippe Lang
Ability to disable standard fields on a per tracker basis (#1091)....
r9729 end
Jean-Philippe Lang
Build issue filters using javascript....
r9979 # Returns a hash of localized labels for all filter operators
def self.operators_labels
operators.inject({}) {|h, operator| h[operator.first] = l(operator.last); h}
end
Jean-Philippe Lang
"queries" branch merged...
r92 def available_filters
return @available_filters if @available_filters
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters = {
"status_id" => {
Toshi MARUYAMA
change "status" issue filter order from 1 to 0 (#12018)...
r10340 :type => :list_status, :order => 0,
Jean-Philippe Lang
Replaces find(:all) calls....
r10690 :values => IssueStatus.sorted.all.collect{|s| [s.name, s.id.to_s] }
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 },
"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] }
},
"subject" => { :type => :text, :order => 8 },
"created_on" => { :type => :date_past, :order => 9 },
"updated_on" => { :type => :date_past, :order => 10 },
"start_date" => { :type => :date, :order => 11 },
"due_date" => { :type => :date, :order => 12 },
"estimated_hours" => { :type => :float, :order => 13 },
"done_ratio" => { :type => :integer, :order => 14 }
}
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 IssueRelation::TYPES.each do |relation_type, options|
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters[relation_type] = {
:type => :relation, :order => @available_filters.size + 100,
:label => options[:name]
}
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 end
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 principals = []
Jean-Philippe Lang
Added a cross-project issue list. It displays the issues of all the projects visible by the user....
r673 if project
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 principals += project.principals.sort
Jean-Philippe Lang
Adds members of subprojects in assignee and author filters (#10126)....
r8627 unless project.leaf?
subprojects = project.descendants.visible.all
if subprojects.any?
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters["subproject_id"] = {
:type => :list_subprojects, :order => 13,
:values => subprojects.collect{|s| [s.name, s.id.to_s] }
}
Jean-Philippe Lang
Adds members of subprojects in assignee and author filters (#10126)....
r8627 principals += Principal.member_of(subprojects)
end
end
Jean-Philippe Lang
Fixed: 'assigned to me' filter broken....
r966 else
Jean-Philippe Lang
Prevents n SQL queries (n = project count) on cross-project issues list....
r4436 if all_projects.any?
# members of visible projects
Jean-Philippe Lang
Adds members of subprojects in assignee and author filters (#10126)....
r8627 principals += Principal.member_of(all_projects)
Jean-Philippe Lang
Prevents n SQL queries (n = project count) on cross-project issues list....
r4436 # project filter
project_values = []
Jean-Philippe Lang
Adds "my projects" filter on the cross-project issue list....
r8517 if User.current.logged? && User.current.memberships.any?
project_values << ["<< #{l(:label_my_projects).downcase} >>", "mine"]
end
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 project_values += all_projects_values
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters["project_id"] = {
:type => :list, :order => 1, :values => project_values
} unless project_values.empty?
Jean-Philippe Lang
Optimize retrieval of user's projects members....
r3493 end
Jean-Philippe Lang
Added a cross-project issue list. It displays the issues of all the projects visible by the user....
r673 end
Jean-Philippe Lang
Adds members of subprojects in assignee and author filters (#10126)....
r8627 principals.uniq!
principals.sort!
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 users = principals.select {|p| p.is_a?(User)}
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 assigned_to_values = []
assigned_to_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged?
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 assigned_to_values += (Setting.issue_group_assignment? ?
principals : users).collect{|s| [s.name, s.id.to_s] }
@available_filters["assigned_to_id"] = {
:type => :list_optional, :order => 4, :values => assigned_to_values
} unless assigned_to_values.empty?
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 author_values = []
author_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged?
author_values += users.collect{|s| [s.name, s.id.to_s] }
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters["author_id"] = {
:type => :list, :order => 5, :values => author_values
} unless author_values.empty?
Eric Davis
Added a "Member of Group" to the issues filter. #5869...
r3963
Eric Davis
Remember the selected "Member of Role" and "Member of Group" options. #6467...
r4146 group_values = Group.all.collect {|g| [g.name, g.id.to_s] }
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters["member_of_group"] = {
:type => :list_optional, :order => 6, :values => group_values
} unless group_values.empty?
Eric Davis
Added a "Member of Role" to the issues filters. #5869...
r3964
Eric Davis
Remember the selected "Member of Role" and "Member of Group" options. #6467...
r4146 role_values = Role.givable.collect {|r| [r.name, r.id.to_s] }
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters["assigned_to_role"] = {
:type => :list_optional, :order => 7, :values => role_values
} unless role_values.empty?
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Adds ability to filter watched issues (#846)....
r2395 if User.current.logged?
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters["watcher_id"] = {
:type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]]
}
Jean-Philippe Lang
Adds ability to filter watched issues (#846)....
r2395 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Added a cross-project issue list. It displays the issues of all the projects visible by the user....
r673 if project
Jean-Philippe Lang
Add filters on cross-project issue list for custom fields marked as 'For all projects'....
r1562 # project specific filters
Jean-Philippe Lang
Do not use instance variable....
r7777 categories = project.issue_categories.all
Jean-Philippe Lang
Skip a few count(*) SQL queries on the issue list....
r5172 unless categories.empty?
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters["category_id"] = {
:type => :list_optional, :order => 6,
:values => categories.collect{|s| [s.name, s.id.to_s] }
}
Jean-Philippe Lang
Add filters on cross-project issue list for custom fields marked as 'For all projects'....
r1562 end
Jean-Philippe Lang
Do not use instance variable....
r7777 versions = project.shared_versions.all
Jean-Philippe Lang
Skip a few count(*) SQL queries on the issue list....
r5172 unless versions.empty?
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters["fixed_version_id"] = {
:type => :list_optional, :order => 7,
:values => versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] }
}
Jean-Philippe Lang
Hide 'Target version' filter if no version is defined....
r1561 end
Jean-Philippe Lang
Do not use instance variable....
r7777 add_custom_fields_filters(project.all_issue_custom_fields)
Jean-Philippe Lang
Add filters on cross-project issue list for custom fields marked as 'For all projects'....
r1562 else
# global filters for cross project issue list
Jean-Philippe Lang
Adds filter for system shared versions on the cross project issue list (#4792)....
r3295 system_shared_versions = Version.visible.find_all_by_sharing('system')
unless system_shared_versions.empty?
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters["fixed_version_id"] = {
:type => :list_optional, :order => 7,
:values => system_shared_versions.sort.collect{|s|
["#{s.project.name} - #{s.name}", s.id.to_s]
}
}
Jean-Philippe Lang
Adds filter for system shared versions on the cross project issue list (#4792)....
r3295 end
Jean-Philippe Lang
Replaces find(:all) calls....
r10690 add_custom_fields_filters(IssueCustomField.where(:is_filter => true, :is_for_all => true).all)
Jean-Philippe Lang
"queries" branch merged...
r92 end
Jean-Philippe Lang
Ability to filter issues using project, author, assignee and target version custom fields (#8161)....
r9981 add_associations_custom_fields_filters :project, :author, :assigned_to, :fixed_version
Jean-Philippe Lang
Adds Private filter to the issue list (#8577)....
r9737 if User.current.allowed_to?(:set_issues_private, nil, :global => true) ||
User.current.allowed_to?(:set_own_issues_private, nil, :global => true)
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 @available_filters["is_private"] = {
Toshi MARUYAMA
change "is_private" issue filter order from 15 to 16 (#12018)...
r10341 :type => :list, :order => 16,
Toshi MARUYAMA
code layout cleanup Query available_filters method...
r10334 :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]]
}
Jean-Philippe Lang
Adds Private filter to the issue list (#8577)....
r9737 end
Jean-Philippe Lang
Ability to disable standard fields on a per tracker basis (#1091)....
r9729 Tracker.disabled_core_fields(trackers).each {|field|
@available_filters.delete field
}
Jean-Philippe Lang
Build issue filters using javascript....
r9979 @available_filters.each do |field, options|
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 options[:name] ||= l(options[:label] || "field_#{field}".gsub(/_id$/, ''))
Jean-Philippe Lang
Build issue filters using javascript....
r9979 end
Jean-Philippe Lang
"queries" branch merged...
r92 @available_filters
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Toshi MARUYAMA
replace tab to space at app/models/query.rb...
r10261 # Returns a representation of the available filters for JSON serialization
Jean-Philippe Lang
Build issue filters using javascript....
r9979 def available_filters_as_json
json = {}
available_filters.each do |field, options|
json[field] = options.slice(:type, :name, :values).stringify_keys
end
json
end
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 def all_projects
@all_projects ||= Project.visible.all
end
def all_projects_values
return @all_projects_values if @all_projects_values
values = []
Project.project_tree(all_projects) do |p, level|
prefix = (level > 0 ? ('--' * level + ' ') : '')
values << ["#{prefix}#{p.name}", p.id.to_s]
end
@all_projects_values = values
end
Jean-Philippe Lang
"queries" branch merged...
r92 def add_filter(field, operator, values)
# values must be an array
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 return unless values.nil? || values.is_a?(Array)
Jean-Philippe Lang
"queries" branch merged...
r92 # check if field is defined as an available filter
if available_filters.has_key? field
filter_options = available_filters[field]
# check if operator is allowed for that filter
#if @@operators_by_filter_type[filter_options[:type]].include? operator
# allowed_values = values & ([""] + (filter_options[:values] || []).collect {|val| val[1]})
# filters[field] = {:operator => operator, :values => allowed_values } if (allowed_values.first and !allowed_values.first.empty?) or ["o", "c", "!*", "*", "t"].include? operator
#end
Jean-Philippe Lang
Keep invalid values and add validation error message....
r6109 filters[field] = {:operator => operator, :values => (values || [''])}
Jean-Philippe Lang
"queries" branch merged...
r92 end
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
"queries" branch merged...
r92 def add_short_filter(field, expression)
Etienne Massip
Fixed shot filter expression parsing depending upon field operators (#8371)....
r7504 return unless expression && available_filters.has_key?(field)
field_type = available_filters[field][:type]
@@operators_by_filter_type[field_type].sort.reverse.detect do |operator|
next unless expression =~ /^#{Regexp.escape(operator)}(.*)$/
add_filter field, operator, $1.present? ? $1.split('|') : ['']
end || add_filter(field, '=', expression.split('|'))
Jean-Philippe Lang
"queries" branch merged...
r92 end
Eric Davis
Refactor: Move method to Query model...
r3570
# Add multiple filters using +add_filter+
def add_filters(fields, operators, values)
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 if fields.is_a?(Array) && operators.is_a?(Hash) && (values.nil? || values.is_a?(Hash))
Jean-Philippe Lang
Fixed: unchecking status filter on the issue list has no effect (#6844)....
r4273 fields.each do |field|
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 add_filter(field, operators[field], values && values[field])
Jean-Philippe Lang
Fixed: unchecking status filter on the issue list has no effect (#6844)....
r4273 end
Eric Davis
Refactor: Move method to Query model...
r3570 end
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
"queries" branch merged...
r92 def has_filter?(field)
filters and filters[field]
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 def type_for(field)
available_filters[field][:type] if available_filters.has_key?(field)
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
"queries" branch merged...
r92 def operator_for(field)
has_filter?(field) ? filters[field][:operator] : nil
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
"queries" branch merged...
r92 def values_for(field)
has_filter?(field) ? filters[field][:values] : nil
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Adds "between" operator for numeric filters (#6180)....
r6097 def value_for(field, index=0)
(values_for(field) || [])[index]
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Custom fields for issues can now be used as filters on issue list....
r444 def label_for(field)
Jean-Philippe Lang
Prevents NoMethodError on @available_filters.has_key? in query.rb (#1178)....
r1440 label = available_filters[field][:name] if available_filters.has_key?(field)
Jean-Philippe Lang
Do not add errors on attributes on fake attributes....
r8268 label ||= l("field_#{field.to_s.gsub(/_id$/, '')}", :default => field)
Jean-Philippe Lang
Custom fields for issues can now be used as filters on issue list....
r444 end
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771
def available_columns
Jean-Philippe Lang
Custom fields can now be displayed as columns on the issue list....
r876 return @available_columns if @available_columns
Jean-Philippe Lang
Makes spent time column available on the issue list (#971)....
r7953 @available_columns = ::Query.available_columns.dup
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345 @available_columns += (project ?
Jean-Philippe Lang
Custom fields refactoring: most of code moved from controllers to models (using new module ActsAsCustomizable)....
r1578 project.all_issue_custom_fields :
Jean-Philippe Lang
Replaces find(:all) calls....
r10690 IssueCustomField.all
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702 ).collect {|cf| QueryCustomFieldColumn.new(cf) }
Jean-Philippe Lang
Makes spent time column available on the issue list (#971)....
r7953
if User.current.allowed_to?(:view_time_entries, project, :global => true)
Jean-Philippe Lang
Tests broken with ruby1.8.6 (#9751)....
r8008 index = nil
@available_columns.each_with_index {|column, i| index = i if column.name == :estimated_hours}
Jean-Philippe Lang
Makes spent time column available on the issue list (#971)....
r7953 index = (index ? index + 1 : -1)
# insert the column after estimated_hours or at the end
@available_columns.insert index, QueryColumn.new(:spent_hours,
Jean-Philippe Lang
Fixes spent time column sort for postgresql....
r7957 :sortable => "(SELECT COALESCE(SUM(hours), 0) FROM #{TimeEntry.table_name} WHERE #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id)",
Jean-Philippe Lang
Makes spent time column available on the issue list (#971)....
r7953 :default_order => 'desc',
:caption => :label_spent_time
)
end
Jean-Philippe Lang
Ability to disable standard fields on a per tracker basis (#1091)....
r9729
Jean-Philippe Lang
Makes Private column available on the issue list (#8577)....
r9736 if User.current.allowed_to?(:set_issues_private, nil, :global => true) ||
User.current.allowed_to?(:set_own_issues_private, nil, :global => true)
@available_columns << QueryColumn.new(:is_private, :sortable => "#{Issue.table_name}.is_private")
end
Jean-Philippe Lang
Ability to disable standard fields on a per tracker basis (#1091)....
r9729 disabled_fields = Tracker.disabled_core_fields(trackers).map {|field| field.sub(/_id$/, '')}
@available_columns.reject! {|column|
disabled_fields.include?(column.name.to_s)
}
Jean-Philippe Lang
Makes spent time column available on the issue list (#971)....
r7953 @available_columns
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 end
Eric Davis
Adding missing setter for Query#available_columns...
r3571
def self.available_columns=(v)
self.available_columns = (v)
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Eric Davis
Adding missing setter for Query#available_columns...
r3571 def self.add_available_column(column)
self.available_columns << (column) if column.is_a?(QueryColumn)
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 # Returns an array of columns that can be used to group the results
def groupable_columns
available_columns.select {|c| c.groupable}
end
Eric Davis
Refactor: Extract Query#sortable_columns from the controller....
r3490
# Returns a Hash of columns and the key for sorting
def sortable_columns
{'id' => "#{Issue.table_name}.id"}.merge(available_columns.inject({}) {|h, column|
h[column.name.to_s] = column.sortable
h
})
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 def columns
Etienne Massip
Allow project column to be removed from the global issue list columns (#8411)....
r7418 # preserve the column_names order
(has_default_columns? ? default_columns_names : column_names).collect do |name|
available_columns.find { |col| col.name == name }
end.compact
end
def default_columns_names
@default_columns_names ||= begin
default_columns = Setting.issue_list_default_columns.map(&:to_sym)
project.present? ? default_columns : [:project] | default_columns
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 end
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 def column_names=(names)
Jean-Philippe Lang
Adds dynamic columns selection on the issue list (#4272)....
r2991 if names
names = names.select {|n| n.is_a?(Symbol) || !n.blank? }
names = names.collect {|n| n.is_a?(Symbol) ? n : n.to_sym }
# Set column_names to nil if default columns
Etienne Massip
Allow project column to be removed from the global issue list columns (#8411)....
r7418 if names == default_columns_names
Jean-Philippe Lang
Adds dynamic columns selection on the issue list (#4272)....
r2991 names = nil
end
end
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 write_attribute(:column_names, names)
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 def has_column?(column)
Jean-Philippe Lang
Makes spent time column available on the issue list (#971)....
r7953 column_names && column_names.include?(column.is_a?(QueryColumn) ? column.name : column)
Jean-Philippe Lang
Added the ability to customize columns of a saved query....
r771 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Added a checkbox on custom query form to explicitly say if the query uses default columns or not....
r772 def has_default_columns?
column_names.nil? || column_names.empty?
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Ability to save "sort order" in custom queries (#2899)....
r2504 def sort_criteria=(arg)
c = []
if arg.is_a?(Hash)
arg = arg.keys.sort.collect {|k| arg[k]}
end
Jean-Philippe Lang
Ability to sort issues by grouped column (#3511)....
r10543 c = arg.select {|k,o| !k.to_s.blank?}.slice(0,3).collect {|k,o| [k.to_s, (o == 'desc' || o == false) ? 'desc' : 'asc']}
Jean-Philippe Lang
Ability to save "sort order" in custom queries (#2899)....
r2504 write_attribute(:sort_criteria, c)
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Ability to save "sort order" in custom queries (#2899)....
r2504 def sort_criteria
read_attribute(:sort_criteria) || []
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Ability to save "sort order" in custom queries (#2899)....
r2504 def sort_criteria_key(arg)
sort_criteria && sort_criteria[arg] && sort_criteria[arg].first
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Ability to save "sort order" in custom queries (#2899)....
r2504 def sort_criteria_order(arg)
sort_criteria && sort_criteria[arg] && sort_criteria[arg].last
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Ability to sort issues by grouped column (#3511)....
r10543 def sort_criteria_order_for(key)
sort_criteria.detect {|k, order| key.to_s == k}.try(:last)
end
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 # Returns the SQL sort order that should be prepended for grouping
def group_by_sort_order
if grouped? && (column = group_by_column)
Jean-Philippe Lang
Ability to sort issues by grouped column (#3511)....
r10543 order = sort_criteria_order_for(column.name) || column.default_order
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 column.sortable.is_a?(Array) ?
Jean-Philippe Lang
Ability to sort issues by grouped column (#3511)....
r10543 column.sortable.collect {|s| "#{s} #{order}"}.join(',') :
"#{column.sortable} #{order}"
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 end
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 # Returns true if the query is a grouped query
def grouped?
Jean-Philippe Lang
Fixed: 500 error on issue query grouped by a custom field that was deleted (#7144)....
r4439 !group_by_column.nil?
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 def group_by_column
Jean-Philippe Lang
Fixed: 500 error on issue query grouped by a custom field that was deleted (#7144)....
r4439 groupable_columns.detect {|c| c.groupable && c.name.to_s == group_by}
Jean-Philippe Lang
Ticket grouping (#2679)....
r2604 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Allow issue grouping by custom field (#2679)....
r2957 def group_by_statement
Jean-Philippe Lang
Fixed: 500 error on issue query grouped by a custom field that was deleted (#7144)....
r4439 group_by_column.try(:groupable)
Jean-Philippe Lang
Allow issue grouping by custom field (#2679)....
r2957 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Adds support for free ticket filtering and custom queries on Calendar....
r1796 def project_statement
Jean-Philippe Lang
Fixed: private subprojects are listed on the issues view (#1217)....
r1417 project_clauses = []
Jean-Philippe Lang
Do not use instance variable....
r7777 if project && !project.descendants.active.empty?
Jean-Philippe Lang
Include subprojects on the issue list, calendar and gantt by default....
r1164 ids = [project.id]
Jean-Philippe Lang
Adds an application setting to choose whether or not subprojects issues should be displayed by default on the issue list, calendar and gantt (r1178). Default is true....
r1184 if has_filter?("subproject_id")
case operator_for("subproject_id")
when '='
# include the selected subprojects
ids += values_for("subproject_id").each(&:to_i)
when '!*'
# main project only
else
# all subprojects
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 ids += project.descendants.collect(&:id)
Jean-Philippe Lang
Adds an application setting to choose whether or not subprojects issues should be displayed by default on the issue list, calendar and gantt (r1178). Default is true....
r1184 end
elsif Setting.display_subprojects_issues?
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 ids += project.descendants.collect(&:id)
Jean-Philippe Lang
added back "subproject" filter on issue list...
r347 end
Jean-Philippe Lang
Adds support for free ticket filtering and custom queries on Calendar....
r1796 project_clauses << "#{Project.table_name}.id IN (%s)" % ids.join(',')
Jean-Philippe Lang
Added a cross-project issue list. It displays the issues of all the projects visible by the user....
r673 elsif project
Jean-Philippe Lang
Adds support for free ticket filtering and custom queries on Calendar....
r1796 project_clauses << "#{Project.table_name}.id = %d" % project.id
Jean-Philippe Lang
added back "subproject" filter on issue list...
r347 end
Jean-Philippe Lang
Extract visibility condition from project statement and use visible scopes instead....
r5322 project_clauses.any? ? project_clauses.join(' AND ') : nil
Jean-Philippe Lang
Adds support for free ticket filtering and custom queries on Calendar....
r1796 end
def statement
Jean-Philippe Lang
Fixed: queries with multiple custom fields return no result....
r662 # filters clauses
filters_clauses = []
Jean-Philippe Lang
"queries" branch merged...
r92 filters.each_key do |field|
Jean-Philippe Lang
added back "subproject" filter on issue list...
r347 next if field == "subproject_id"
Jean-Philippe Lang
"me" value is now available in queries for "assigned to" and "author" filters....
r517 v = values_for(field).clone
Jean-Philippe Lang
Custom fields for issues can now be used as filters on issue list....
r444 next unless v and !v.empty?
Jean-Philippe Lang
Adds ability to filter watched issues (#846)....
r2395 operator = operator_for(field)
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Adds ability to filter watched issues (#846)....
r2395 # "me" value subsitution
if %w(assigned_to_id author_id watcher_id).include?(field)
Jean-Philippe Lang
Include issues asigned to user's groups when using "assigned to me" filter (#2964)....
r6212 if v.delete("me")
if User.current.logged?
v.push(User.current.id.to_s)
v += User.current.group_ids.map(&:to_s) if field == 'assigned_to_id'
else
v.push("0")
end
end
Jean-Philippe Lang
Adds ability to filter watched issues (#846)....
r2395 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Adds "my projects" filter on the cross-project issue list....
r8517 if field == 'project_id'
if v.delete('mine')
v += User.current.memberships.map(&:project_id).map(&:to_s)
end
end
Jean-Philippe Lang
Ability to filter issues using project, author, assignee and target version custom fields (#8161)....
r9981 if field =~ /cf_(\d+)$/
Jean-Philippe Lang
Custom fields for issues can now be used as filters on issue list....
r444 # custom field
Jean-Philippe Lang
Refactor: extract specific filter statements to methods....
r6181 filters_clauses << sql_for_custom_field(field, operator, v, $1)
elsif respond_to?("sql_for_#{field}_field")
# specific statement
filters_clauses << send("sql_for_#{field}_field", field, operator, v)
Jean-Philippe Lang
Custom fields for issues can now be used as filters on issue list....
r444 else
# regular field
Jean-Philippe Lang
Refactor: extract specific filter statements to methods....
r6181 filters_clauses << '(' + sql_for_field(field, operator, v, Issue.table_name, field) + ')'
Jean-Philippe Lang
Custom fields for issues can now be used as filters on issue list....
r444 end
Jean-Philippe Lang
"queries" branch merged...
r92 end if filters and valid?
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Extract visibility condition from project statement and use visible scopes instead....
r5322 filters_clauses << project_statement
filters_clauses.reject!(&:blank?)
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Extract visibility condition from project statement and use visible scopes instead....
r5322 filters_clauses.any? ? filters_clauses.join(' AND ') : nil
Jean-Philippe Lang
"queries" branch merged...
r92 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 # Returns the issue count
def issue_count
Jean-Philippe Lang
Fixed: pagination do not show total visible issue count (#8633)....
r6194 Issue.visible.count(:include => [:status, :project], :conditions => statement)
Jean-Philippe Lang
Rescue invalid query statement error with an error message....
r2990 rescue ::ActiveRecord::StatementInvalid => e
raise StatementInvalid.new(e.message)
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 # Returns the issue count by group or nil if query is not grouped
def issue_count_by_group
Jean-Philippe Lang
Fixed: "None" category issue count is empty while grouping by category (#4308)....
r2998 r = nil
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 if grouped?
begin
Jean-Philippe Lang
RecordNotFound exception still raised with Rails3....
r9386 # Rails3 will raise an (unexpected) RecordNotFound if there's only a nil group value
Jean-Philippe Lang
Extract visibility condition from project statement and use visible scopes instead....
r5322 r = Issue.visible.count(:group => group_by_statement, :include => [:status, :project], :conditions => statement)
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 rescue ActiveRecord::RecordNotFound
Jean-Philippe Lang
Fixed: "None" category issue count is empty while grouping by category (#4308)....
r2998 r = {nil => issue_count}
end
c = group_by_column
if c.is_a?(QueryCustomFieldColumn)
r = r.keys.inject({}) {|h, k| h[c.custom_field.cast_value(k)] = r[k]; h}
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 end
end
Jean-Philippe Lang
Fixed: "None" category issue count is empty while grouping by category (#4308)....
r2998 r
Jean-Philippe Lang
Rescue invalid query statement error with an error message....
r2990 rescue ::ActiveRecord::StatementInvalid => e
raise StatementInvalid.new(e.message)
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 # Returns the issues
# Valid options are :order, :offset, :limit, :include, :conditions
def issues(options={})
order_option = [group_by_sort_order, options[:order]].reject {|s| s.blank?}.join(',')
order_option = nil if order_option.blank?
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Replaces find(:first/:all) calls....
r10704 issues = Issue.visible.where(options[:conditions]).all(
:include => ([:status, :project] + (options[:include] || [])).uniq,
:conditions => statement,
:order => order_option,
:joins => joins_for_order_statement(order_option),
:limit => options[:limit],
:offset => options[:offset]
)
Jean-Philippe Lang
Makes spent time column available on the issue list (#971)....
r7953
if has_column?(:spent_hours)
Issue.load_visible_spent_hours(issues)
end
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 if has_column?(:relations)
Issue.load_visible_relations(issues)
end
Jean-Philippe Lang
Makes spent time column available on the issue list (#971)....
r7953 issues
Jean-Philippe Lang
Rescue invalid query statement error with an error message....
r2990 rescue ::ActiveRecord::StatementInvalid => e
raise StatementInvalid.new(e.message)
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 end
Jean-Philippe Lang
Faster query....
r8367 # Returns the issues ids
def issue_ids(options={})
order_option = [group_by_sort_order, options[:order]].reject {|s| s.blank?}.join(',')
order_option = nil if order_option.blank?
Jean-Philippe Lang
Rails 3.1 compatibility....
r8954 Issue.visible.scoped(:conditions => options[:conditions]).scoped(:include => ([:status, :project] + (options[:include] || [])).uniq,
Jean-Philippe Lang
Faster query....
r8367 :conditions => statement,
:order => order_option,
Jean-Philippe Lang
Ability to group and sort the issue list by user/version custom field (#9419)....
r9890 :joins => joins_for_order_statement(order_option),
Jean-Philippe Lang
Faster query....
r8367 :limit => options[:limit],
Jean-Philippe Lang
Rails 3.1 compatibility....
r8954 :offset => options[:offset]).find_ids
Jean-Philippe Lang
Faster query....
r8367 rescue ::ActiveRecord::StatementInvalid => e
raise StatementInvalid.new(e.message)
end
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 # Returns the journals
# Valid options are :order, :offset, :limit
def journals(options={})
Jean-Philippe Lang
Replaces find(:first/:all) calls....
r10704 Journal.visible.all(
:include => [:details, :user, {:issue => [:project, :author, :tracker, :status]}],
:conditions => statement,
:order => options[:order],
:limit => options[:limit],
:offset => options[:offset]
)
Jean-Philippe Lang
Rescue invalid query statement error with an error message....
r2990 rescue ::ActiveRecord::StatementInvalid => e
raise StatementInvalid.new(e.message)
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 # Returns the versions
# Valid options are :conditions
def versions(options={})
Jean-Philippe Lang
Replaces find(:first/:all) calls....
r10704 Version.visible.where(options[:conditions]).all(
:include => :project,
:conditions => project_statement
)
Jean-Philippe Lang
Rescue invalid query statement error with an error message....
r2990 rescue ::ActiveRecord::StatementInvalid => e
raise StatementInvalid.new(e.message)
Jean-Philippe Lang
Move issues, journals, versions queries from IssuesController to Query model....
r2989 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Refactor: extract specific filter statements to methods....
r6181 def sql_for_watcher_id_field(field, operator, value)
db_table = Watcher.table_name
"#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='Issue' AND " +
sql_for_field(field, '=', value, db_table, 'user_id') + ')'
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Refactor: extract specific filter statements to methods....
r6181 def sql_for_member_of_group_field(field, operator, value)
if operator == '*' # Any group
groups = Group.all
operator = '=' # Override the operator since we want to find by assigned_to
elsif operator == "!*"
groups = Group.all
operator = '!' # Override the operator since we want to find by assigned_to
else
groups = Group.find_all_by_id(value)
end
groups ||= []
members_of_groups = groups.inject([]) {|user_ids, group|
if group && group.user_ids.present?
user_ids << group.user_ids
end
user_ids.flatten.uniq.compact
}.sort.collect(&:to_s)
'(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')'
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Refactor: extract specific filter statements to methods....
r6181 def sql_for_assigned_to_role_field(field, operator, value)
Jean-Philippe Lang
Fixed: Issue filter by assigned_to_role is not project specific (#9540)....
r7727 case operator
when "*", "!*" # Member / Not member
sw = operator == "!*" ? 'NOT' : ''
nl = operator == "!*" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : ''
"(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}" +
" WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id))"
when "=", "!"
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb...
r10262 role_cond = value.any? ?
Jean-Philippe Lang
Fixed: Issue filter by assigned_to_role is not project specific (#9540)....
r7727 "#{MemberRole.table_name}.role_id IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")" :
"1=0"
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb...
r10262
Jean-Philippe Lang
Fixed: Issue filter by assigned_to_role is not project specific (#9540)....
r7727 sw = operator == "!" ? 'NOT' : ''
nl = operator == "!" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : ''
"(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}, #{MemberRole.table_name}" +
" WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id AND #{Member.table_name}.id = #{MemberRole.table_name}.member_id AND #{role_cond}))"
Jean-Philippe Lang
Refactor: extract specific filter statements to methods....
r6181 end
end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Adds Private filter to the issue list (#8577)....
r9737 def sql_for_is_private_field(field, operator, value)
op = (operator == "=" ? 'IN' : 'NOT IN')
va = value.map {|v| v == '0' ? connection.quoted_false : connection.quoted_true}.uniq.join(',')
"#{Issue.table_name}.is_private #{op} (#{va})"
end
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 def sql_for_relations(field, operator, value, options={})
relation_options = IssueRelation::TYPES[field]
return relation_options unless relation_options
relation_type = field
join_column, target_join_column = "issue_from_id", "issue_to_id"
if relation_options[:reverse] || options[:reverse]
relation_type = relation_options[:reverse] || relation_type
join_column, target_join_column = target_join_column, join_column
end
sql = case operator
when "*", "!*"
op = (operator == "*" ? 'IN' : 'NOT IN')
"#{Issue.table_name}.id #{op} (SELECT DISTINCT #{IssueRelation.table_name}.#{join_column} FROM #{IssueRelation.table_name} WHERE #{IssueRelation.table_name}.relation_type = '#{connection.quote_string(relation_type)}')"
when "=", "!"
op = (operator == "=" ? 'IN' : 'NOT IN')
"#{Issue.table_name}.id #{op} (SELECT DISTINCT #{IssueRelation.table_name}.#{join_column} FROM #{IssueRelation.table_name} WHERE #{IssueRelation.table_name}.relation_type = '#{connection.quote_string(relation_type)}' AND #{IssueRelation.table_name}.#{target_join_column} = #{value.first.to_i})"
Jean-Philippe Lang
Adds no_issue_in_project operator for relations filter (#3265)....
r10348 when "=p", "=!p", "!p"
op = (operator == "!p" ? 'NOT IN' : 'IN')
comp = (operator == "=!p" ? '<>' : '=')
"#{Issue.table_name}.id #{op} (SELECT DISTINCT #{IssueRelation.table_name}.#{join_column} FROM #{IssueRelation.table_name}, #{Issue.table_name} relissues WHERE #{IssueRelation.table_name}.relation_type = '#{connection.quote_string(relation_type)}' AND #{IssueRelation.table_name}.#{target_join_column} = relissues.id AND relissues.project_id #{comp} #{value.first.to_i})"
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 end
if relation_options[:sym] == field && !options[:reverse]
sqls = [sql, sql_for_relations(field, operator, value, :reverse => true)]
Jean-Philippe Lang
Adds no_issue_in_project operator for relations filter (#3265)....
r10348 sqls.join(["!", "!*", "!p"].include?(operator) ? " AND " : " OR ")
Jean-Philippe Lang
Makes related issues available for display and filtering on the issue list (#3239, #3265)....
r10303 else
sql
end
end
IssueRelation::TYPES.keys.each do |relation_type|
alias_method "sql_for_#{relation_type}_field".to_sym, :sql_for_relations
end
Jean-Philippe Lang
Refactor: extract specific filter statements to methods....
r6181 private
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Refactor: extract specific filter statements to methods....
r6181 def sql_for_custom_field(field, operator, value, custom_field_id)
db_table = CustomValue.table_name
db_field = 'value'
Jean-Philippe Lang
Adds "me" to user custom fields filters (#9923)....
r8518 filter = @available_filters[field]
Jean-Philippe Lang
Ability to filter issues using project, author, assignee and target version custom fields (#8161)....
r9981 return nil unless filter
if filter[:format] == 'user'
Jean-Philippe Lang
Adds "me" to user custom fields filters (#9923)....
r8518 if value.delete('me')
value.push User.current.id.to_s
end
end
Jean-Philippe Lang
Adds support for multiselect custom fields (#1189)....
r8601 not_in = nil
if operator == '!'
# Makes ! operator work for custom fields with multiple values
operator = '='
not_in = 'NOT'
end
Jean-Philippe Lang
Ability to filter issues using project, author, assignee and target version custom fields (#8161)....
r9981 customized_key = "id"
customized_class = Issue
if field =~ /^(.+)\.cf_/
assoc = $1
customized_key = "#{assoc}_id"
customized_class = Issue.reflect_on_association(assoc.to_sym).klass.base_class rescue nil
raise "Unknown Issue association #{assoc}" unless customized_class
end
"#{Issue.table_name}.#{customized_key} #{not_in} IN (SELECT #{customized_class.table_name}.id FROM #{customized_class.table_name} LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='#{customized_class}' AND #{db_table}.customized_id=#{customized_class.table_name}.id AND #{db_table}.custom_field_id=#{custom_field_id} WHERE " +
Jean-Philippe Lang
Refactor: extract specific filter statements to methods....
r6181 sql_for_field(field, operator, value, db_table, db_field, true) + ')'
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Adds ability to filter watched issues (#846)....
r2395 # 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)
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 sql = ''
Jean-Philippe Lang
Adds ability to filter watched issues (#846)....
r2395 case operator
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "="
Jean-Philippe Lang
Fixes "=" filter on float values....
r6136 if value.any?
case type_for(field)
when :date, :date_past
sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), (Date.parse(value.first) rescue nil))
when :integer
Jean-Philippe Lang
Fixed: error when filtering by numeric custom field with postgresql (#9719)....
r7978 if is_custom_filter
sql = "(#{db_table}.#{db_field} <> '' AND CAST(#{db_table}.#{db_field} AS decimal(60,3)) = #{value.first.to_i})"
else
sql = "#{db_table}.#{db_field} = #{value.first.to_i}"
end
Jean-Philippe Lang
Fixes "=" filter on float values....
r6136 when :float
Jean-Philippe Lang
Fixed: error when filtering by numeric custom field with postgresql (#9719)....
r7978 if is_custom_filter
sql = "(#{db_table}.#{db_field} <> '' AND CAST(#{db_table}.#{db_field} AS decimal(60,3)) BETWEEN #{value.first.to_f - 1e-5} AND #{value.first.to_f + 1e-5})"
else
sql = "#{db_table}.#{db_field} BETWEEN #{value.first.to_f - 1e-5} AND #{value.first.to_f + 1e-5}"
end
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 else
Jean-Philippe Lang
Fixes "=" filter on float values....
r6136 sql = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 end
Jean-Philippe Lang
Fixes "=" filter on float values....
r6136 else
# IN an empty set
sql = "1=0"
Jean-Philippe Lang
Fixed: SQL error when filtering issues with an empty group or role (#7656)....
r4768 end
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "!"
Jean-Philippe Lang
Fixed: SQL error when filtering issues with an empty group or role (#7656)....
r4768 if value.any?
sql = "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))"
else
# NOT IN an empty set
sql = "1=1"
end
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "!*"
sql = "#{db_table}.#{db_field} IS NULL"
sql << " OR #{db_table}.#{db_field} = ''" if is_custom_filter
when "*"
sql = "#{db_table}.#{db_field} IS NOT NULL"
sql << " AND #{db_table}.#{db_field} <> ''" if is_custom_filter
when ">="
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 if [:date, :date_past].include?(type_for(field))
sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), nil)
Jean-Philippe Lang
Fixes "less than", "greater than" filters on custom fields with postgres (#6180)....
r6096 else
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 if is_custom_filter
Jean-Philippe Lang
Fixed: error when filtering by numeric custom field with postgresql (#9719)....
r7978 sql = "(#{db_table}.#{db_field} <> '' AND CAST(#{db_table}.#{db_field} AS decimal(60,3)) >= #{value.first.to_f})"
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 else
Jean-Philippe Lang
Fixes filters on float values....
r6107 sql = "#{db_table}.#{db_field} >= #{value.first.to_f}"
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 end
Jean-Philippe Lang
Fixes "less than", "greater than" filters on custom fields with postgres (#6180)....
r6096 end
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "<="
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 if [:date, :date_past].include?(type_for(field))
sql = date_clause(db_table, db_field, nil, (Date.parse(value.first) rescue nil))
Jean-Philippe Lang
Fixes "less than", "greater than" filters on custom fields with postgres (#6180)....
r6096 else
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 if is_custom_filter
Jean-Philippe Lang
Fixed: error when filtering by numeric custom field with postgresql (#9719)....
r7978 sql = "(#{db_table}.#{db_field} <> '' AND CAST(#{db_table}.#{db_field} AS decimal(60,3)) <= #{value.first.to_f})"
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 else
Jean-Philippe Lang
Fixes filters on float values....
r6107 sql = "#{db_table}.#{db_field} <= #{value.first.to_f}"
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 end
Jean-Philippe Lang
Fixes "less than", "greater than" filters on custom fields with postgres (#6180)....
r6096 end
Jean-Philippe Lang
Adds "between" operator for numeric filters (#6180)....
r6097 when "><"
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 if [:date, :date_past].include?(type_for(field))
sql = date_clause(db_table, db_field, (Date.parse(value[0]) rescue nil), (Date.parse(value[1]) rescue nil))
Jean-Philippe Lang
Adds "between" operator for numeric filters (#6180)....
r6097 else
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 if is_custom_filter
Jean-Philippe Lang
Fixed: error when filtering by numeric custom field with postgresql (#9719)....
r7978 sql = "(#{db_table}.#{db_field} <> '' AND CAST(#{db_table}.#{db_field} AS decimal(60,3)) BETWEEN #{value[0].to_f} AND #{value[1].to_f})"
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 else
Jean-Philippe Lang
Fixes filters on float values....
r6107 sql = "#{db_table}.#{db_field} BETWEEN #{value[0].to_f} AND #{value[1].to_f}"
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 end
Jean-Philippe Lang
Adds "between" operator for numeric filters (#6180)....
r6097 end
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "o"
Jean-Philippe Lang
Faster query....
r8367 sql = "#{Issue.table_name}.status_id IN (SELECT id FROM #{IssueStatus.table_name} WHERE is_closed=#{connection.quoted_false})" if field == "status_id"
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "c"
Jean-Philippe Lang
Faster query....
r8367 sql = "#{Issue.table_name}.status_id IN (SELECT id FROM #{IssueStatus.table_name} WHERE is_closed=#{connection.quoted_true})" if field == "status_id"
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 when "><t-"
# between today - n days and today
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 sql = relative_date_clause(db_table, db_field, - value.first.to_i, 0)
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 when ">t-"
# >= today - n days
sql = relative_date_clause(db_table, db_field, - value.first.to_i, nil)
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "<t-"
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 # <= today - n days
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 sql = relative_date_clause(db_table, db_field, nil, - value.first.to_i)
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "t-"
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 # = n days in past
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 sql = relative_date_clause(db_table, db_field, - value.first.to_i, - value.first.to_i)
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 when "><t+"
# between today and today + n days
sql = relative_date_clause(db_table, db_field, 0, value.first.to_i)
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when ">t+"
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 # >= today + n days
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 sql = relative_date_clause(db_table, db_field, value.first.to_i, nil)
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "<t+"
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 # <= today + n days
sql = relative_date_clause(db_table, db_field, nil, value.first.to_i)
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "t+"
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 # = today + n days
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 sql = relative_date_clause(db_table, db_field, value.first.to_i, value.first.to_i)
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "t"
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 # = today
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 sql = relative_date_clause(db_table, db_field, 0, 0)
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "w"
Jean-Philippe Lang
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426)....
r10546 # = this week
Jean-Philippe Lang
Makes 'This week' filter work with any starting day of week (#7097)....
r5476 first_day_of_week = l(:general_first_day_of_week).to_i
day_of_week = Date.today.cwday
days_ago = (day_of_week >= first_day_of_week ? day_of_week - first_day_of_week : day_of_week + 7 - first_day_of_week)
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 sql = relative_date_clause(db_table, db_field, - days_ago, - days_ago + 6)
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "~"
Jean-Philippe Lang
Fixed: case sensitivity in issue subject filtering (#3536)....
r2696 sql = "LOWER(#{db_table}.#{db_field}) LIKE '%#{connection.quote_string(value.first.to_s.downcase)}%'"
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 when "!~"
Jean-Philippe Lang
Fixed: case sensitivity in issue subject filtering (#3536)....
r2696 sql = "LOWER(#{db_table}.#{db_field}) NOT LIKE '%#{connection.quote_string(value.first.to_s.downcase)}%'"
Jean-Philippe Lang
Adds "between" operator for numeric filters (#6180)....
r6097 else
raise "Unknown query operator #{operator}"
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Eric Davis
Bit more refactoring on Query#sql_for_field to remove multiple returns...
r2089 return sql
Eric Davis
Refactor: Extracted new method Query#sql_for_field from Query#statement in...
r2088 end
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Ability to filter issues using project, author, assignee and target version custom fields (#8161)....
r9981 def add_custom_fields_filters(custom_fields, assoc=nil)
return unless custom_fields.present?
Jean-Philippe Lang
Add filters on cross-project issue list for custom fields marked as 'For all projects'....
r1562 @available_filters ||= {}
Toshi MARUYAMA
remove trailing white-spaces from query model source....
r5702
Jean-Philippe Lang
Add filters on cross-project issue list for custom fields marked as 'For all projects'....
r1562 custom_fields.select(&:is_filter?).each do |field|
case field.field_format
when "text"
options = { :type => :text, :order => 20 }
when "list"
options = { :type => :list_optional, :values => field.possible_values, :order => 20}
when "date"
options = { :type => :date, :order => 20 }
when "bool"
options = { :type => :list, :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]], :order => 20 }
Jean-Philippe Lang
Fixes "=" filter on float values....
r6136 when "int"
Jean-Philippe Lang
Numeric operators for custom fields in query filters (#6180)....
r6093 options = { :type => :integer, :order => 20 }
Jean-Philippe Lang
Typo....
r6138 when "float"
Jean-Philippe Lang
Fixes "=" filter on float values....
r6136 options = { :type => :float, :order => 20 }
Jean-Philippe Lang
Adds User and Version custom field format that can be used to reference a project member or version in custom fields (#2096)....
r5152 when "user", "version"
next unless project
Jean-Philippe Lang
Adds "me" to user custom fields filters (#9923)....
r8518 values = field.possible_values_options(project)
if User.current.logged? && field.field_format == 'user'
values.unshift ["<< #{l(:label_me)} >>", "me"]
end
options = { :type => :list_optional, :values => values, :order => 20}
Jean-Philippe Lang
Add filters on cross-project issue list for custom fields marked as 'For all projects'....
r1562 else
options = { :type => :string, :order => 20 }
end
Jean-Philippe Lang
Ability to filter issues using project, author, assignee and target version custom fields (#8161)....
r9981 filter_id = "cf_#{field.id}"
filter_name = field.name
if assoc.present?
filter_id = "#{assoc}.#{filter_id}"
filter_name = l("label_attribute_of_#{assoc}", :name => filter_name)
end
Toshi MARUYAMA
sort custom field issue filter by type and position (#12018)...
r10344 @available_filters[filter_id] = options.merge({
:name => filter_name,
:format => field.field_format,
:field => field
})
Jean-Philippe Lang
Ability to filter issues using project, author, assignee and target version custom fields (#8161)....
r9981 end
end
def add_associations_custom_fields_filters(*associations)
fields_by_class = CustomField.where(:is_filter => true).group_by(&:class)
associations.each do |assoc|
association_klass = Issue.reflect_on_association(assoc).klass
fields_by_class.each do |field_class, fields|
if field_class.customized_class <= association_klass
add_custom_fields_filters(fields, assoc)
end
end
Jean-Philippe Lang
Add filters on cross-project issue list for custom fields marked as 'For all projects'....
r1562 end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Fixed date filters accuracy with SQLite (#2221)....
r2052 # Returns a SQL clause for a date or datetime field.
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 def date_clause(table, field, from, to)
Jean-Philippe Lang
Fixed date filters accuracy with SQLite (#2221)....
r2052 s = []
if from
Toshi MARUYAMA
Rails3: model: query: parse dates using UTC (ruby 1.9 inside) (#4796)...
r7471 from_yesterday = from - 1
Jean-Philippe Lang
Fixed time zone issues introduced by r9719 (#10996)....
r9543 from_yesterday_time = Time.local(from_yesterday.year, from_yesterday.month, from_yesterday.day)
if self.class.default_timezone == :utc
from_yesterday_time = from_yesterday_time.utc
end
s << ("#{table}.#{field} > '%s'" % [connection.quoted_date(from_yesterday_time.end_of_day)])
Jean-Philippe Lang
Fixed date filters accuracy with SQLite (#2221)....
r2052 end
if to
Jean-Philippe Lang
Fixed time zone issues introduced by r9719 (#10996)....
r9543 to_time = Time.local(to.year, to.month, to.day)
if self.class.default_timezone == :utc
to_time = to_time.utc
end
s << ("#{table}.#{field} <= '%s'" % [connection.quoted_date(to_time.end_of_day)])
Jean-Philippe Lang
Fixed date filters accuracy with SQLite (#2221)....
r2052 end
s.join(' AND ')
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/query.rb....
r6345
Jean-Philippe Lang
Adds date based filters (#4729) and date range filter (#6954)....
r6106 # Returns a SQL clause for a date or datetime field using relative dates.
def relative_date_clause(table, field, days_from, days_to)
date_clause(table, field, (days_from ? Date.today + days_from : nil), (days_to ? Date.today + days_to : nil))
end
Jean-Philippe Lang
Ability to group and sort the issue list by user/version custom field (#9419)....
r9890
# Additional joins required for the given sort options
def joins_for_order_statement(order_options)
joins = []
if order_options
if order_options.include?('authors')
joins << "LEFT OUTER JOIN #{User.table_name} authors ON authors.id = #{Issue.table_name}.author_id"
end
order_options.scan(/cf_\d+/).uniq.each do |name|
column = available_columns.detect {|c| c.name.to_s == name}
Jean-Philippe Lang
In case the column is not found....
r9891 join = column && column.custom_field.join_for_order_statement
Jean-Philippe Lang
Ability to group and sort the issue list by user/version custom field (#9419)....
r9890 if join
joins << join
end
end
end
joins.any? ? joins.join(' ') : nil
end
Jean-Philippe Lang
"queries" branch merged...
r92 end