##// END OF EJS Templates
Update the issue subject when choosing an issue from the drop down menu....
Update the issue subject when choosing an issue from the drop down menu. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11083 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r10756:8c7b6012f5fc
r10853:6be315c1ff8e
Show More
timelog_controller.rb
313 lines | 10.4 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
Copyright update....
r9453 # Copyright (C) 2006-2012 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
Jean-Philippe Lang
Fixed that project, issue and activity should be preserved when logging time with "Create and continue" (#11038)....
r9558 before_filter :find_project_for_new_time_entry, :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]
Jean-Philippe Lang
Fixed that project, issue and activity should be preserved when logging time with "Create and continue" (#11038)....
r9558 before_filter :find_optional_project, :only => [:index, :report]
before_filter :find_optional_project_for_new_time_entry, :only => [:new]
Jean-Philippe Lang
Enable global time logging at /time_entries/new (#10020)....
r8571 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
Rescue Query::StatementInvalid in TimelogController....
r10746 rescue_from Query::StatementInvalid, :with => :query_statement_invalid
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
Jean-Philippe Lang
Adds TimeEntryQuery for listing time entries....
r10740 helper :queries
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
Adds filters for regular/custom fields to the time entries list/report (#10191)....
r10743 @query = TimeEntryQuery.build_from_params(params, :project => @project, :name => '_')
Jean-Philippe Lang
Adds TimeEntryQuery for listing time entries....
r10740 scope = time_entry_scope
Toshi MARUYAMA
remove trailing white-spaces from app/controllers/timelog_controller.rb....
r6398
Jean-Philippe Lang
Adds TimeEntryQuery for listing time entries....
r10740 sort_init(@query.sort_criteria.empty? ? [['spent_on', 'desc']] : @query.sort_criteria)
sort_update(@query.sortable_columns)
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
Jean-Philippe Lang
Adds filters for regular/custom fields to the time entries list/report (#10191)....
r10743 @query = TimeEntryQuery.build_from_params(params, :project => @project, :name => '_')
Jean-Philippe Lang
Adds TimeEntryQuery for listing time entries....
r10740 scope = time_entry_scope
@report = Redmine::Helpers::TimeReport.new(@project, @issue, params[:criteria], params[:columns], scope)
Jean-Philippe Lang
Dropped TimeEntryReportsController....
r7907
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
Use named routes in controllers....
r10754 options = {
Jean-Philippe Lang
Fixed that project, issue and activity should be preserved when logging time with "Create and continue" (#11038)....
r9558 :time_entry => {:issue_id => @time_entry.issue_id, :activity_id => @time_entry.activity_id},
:back_url => params[:back_url]
Jean-Philippe Lang
Use named routes in controllers....
r10754 }
if @time_entry.issue
redirect_to new_project_issue_time_entry_path(@time_entry.project, @time_entry.issue, options)
else
redirect_to new_project_time_entry_path(@time_entry.project, options)
end
Jean-Philippe Lang
Enable global time logging at /time_entries/new (#10020)....
r8571 else
Jean-Philippe Lang
Use named routes in controllers....
r10754 options = {
Jean-Philippe Lang
Fixed that project, issue and activity should be preserved when logging time with "Create and continue" (#11038)....
r9558 :time_entry => {:project_id => @time_entry.project_id, :issue_id => @time_entry.issue_id, :activity_id => @time_entry.activity_id},
:back_url => params[:back_url]
Jean-Philippe Lang
Use named routes in controllers....
r10754 }
redirect_to new_time_entry_path(options)
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
Jean-Philippe Lang
Use named routes in controllers....
r10754 redirect_back_or_default project_time_entries_path(@time_entry.project)
Jean-Philippe Lang
Adds a 'Create and continue' button on the spent time form (#9995)....
r8567 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)
Jean-Philippe Lang
Use named routes in controllers....
r10754 redirect_back_or_default project_time_entries_path(@time_entry.project)
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 }
Jean-Philippe Lang
Fixed that 200 API responses have a body containing one space (#11388)....
r9792 format.api { render_api_ok }
Jean-Philippe Lang
Adds REST API for TimeEntries (#6823)....
r4347 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)
Jean-Philippe Lang
Use named routes in controllers....
r10754 redirect_back_or_default project_time_entries_path(@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
Jean-Philippe Lang
Use named routes in controllers....
r10754 redirect_back_or_default project_time_entries_path(@projects.first)
Toshi MARUYAMA
add function of bulk delete time entries (#7996)....
r5196 }
Jean-Philippe Lang
Cleanup in TimelogController#destroy....
r8975 format.api {
if destroyed
Jean-Philippe Lang
Fixed that 200 API responses have a body containing one space (#11388)....
r9792 render_api_ok
Jean-Philippe Lang
Cleanup in TimelogController#destroy....
r8975 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
Fixed that project, issue and activity should be preserved when logging time with "Create and continue" (#11038)....
r9558 def find_optional_project_for_new_time_entry
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
Jean-Philippe Lang
Fixed that project, issue and activity should be preserved when logging time with "Create and continue" (#11038)....
r9558 rescue ActiveRecord::RecordNotFound
render_404
end
def find_project_for_new_time_entry
find_optional_project_for_new_time_entry
Jean-Philippe Lang
Fixed that project is ignored when entering an issue id on /time_entries/new form (#10020)....
r8573 if @project.nil?
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 render_404
end
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
Adds TimeEntryQuery for listing time entries....
r10740 # Returns the TimeEntry scope for index and report actions
def time_entry_scope
scope = TimeEntry.visible.where(@query.statement)
if @issue
scope = scope.on_issue(@issue)
elsif @project
scope = scope.on_project(@project, Setting.display_subprojects_issues?)
end
scope
end
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