mirror of
https://github.com/redmine/redmine.git
synced 2025-11-15 17:56:03 +01:00
Adds a version filter on time entries (#13558).
git-svn-id: http://svn.redmine.org/redmine/trunk@15646 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -691,9 +691,9 @@ class Query < ActiveRecord::Base
|
|||||||
if field =~ /cf_(\d+)$/
|
if field =~ /cf_(\d+)$/
|
||||||
# custom field
|
# custom field
|
||||||
filters_clauses << sql_for_custom_field(field, operator, v, $1)
|
filters_clauses << sql_for_custom_field(field, operator, v, $1)
|
||||||
elsif respond_to?("sql_for_#{field}_field")
|
elsif respond_to?(method = "sql_for_#{field.gsub('.','_')}_field")
|
||||||
# specific statement
|
# specific statement
|
||||||
filters_clauses << send("sql_for_#{field}_field", field, operator, v)
|
filters_clauses << send(method, field, operator, v)
|
||||||
else
|
else
|
||||||
# regular field
|
# regular field
|
||||||
filters_clauses << '(' + sql_for_field(field, operator, v, queried_table_name, field) + ')'
|
filters_clauses << '(' + sql_for_field(field, operator, v, queried_table_name, field) + ')'
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ class TimeEntryQuery < Query
|
|||||||
add_available_filter "spent_on", :type => :date_past
|
add_available_filter "spent_on", :type => :date_past
|
||||||
|
|
||||||
principals = []
|
principals = []
|
||||||
|
versions = []
|
||||||
if project
|
if project
|
||||||
principals += project.principals.visible.sort
|
principals += project.principals.visible.sort
|
||||||
unless project.leaf?
|
unless project.leaf?
|
||||||
@@ -52,6 +53,7 @@ class TimeEntryQuery < Query
|
|||||||
principals += Principal.member_of(subprojects).visible
|
principals += Principal.member_of(subprojects).visible
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
versions = project.shared_versions.to_a
|
||||||
else
|
else
|
||||||
if all_projects.any?
|
if all_projects.any?
|
||||||
# members of visible projects
|
# members of visible projects
|
||||||
@@ -69,6 +71,10 @@ class TimeEntryQuery < Query
|
|||||||
end
|
end
|
||||||
|
|
||||||
add_available_filter("issue_id", :type => :tree, :label => :label_issue)
|
add_available_filter("issue_id", :type => :tree, :label => :label_issue)
|
||||||
|
add_available_filter("issue.fixed_version_id",
|
||||||
|
:type => :list,
|
||||||
|
:name => l("label_attribute_of_issue", :name => l(:field_fixed_version)),
|
||||||
|
:values => Version.sort_by_status(versions).collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s, l("version_status_#{s.status}")] })
|
||||||
|
|
||||||
principals.uniq!
|
principals.uniq!
|
||||||
principals.sort!
|
principals.sort!
|
||||||
@@ -136,6 +142,24 @@ class TimeEntryQuery < Query
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def sql_for_issue_fixed_version_id_field(field, operator, value)
|
||||||
|
issue_ids = Issue.where(:fixed_version_id => value.first.to_i).pluck(:id)
|
||||||
|
case operator
|
||||||
|
when "="
|
||||||
|
if issue_ids.any?
|
||||||
|
"#{TimeEntry.table_name}.issue_id IN (#{issue_ids.join(',')})"
|
||||||
|
else
|
||||||
|
"1=0"
|
||||||
|
end
|
||||||
|
when "!"
|
||||||
|
if issue_ids.any?
|
||||||
|
"#{TimeEntry.table_name}.issue_id NOT IN (#{issue_ids.join(',')})"
|
||||||
|
else
|
||||||
|
"1=1"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def sql_for_activity_id_field(field, operator, value)
|
def sql_for_activity_id_field(field, operator, value)
|
||||||
condition_on_id = sql_for_field(field, operator, value, Enumeration.table_name, 'id')
|
condition_on_id = sql_for_field(field, operator, value, Enumeration.table_name, 'id')
|
||||||
condition_on_parent_id = sql_for_field(field, operator, value, Enumeration.table_name, 'parent_id')
|
condition_on_parent_id = sql_for_field(field, operator, value, Enumeration.table_name, 'parent_id')
|
||||||
|
|||||||
@@ -639,6 +639,27 @@ class TimelogControllerTest < ActionController::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_index_at_project_level_with_issue_id_short_filter
|
||||||
|
issue = Issue.generate!(:project_id => 1)
|
||||||
|
TimeEntry.generate!(:issue => issue, :hours => 4)
|
||||||
|
TimeEntry.generate!(:issue => issue, :hours => 3)
|
||||||
|
@request.session[:user_id] = 2
|
||||||
|
|
||||||
|
get :index, :project_id => 'ecookbook', :issue_id => issue.id.to_s, :set_filter => 1
|
||||||
|
assert_select '.total-hours', :text => 'Total time: 7.00 hours'
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_index_at_project_level_with_issue_fixed_version_id_short_filter
|
||||||
|
version = Version.generate!(:project_id => 1)
|
||||||
|
issue = Issue.generate!(:project_id => 1, :fixed_version => version)
|
||||||
|
TimeEntry.generate!(:issue => issue, :hours => 2)
|
||||||
|
TimeEntry.generate!(:issue => issue, :hours => 3)
|
||||||
|
@request.session[:user_id] = 2
|
||||||
|
|
||||||
|
get :index, :project_id => 'ecookbook', :"issue.fixed_version_id" => version.id.to_s, :set_filter => 1
|
||||||
|
assert_select '.total-hours', :text => 'Total time: 5.00 hours'
|
||||||
|
end
|
||||||
|
|
||||||
def test_index_at_project_level_with_date_range
|
def test_index_at_project_level_with_date_range
|
||||||
get :index, :project_id => 'ecookbook',
|
get :index, :project_id => 'ecookbook',
|
||||||
:f => ['spent_on'],
|
:f => ['spent_on'],
|
||||||
|
|||||||
Reference in New Issue
Block a user