@@ -0,0 +1,40 | |||
|
1 | # Redmine - project management software | |
|
2 | # Copyright (C) 2006-2013 Jean-Philippe Lang | |
|
3 | # | |
|
4 | # This program is free software; you can redistribute it and/or | |
|
5 | # modify it under the terms of the GNU General Public License | |
|
6 | # as published by the Free Software Foundation; either version 2 | |
|
7 | # of the License, or (at your option) any later version. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU General Public License | |
|
15 | # along with this program; if not, write to the Free Software | |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
|
17 | ||
|
18 | require File.expand_path('../../test_helper', __FILE__) | |
|
19 | ||
|
20 | class TimeEntryQueryTest < ActiveSupport::TestCase | |
|
21 | fixtures :projects, :users, :enumerations | |
|
22 | ||
|
23 | def test_activity_filter_should_consider_system_and_project_activities | |
|
24 | TimeEntry.delete_all | |
|
25 | system = TimeEntryActivity.create!(:name => 'Foo') | |
|
26 | override = TimeEntryActivity.create!(:name => 'Foo', :parent_id => system.id, :project_id => 1) | |
|
27 | other = TimeEntryActivity.create!(:name => 'Bar') | |
|
28 | TimeEntry.generate!(:activity => system, :hours => 1.0) | |
|
29 | TimeEntry.generate!(:activity => override, :hours => 2.0) | |
|
30 | TimeEntry.generate!(:activity => other, :hours => 4.0) | |
|
31 | ||
|
32 | query = TimeEntryQuery.new(:name => '_') | |
|
33 | query.add_filter('activity_id', '=', [system.id.to_s]) | |
|
34 | assert_equal 3.0, query.results_scope.sum(:hours) | |
|
35 | ||
|
36 | query = TimeEntryQuery.new(:name => '_') | |
|
37 | query.add_filter('activity_id', '!', [system.id.to_s]) | |
|
38 | assert_equal 4.0, query.results_scope.sum(:hours) | |
|
39 | end | |
|
40 | end |
@@ -47,7 +47,7 class TimelogController < ApplicationController | |||
|
47 | 47 | sort_init(@query.sort_criteria.empty? ? [['spent_on', 'desc']] : @query.sort_criteria) |
|
48 | 48 | sort_update(@query.sortable_columns) |
|
49 | 49 | scope = time_entry_scope(:order => sort_clause). |
|
50 |
includes(:project |
|
|
50 | includes(:project, :user, :issue). | |
|
51 | 51 | preload(:issue => [:project, :tracker, :status, :assigned_to, :priority]) |
|
52 | 52 | |
|
53 | 53 | respond_to do |format| |
@@ -106,7 +106,20 class TimeEntryQuery < Query | |||
|
106 | 106 | TimeEntry.visible. |
|
107 | 107 | where(statement). |
|
108 | 108 | order(order_option). |
|
109 | joins(joins_for_order_statement(order_option.join(','))) | |
|
109 | joins(joins_for_order_statement(order_option.join(','))). | |
|
110 | includes(:activity) | |
|
111 | end | |
|
112 | ||
|
113 | def sql_for_activity_id_field(field, operator, value) | |
|
114 | condition_on_id = sql_for_field(field, operator, value, Enumeration.table_name, 'id') | |
|
115 | condition_on_parent_id = sql_for_field(field, operator, value, Enumeration.table_name, 'parent_id') | |
|
116 | ids = value.map(&:to_i).join(',') | |
|
117 | table_name = Enumeration.table_name | |
|
118 | if operator == '=' | |
|
119 | "(#{table_name}.id IN (#{ids}) OR #{table_name}.parent_id IN (#{ids}))" | |
|
120 | else | |
|
121 | "(#{table_name}.id NOT IN (#{ids}) AND (#{table_name}.parent_id IS NULL OR #{table_name}.parent_id NOT IN (#{ids})))" | |
|
122 | end | |
|
110 | 123 | end |
|
111 | 124 | |
|
112 | 125 | # Accepts :from/:to params as shortcut filters |
General Comments 0
You need to be logged in to leave comments.
Login now