diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 8851f8a..ca9213b 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -77,7 +77,10 @@ class IssuesController < ApplicationController @issues = @query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version], :order => sort_clause, :offset => @issue_pages.current.offset, - :limit => limit) + :limit => limit, + :joins => 'LEFT OUTER JOIN time_entries ON issues.id = time_entries.issue_id', + :group => 'issues.id' +) @issue_count_by_group = @query.issue_count_by_group respond_to do |format| diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 6178229..b7d412d 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -182,25 +182,49 @@ module IssuesHelper ic = Iconv.new(l(:general_csv_encoding), 'UTF-8') decimal_separator = l(:general_csv_decimal_separator) export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| - # csv header fields - headers = [ "#", - l(:field_status), - l(:field_project), - l(:field_tracker), - l(:field_priority), - l(:field_subject), - l(:field_assigned_to), - l(:field_category), - l(:field_fixed_version), - l(:field_author), - l(:field_start_date), - l(:field_due_date), - l(:field_done_ratio), - l(:field_estimated_hours), - l(:field_parent_issue), - l(:field_created_on), - l(:field_updated_on) - ] + if User.current.allowed_to?(:view_time_entries, @project) + #if !@project.nil? || !(User.current.allowed_to?(:view_time_entries, @project)) + # csv header fields + headers = [ "#", + l(:field_status), + l(:field_project), + l(:field_tracker), + l(:field_priority), + l(:field_subject), + l(:field_assigned_to), + l(:field_category), + l(:field_fixed_version), + l(:field_author), + l(:field_start_date), + l(:field_due_date), + l(:field_done_ratio), + l(:field_estimated_hours), + l(:field_spent_hours), + l(:field_parent_issue), + l(:field_created_on), + l(:field_updated_on) + ] + else + # csv header fields + headers = [ "#", + l(:field_status), + l(:field_project), + l(:field_tracker), + l(:field_priority), + l(:field_subject), + l(:field_assigned_to), + l(:field_category), + l(:field_fixed_version), + l(:field_author), + l(:field_start_date), + l(:field_due_date), + l(:field_done_ratio), + l(:field_estimated_hours), + l(:field_parent_issue), + l(:field_created_on), + l(:field_updated_on) + ] + end # Export project custom fields if project is given # otherwise export custom fields marked as "For all projects" custom_fields = project.nil? ? IssueCustomField.for_all : project.all_issue_custom_fields @@ -210,6 +234,7 @@ module IssuesHelper csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end } # csv lines issues.each do |issue| + if User.current.allowed_to?(:view_time_entries, @project) fields = [issue.id, issue.status.name, issue.project.name, @@ -224,10 +249,32 @@ module IssuesHelper format_date(issue.due_date), issue.done_ratio, issue.estimated_hours.to_s.gsub('.', decimal_separator), + issue.spent_hours.to_s.gsub('.', decimal_separator), issue.parent_id, format_time(issue.created_on), format_time(issue.updated_on) ] + else + fields = [issue.id, + issue.status.name, + issue.project.name, + issue.tracker.name, + issue.priority.name, + issue.subject, + issue.assigned_to, + issue.category, + issue.fixed_version, + issue.author.name, + format_date(issue.start_date), + format_date(issue.due_date), + issue.done_ratio, + issue.estimated_hours.to_s.gsub('.', decimal_separator), + issue.parent_id, + format_time(issue.created_on), + format_time(issue.updated_on) + ] + end + custom_fields.each {|f| fields << show_value(issue.custom_value_for(f)) } fields << issue.description csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end } diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index 26be636..a810df7 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -44,7 +44,9 @@ module QueriesHelper when 'Fixnum', 'Float' if column.name == :done_ratio progress_bar(value, :width => '80px') - else + elsif column.name == :spent_hours + return issue.send :spent_hours_colored, value + else value.to_s end when 'User' @@ -53,6 +55,8 @@ module QueriesHelper link_to_project value when 'Version' link_to(h(value), :controller => 'versions', :action => 'show', :id => value) + # when 'spentHours' + # return issue.send : spent_hours_colored, value when 'TrueClass' l(:general_text_Yes) when 'FalseClass' diff --git a/app/models/issue.rb b/app/models/issue.rb index 7d0682d..285df3c 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -196,6 +196,20 @@ class Issue < ActiveRecord::Base def estimated_hours=(h) write_attribute :estimated_hours, (h.is_a?(String) ? h.to_hours : h) end + + def spent_hours + #write_attribute :estimated_hours, (h.is_a?(String) ? h.to_hours : h) + @spent_hours ||= (time_entries.sum(:hours)*100).round.to_f / 100 || 0 + end + + def spent_hours_colored(value) + if (estimated_hours.nil?) + return ('%.2f' % value).to_s + elsif(value > estimated_hours) + return ""+('%.2f' % value).to_s+"" + else return ('%.2f' % value).to_s + end + end SAFE_ATTRIBUTES = %w( tracker_id diff --git a/app/models/query.rb b/app/models/query.rb index b1f7845..c2b4a44 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -133,6 +133,7 @@ class Query < ActiveRecord::Base 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"), + QueryColumn.new(:spent_hours, :sortable => "SUM(time_entries.hours)" ), QueryColumn.new(:done_ratio, :sortable => "#{Issue.table_name}.done_ratio", :groupable => true), QueryColumn.new(:created_on, :sortable => "#{Issue.table_name}.created_on", :default_order => 'desc'), ] diff --git a/app/views/issues/_list.rhtml b/app/views/issues/_list.rhtml index 2722b9e..d421d5d 100644 --- a/app/views/issues/_list.rhtml +++ b/app/views/issues/_list.rhtml @@ -8,7 +8,13 @@ <%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %> <% query.columns.each do |column| %> - <%= column_header(column) %> + <% if column.name == :spent_hours %> + <% if User.current.allowed_to?(:view_time_entries, @project) %> + <%= column_header(column) %> + <% end %> + <% else %> + <%= column_header(column) %> + <% end %> <% end %> <% previous_group = false %> @@ -27,7 +33,15 @@ "> <%= check_box_tag("ids[]", issue.id, false, :id => nil) %> <%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %> - <% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %> + <% query.columns.each do |column| %> + <% if column.name == :spent_hours %> + <% if User.current.allowed_to?(:view_time_entries, @project) %> + <%= content_tag 'td', column_content(column, issue) , :class => column.name %> + <% end %> + <% else %> + <%= content_tag 'td', column_content(column, issue), :class => column.name %> + <% end %> + <% end %> <% end -%> diff --git a/app/views/issues/index.rhtml b/app/views/issues/index.rhtml index ee6514d..a035150 100644 --- a/app/views/issues/index.rhtml +++ b/app/views/issues/index.rhtml @@ -66,7 +66,9 @@ <% other_formats_links do |f| %> <%= f.link_to 'Atom', :url => { :project_id => @project, :query_id => (@query.new_record? ? nil : @query), :key => User.current.rss_key } %> <%= f.link_to 'CSV', :url => { :project_id => @project } %> - <%= f.link_to 'PDF', :url => { :project_id => @project } %> + <% if User.current.allowed_to?(:view_time_entries, @project) %> + <%= f.link_to 'PDF', :url => { :project_id => @project } %> + <% end %> <% end %> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 555043a..e9bad00 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -213,6 +213,7 @@ en: field_author: Author field_created_on: Created field_updated_on: Updated + field_spent_hours: Spent hours field_field_format: Format field_is_for_all: For all projects field_possible_values: Possible values diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 24b70ad..db143b1 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -224,6 +224,7 @@ fr: field_author: Auteur field_created_on: "Créé " field_updated_on: "Mis-à-jour " + field_spent_hours: "Temps passé" field_field_format: Format field_is_for_all: Pour tous les projets field_possible_values: Valeurs possibles