##// END OF EJS Templates
When copying issues, let the status be changed to default or left unchanged....
When copying issues, let the status be changed to default or left unchanged. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@9404 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r9016:1ec2d98c14bd
r9270:09375960d69d
Show More
timelog_controller.rb
336 lines | 11.1 KiB | text/x-ruby | RubyLexer
/ app / controllers / timelog_controller.rb
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 # Redmine - project management software
Jean-Philippe Lang
Separation of RSS/API auth actions....
r6077 # Copyright (C) 2006-2011 Jean-Philippe Lang
Jean-Philippe Lang
Added time report....
r569 #
# 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 app/controllers/timelog_controller.rb....
r6398 #
Jean-Philippe Lang
Added time report....
r569 # 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 app/controllers/timelog_controller.rb....
r6398 #
Jean-Philippe Lang
Added time report....
r569 # 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.
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 class TimelogController < ApplicationController
Jean-Philippe Lang
Highlight the current item of the main menu....
r1062 menu_item :issues
Jean-Philippe Lang
Enable global time logging at /time_entries/new (#10020)....
r8571
before_filter :find_project, :only => [:create]
Toshi MARUYAMA
add function of bulk delete time entries (#7996)....
r5196 before_filter :find_time_entry, :only => [:show, :edit, :update]
before_filter :find_time_entries, :only => [:bulk_edit, :bulk_update, :destroy]
Jean-Philippe Lang
Enable global time logging at /time_entries/new (#10020)....
r8571 before_filter :authorize, :except => [:new, :index, :report]
before_filter :find_optional_project, :only => [:new, :index, :report]
before_filter :authorize_global, :only => [:new, :index, :report]
Jean-Philippe Lang
Separation of RSS/API auth actions....
r6077 accept_rss_auth :index
accept_api_auth :index, :show, :create, :update, :destroy
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 helper :sort
include SortHelper
Jean-Philippe Lang
Performance improvement on calendar and gantt (about 45% on gantt for large number of issues)....
r783 helper :issues
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159 include TimelogHelper
Jean-Philippe Lang
Custom fields (list and boolean) can be used as criteria in time report (#1012)....
r1325 helper :custom_fields
include CustomFieldsHelper
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Eric Davis
Refactor: rename TimelogController#details to #index...
r4121 def index
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 sort_init 'spent_on', 'desc'
Jean-Philippe Lang
Validates sort_key and sort_order params (#2378)....
r2169 sort_update 'spent_on' => 'spent_on',
'user' => 'user_id',
'activity' => 'activity_id',
'project' => "#{Project.table_name}.name",
'issue' => 'issue_id',
'hours' => 'hours'
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Jean-Philippe Lang
Adds named scopes for time entries index....
r7964 retrieve_date_range
scope = TimeEntry.visible.spent_between(@from, @to)
Jean-Philippe Lang
Replaces TimeEntry.visible_by with a visible scope....
r5029 if @issue
Jean-Philippe Lang
Adds named scopes for time entries index....
r7964 scope = scope.on_issue(@issue)
Jean-Philippe Lang
Replaces TimeEntry.visible_by with a visible scope....
r5029 elsif @project
Jean-Philippe Lang
Adds named scopes for time entries index....
r7964 scope = scope.on_project(@project, Setting.display_subprojects_issues?)
Jean-Philippe Lang
Adds cross-project time reports support (#994)....
r1777 end
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Jean-Philippe Lang
Replaces TimeEntry.visible_by with a visible scope....
r5029 respond_to do |format|
format.html {
# Paginate results
Jean-Philippe Lang
Adds named scopes for time entries index....
r7964 @entry_count = scope.count
Jean-Philippe Lang
Replaces TimeEntry.visible_by with a visible scope....
r5029 @entry_pages = Paginator.new self, @entry_count, per_page_option, params['page']
Jean-Philippe Lang
Adds named scopes for time entries index....
r7964 @entries = scope.all(
:include => [:project, :activity, :user, {:issue => :tracker}],
:order => sort_clause,
:limit => @entry_pages.items_per_page,
:offset => @entry_pages.current.offset
)
@total_hours = scope.sum(:hours).to_f
Jean-Philippe Lang
Various timelog report enhancements:...
r1311
Jean-Philippe Lang
Replaces TimeEntry.visible_by with a visible scope....
r5029 render :layout => !request.xhr?
}
format.api {
Jean-Philippe Lang
Adds named scopes for time entries index....
r7964 @entry_count = scope.count
Jean-Philippe Lang
Fixed: GET /time_entries.xml ignores limit/offset parameters (#8356)....
r5761 @offset, @limit = api_offset_and_limit
Jean-Philippe Lang
Adds named scopes for time entries index....
r7964 @entries = scope.all(
:include => [:project, :activity, :user, {:issue => :tracker}],
:order => sort_clause,
:limit => @limit,
:offset => @offset
)
Jean-Philippe Lang
Replaces TimeEntry.visible_by with a visible scope....
r5029 }
format.atom {
Jean-Philippe Lang
Adds named scopes for time entries index....
r7964 entries = scope.all(
:include => [:project, :activity, :user, {:issue => :tracker}],
:order => "#{TimeEntry.table_name}.created_on DESC",
:limit => Setting.feeds_limit.to_i
)
Jean-Philippe Lang
Replaces TimeEntry.visible_by with a visible scope....
r5029 render_feed(entries, :title => l(:label_spent_time))
}
format.csv {
# Export all entries
Jean-Philippe Lang
Adds named scopes for time entries index....
r7964 @entries = scope.all(
:include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}],
:order => sort_clause
)
Jean-Philippe Lang
Replaces TimeEntry.visible_by with a visible scope....
r5029 send_data(entries_to_csv(@entries), :type => 'text/csv; header=present', :filename => 'timelog.csv')
}
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159 end
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 end
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Jean-Philippe Lang
Dropped TimeEntryReportsController....
r7907 def report
retrieve_date_range
@report = Redmine::Helpers::TimeReport.new(@project, @issue, params[:criteria], params[:columns], @from, @to)
respond_to do |format|
format.html { render :layout => !request.xhr? }
format.csv { send_data(report_to_csv(@report), :type => 'text/csv; header=present', :filename => 'timelog.csv') }
end
end
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 def show
respond_to do |format|
# TODO: Implement html response
format.html { render :nothing => true, :status => 406 }
Jean-Philippe Lang
Adds a pseudo format to api template names and overrides ActionController#default_template so that api templates are chosen automatically....
r4352 format.api
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 end
end
Eric Davis
Refactor: extract TimelogController#new from #edit...
r4125
def new
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
Jean-Philippe Lang
Prevent mass-assignment when adding/updating a time entry (#10390)....
r9016 @time_entry.safe_attributes = params[:time_entry]
Eric Davis
Refactor: extract TimelogController#new from #edit...
r4125 end
Eric Davis
Refactor: extract TimelogController#create from TimelogController#edit...
r4130
def create
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
Jean-Philippe Lang
Prevent mass-assignment when adding/updating a time entry (#10390)....
r9016 @time_entry.safe_attributes = params[:time_entry]
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Eric Davis
Refactor: extract TimelogController#create from TimelogController#edit...
r4130 call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Eric Davis
Refactor: extract TimelogController#create from TimelogController#edit...
r4130 if @time_entry.save
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 respond_to do |format|
format.html {
Jean-Philippe Lang
Adds a 'Create and continue' button on the spent time form (#9995)....
r8567 flash[:notice] = l(:notice_successful_create)
if params[:continue]
Jean-Philippe Lang
Enable global time logging at /time_entries/new (#10020)....
r8571 if params[:project_id]
Jean-Philippe Lang
Keep back_url param for when continuing creating issues....
r8572 redirect_to :action => 'new', :project_id => @time_entry.project, :issue_id => @time_entry.issue, :back_url => params[:back_url]
Jean-Philippe Lang
Enable global time logging at /time_entries/new (#10020)....
r8571 else
Jean-Philippe Lang
Keep back_url param for when continuing creating issues....
r8572 redirect_to :action => 'new', :back_url => params[:back_url]
Jean-Philippe Lang
Enable global time logging at /time_entries/new (#10020)....
r8571 end
Jean-Philippe Lang
Adds a 'Create and continue' button on the spent time form (#9995)....
r8567 else
redirect_back_or_default :action => 'index', :project_id => @time_entry.project
end
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 }
Jean-Philippe Lang
Adds a pseudo format to api template names and overrides ActionController#default_template so that api templates are chosen automatically....
r4352 format.api { render :action => 'show', :status => :created, :location => time_entry_url(@time_entry) }
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 end
Eric Davis
Refactor: extract TimelogController#create from TimelogController#edit...
r4130 else
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 respond_to do |format|
Jean-Philippe Lang
Enable global time logging at /time_entries/new (#10020)....
r8571 format.html { render :action => 'new' }
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 format.api { render_validation_errors(@time_entry) }
end
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398 end
Eric Davis
Refactor: extract TimelogController#create from TimelogController#edit...
r4130 end
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 def edit
Jean-Philippe Lang
Prevent mass-assignment when adding/updating a time entry (#10390)....
r9016 @time_entry.safe_attributes = params[:time_entry]
Eric Davis
Refactor: extract TimelogController#edit to #update...
r4134 end
def update
Jean-Philippe Lang
Prevent mass-assignment when adding/updating a time entry (#10390)....
r9016 @time_entry.safe_attributes = params[:time_entry]
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Eric Davis
Added plugin hook, :controller_timelog_edit_before_save. (#3341)...
r2675 call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Eric Davis
Refactor: extract TimelogController#edit to #update...
r4134 if @time_entry.save
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_update)
redirect_back_or_default :action => 'index', :project_id => @time_entry.project
}
format.api { head :ok }
end
Eric Davis
Refactor: extract TimelogController#edit to #update...
r4134 else
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 respond_to do |format|
format.html { render :action => 'edit' }
format.api { render_validation_errors(@time_entry) }
end
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398 end
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 end
Eric Davis
Refactor: extract TimelogController#edit to #update...
r4134
Toshi MARUYAMA
add bulk edit and bulk update actions for time entries (#7996)....
r5193 def bulk_edit
@available_activities = TimeEntryActivity.shared.active
@custom_fields = TimeEntry.first.available_custom_fields
end
def bulk_update
attributes = parse_params_for_bulk_time_entry_attributes(params)
unsaved_time_entry_ids = []
@time_entries.each do |time_entry|
time_entry.reload
Jean-Philippe Lang
Prevent mass-assignment when adding/updating a time entry (#10390)....
r9016 time_entry.safe_attributes = attributes
Toshi MARUYAMA
add bulk edit and bulk update actions for time entries (#7996)....
r5193 call_hook(:controller_time_entries_bulk_edit_before_save, { :params => params, :time_entry => time_entry })
unless time_entry.save
# Keep unsaved time_entry ids to display them in flash error
unsaved_time_entry_ids << time_entry.id
end
end
set_flash_from_bulk_time_entry_save(@time_entries, unsaved_time_entry_ids)
Toshi MARUYAMA
add function of bulk delete time entries (#7996)....
r5196 redirect_back_or_default({:controller => 'timelog', :action => 'index', :project_id => @projects.first})
Toshi MARUYAMA
add bulk edit and bulk update actions for time entries (#7996)....
r5193 end
Jean-Philippe Lang
Adds 2 permissions (closes #859):...
r1235 def destroy
Jean-Philippe Lang
Cleanup in TimelogController#destroy....
r8975 destroyed = TimeEntry.transaction do
@time_entries.each do |t|
Toshi MARUYAMA
add function of bulk delete time entries (#7996)....
r5196 unless t.destroy && t.destroyed?
Jean-Philippe Lang
Cleanup in TimelogController#destroy....
r8975 raise ActiveRecord::Rollback
Toshi MARUYAMA
add function of bulk delete time entries (#7996)....
r5196 end
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 end
Eric Davis
Handle unsuccessful destroys in TimelogController. #5700...
r3691 end
Toshi MARUYAMA
add function of bulk delete time entries (#7996)....
r5196
respond_to do |format|
format.html {
Jean-Philippe Lang
Cleanup in TimelogController#destroy....
r8975 if destroyed
flash[:notice] = l(:notice_successful_delete)
else
flash[:error] = l(:notice_unable_delete_time_entry)
end
Toshi MARUYAMA
add function of bulk delete time entries (#7996)....
r5196 redirect_back_or_default(:action => 'index', :project_id => @projects.first)
}
Jean-Philippe Lang
Cleanup in TimelogController#destroy....
r8975 format.api {
if destroyed
head :ok
else
render_validation_errors(@time_entries)
end
}
Toshi MARUYAMA
add function of bulk delete time entries (#7996)....
r5196 end
Jean-Philippe Lang
Adds 2 permissions (closes #859):...
r1235 end
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365
private
Jean-Philippe Lang
Prevents NoMethodError when requesting /time_entries/edit without an id (#6904)....
r4296 def find_time_entry
@time_entry = TimeEntry.find(params[:id])
unless @time_entry.editable_by?(User.current)
render_403
return false
end
@project = @time_entry.project
rescue ActiveRecord::RecordNotFound
render_404
end
Toshi MARUYAMA
add bulk edit and bulk update actions for time entries (#7996)....
r5193 def find_time_entries
@time_entries = TimeEntry.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @time_entries.empty?
@projects = @time_entries.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1
rescue ActiveRecord::RecordNotFound
render_404
end
def set_flash_from_bulk_time_entry_save(time_entries, unsaved_time_entry_ids)
if unsaved_time_entry_ids.empty?
flash[:notice] = l(:notice_successful_update) unless time_entries.empty?
else
flash[:error] = l(:notice_failed_to_save_time_entries,
:count => unsaved_time_entry_ids.size,
:total => time_entries.size,
:ids => '#' + unsaved_time_entry_ids.join(', #'))
end
end
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 def find_project
Jean-Philippe Lang
Fixed that project is ignored when entering an issue id on /time_entries/new form (#10020)....
r8573 if (project_id = (params[:project_id] || params[:time_entry] && params[:time_entry][:project_id])).present?
@project = Project.find(project_id)
end
Jean-Philippe Lang
Fixed: 404 when entering time with blank issue id (#7099)....
r4397 if (issue_id = (params[:issue_id] || params[:time_entry] && params[:time_entry][:issue_id])).present?
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 @issue = Issue.find(issue_id)
Jean-Philippe Lang
Fixed that project is ignored when entering an issue id on /time_entries/new form (#10020)....
r8573 @project ||= @issue.project
end
if @project.nil?
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 render_404
return false
end
Jean-Philippe Lang
Adds 2 permissions (closes #859):...
r1235 rescue ActiveRecord::RecordNotFound
render_404
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 end
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Jean-Philippe Lang
Adds cross-project time reports support (#994)....
r1777 def find_optional_project
if !params[:issue_id].blank?
@issue = Issue.find(params[:issue_id])
@project = @issue.project
elsif !params[:project_id].blank?
@project = Project.find(params[:project_id])
end
end
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Jean-Philippe Lang
Time report can be done at issue level (closes #970) + timelog views xhtml validation....
r1304 # Retrieves the date range based on predefined ranges or specific from/to param dates
Jean-Philippe Lang
Add predefined date ranges to the time report in the same way as the details view (closes #972). It nows defaults to 'All time'....
r1303 def retrieve_date_range
@free_period = false
@from, @to = nil, nil
if params[:period_type] == '1' || (params[:period_type].nil? && !params[:period].nil?)
case params[:period].to_s
when 'today'
@from = @to = Date.today
when 'yesterday'
@from = @to = Date.today - 1
when 'current_week'
@from = Date.today - (Date.today.cwday - 1)%7
@to = @from + 6
when 'last_week'
@from = Date.today - 7 - (Date.today.cwday - 1)%7
@to = @from + 6
when '7_days'
@from = Date.today - 7
@to = Date.today
when 'current_month'
@from = Date.civil(Date.today.year, Date.today.month, 1)
@to = (@from >> 1) - 1
when 'last_month'
@from = Date.civil(Date.today.year, Date.today.month, 1) << 1
@to = (@from >> 1) - 1
when '30_days'
@from = Date.today - 30
@to = Date.today
when 'current_year'
@from = Date.civil(Date.today.year, 1, 1)
@to = Date.civil(Date.today.year, 12, 31)
end
elsif params[:period_type] == '2' || (params[:period_type].nil? && (!params[:from].nil? || !params[:to].nil?))
begin; @from = params[:from].to_s.to_date unless params[:from].blank?; rescue; end
begin; @to = params[:to].to_s.to_date unless params[:to].blank?; rescue; end
@free_period = true
else
# default
end
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Jean-Philippe Lang
Add predefined date ranges to the time report in the same way as the details view (closes #972). It nows defaults to 'All time'....
r1303 @from, @to = @to, @from if @from && @to && @from > @to
end
Eric Davis
Refactor: extract @available_criterias to utility method....
r3711
Toshi MARUYAMA
add bulk edit and bulk update actions for time entries (#7996)....
r5193 def parse_params_for_bulk_time_entry_attributes(params)
attributes = (params[:time_entry] || {}).reject {|k,v| v.blank?}
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values]
attributes
end
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 end