From 0786b9ef99b0797f06a72201b1581d7384efc624 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Wed, 16 Mar 2011 17:29:30 +0000 Subject: [PATCH] Replaces TimeEntry.visible_by with a visible scope. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@5149 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/projects_controller.rb | 9 ++- app/controllers/timelog_controller.rb | 90 ++++++++++++-------------- app/models/time_entry.rb | 11 +++- app/views/projects/show.rhtml | 2 +- 4 files changed, 57 insertions(+), 55 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 459b54784..f80cbbf26 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -1,5 +1,5 @@ # Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +# Copyright (C) 2006-2011 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -156,11 +156,10 @@ class ProjectsController < ApplicationController :include => [:project, :status, :tracker], :conditions => cond) - TimeEntry.visible_by(User.current) do - @total_hours = TimeEntry.sum(:hours, - :include => :project, - :conditions => cond).to_f + if User.current.allowed_to?(:view_time_entries, @project) + @total_hours = TimeEntry.visible.sum(:hours, :include => :project, :conditions => cond).to_f end + @key = User.current.rss_key respond_to do |format| diff --git a/app/controllers/timelog_controller.rb b/app/controllers/timelog_controller.rb index f75d5833e..604a8f244 100644 --- a/app/controllers/timelog_controller.rb +++ b/app/controllers/timelog_controller.rb @@ -40,60 +40,56 @@ class TimelogController < ApplicationController 'hours' => 'hours' cond = ARCondition.new - if @project.nil? - cond << Project.allowed_to_condition(User.current, :view_time_entries) - elsif @issue.nil? - cond << @project.project_condition(Setting.display_subprojects_issues?) - else + if @issue cond << "#{Issue.table_name}.root_id = #{@issue.root_id} AND #{Issue.table_name}.lft >= #{@issue.lft} AND #{Issue.table_name}.rgt <= #{@issue.rgt}" + elsif @project + cond << @project.project_condition(Setting.display_subprojects_issues?) end retrieve_date_range cond << ['spent_on BETWEEN ? AND ?', @from, @to] - TimeEntry.visible_by(User.current) do - respond_to do |format| - format.html { - # Paginate results - @entry_count = TimeEntry.count(:include => [:project, :issue], :conditions => cond.conditions) - @entry_pages = Paginator.new self, @entry_count, per_page_option, params['page'] - @entries = TimeEntry.find(:all, - :include => [:project, :activity, :user, {:issue => :tracker}], - :conditions => cond.conditions, - :order => sort_clause, - :limit => @entry_pages.items_per_page, - :offset => @entry_pages.current.offset) - @total_hours = TimeEntry.sum(:hours, :include => [:project, :issue], :conditions => cond.conditions).to_f + respond_to do |format| + format.html { + # Paginate results + @entry_count = TimeEntry.visible.count(:include => [:project, :issue], :conditions => cond.conditions) + @entry_pages = Paginator.new self, @entry_count, per_page_option, params['page'] + @entries = TimeEntry.visible.find(:all, + :include => [:project, :activity, :user, {:issue => :tracker}], + :conditions => cond.conditions, + :order => sort_clause, + :limit => @entry_pages.items_per_page, + :offset => @entry_pages.current.offset) + @total_hours = TimeEntry.visible.sum(:hours, :include => [:project, :issue], :conditions => cond.conditions).to_f - render :layout => !request.xhr? - } - format.api { - @entry_count = TimeEntry.count(:include => [:project, :issue], :conditions => cond.conditions) - @entry_pages = Paginator.new self, @entry_count, per_page_option, params['page'] - @entries = TimeEntry.find(:all, - :include => [:project, :activity, :user, {:issue => :tracker}], - :conditions => cond.conditions, - :order => sort_clause, - :limit => @entry_pages.items_per_page, - :offset => @entry_pages.current.offset) - } - format.atom { - entries = TimeEntry.find(:all, - :include => [:project, :activity, :user, {:issue => :tracker}], - :conditions => cond.conditions, - :order => "#{TimeEntry.table_name}.created_on DESC", - :limit => Setting.feeds_limit.to_i) - render_feed(entries, :title => l(:label_spent_time)) - } - format.csv { - # Export all entries - @entries = TimeEntry.find(:all, - :include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}], - :conditions => cond.conditions, - :order => sort_clause) - send_data(entries_to_csv(@entries), :type => 'text/csv; header=present', :filename => 'timelog.csv') - } - end + render :layout => !request.xhr? + } + format.api { + @entry_count = TimeEntry.visible.count(:include => [:project, :issue], :conditions => cond.conditions) + @entry_pages = Paginator.new self, @entry_count, per_page_option, params['page'] + @entries = TimeEntry.visible.find(:all, + :include => [:project, :activity, :user, {:issue => :tracker}], + :conditions => cond.conditions, + :order => sort_clause, + :limit => @entry_pages.items_per_page, + :offset => @entry_pages.current.offset) + } + format.atom { + entries = TimeEntry.visible.find(:all, + :include => [:project, :activity, :user, {:issue => :tracker}], + :conditions => cond.conditions, + :order => "#{TimeEntry.table_name}.created_on DESC", + :limit => Setting.feeds_limit.to_i) + render_feed(entries, :title => l(:label_spent_time)) + } + format.csv { + # Export all entries + @entries = TimeEntry.visible.find(:all, + :include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}], + :conditions => cond.conditions, + :order => sort_clause) + send_data(entries_to_csv(@entries), :type => 'text/csv; header=present', :filename => 'timelog.csv') + } end end diff --git a/app/models/time_entry.rb b/app/models/time_entry.rb index ade802868..c89ead322 100644 --- a/app/models/time_entry.rb +++ b/app/models/time_entry.rb @@ -1,5 +1,5 @@ -# redMine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +# Redmine - project management software +# Copyright (C) 2006-2011 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -38,6 +38,11 @@ class TimeEntry < ActiveRecord::Base validates_presence_of :user_id, :activity_id, :project_id, :hours, :spent_on validates_numericality_of :hours, :allow_nil => true, :message => :invalid validates_length_of :comments, :maximum => 255, :allow_nil => true + + named_scope :visible, lambda {|*args| { + :include => :project, + :conditions => Project.allowed_to_condition(args.first || User.current, :view_time_entries) + }} def after_initialize if new_record? && self.activity.nil? @@ -79,7 +84,9 @@ class TimeEntry < ActiveRecord::Base (usr == user && usr.allowed_to?(:edit_own_time_entries, project)) || usr.allowed_to?(:edit_time_entries, project) end + # TODO: remove this method in 1.3.0 def self.visible_by(usr) + ActiveSupport::Deprecation.warn "TimeEntry.visible_by is deprecated and will be removed in Redmine 1.3.0. Use the visible scope instead." with_scope(:find => { :conditions => Project.allowed_to_condition(usr, :view_time_entries) }) do yield end diff --git a/app/views/projects/show.rhtml b/app/views/projects/show.rhtml index 414358aca..7cc554c84 100644 --- a/app/views/projects/show.rhtml +++ b/app/views/projects/show.rhtml @@ -64,7 +64,7 @@ <% content_for :sidebar do %> - <% if @total_hours && User.current.allowed_to?(:view_time_entries, @project) %> + <% if @total_hours.present? %>

<%= l(:label_spent_time) %>

<%= l_hours(@total_hours) %>

<%= link_to(l(:label_details), {:controller => 'timelog', :action => 'index', :project_id => @project}) %> | -- 2.39.5