##// END OF EJS Templates
Introduce virtual MenuNodes (#15880)....
Introduce virtual MenuNodes (#15880). They are characterized by having a blank url. they will only be rendered if the user is authorized to see at least one of its children. they render as links which do nothing when clicked. Patch by Jan Schulz-Hofen. git-svn-id: http://svn.redmine.org/redmine/trunk@15501 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r14856:cda9c63d9c21
r15119:53710d80fc88
Show More
timelog_controller.rb
281 lines | 9.5 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
Updates copyright for 2016....
r14856 # Copyright (C) 2006-2016 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
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
Let the new time_entry form be submitted without project (#17954)....
r13058 before_filter :authorize, :only => [:show, :edit, :update, :bulk_edit, :bulk_update, :destroy]
Jean-Philippe Lang
Enable global time logging at /time_entries/new (#10020)....
r8571
Jean-Philippe Lang
Let the new time_entry form be submitted without project (#17954)....
r13058 before_filter :find_optional_project, :only => [:new, :create, :index, :report]
before_filter :authorize_global, :only => [:new, :create, :index, :report]
Jean-Philippe Lang
Enable global time logging at /time_entries/new (#10020)....
r8571
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
Jean-Philippe Lang
Makes all time entry columns available in the CSV export....
r11212 include QueriesHelper
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 => '_')
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)
Jean-Philippe Lang
Preload some associations....
r11814 scope = time_entry_scope(:order => sort_clause).
Jean-Philippe Lang
Fixed that filtering time entries on activity does not take care of activity overrides (#15623)....
r12139 includes(:project, :user, :issue).
Jean-Philippe Lang
Preload some associations....
r11814 preload(:issue => [:project, :tracker, :status, :assigned_to, :priority])
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 {
Jean-Philippe Lang
Adds named scopes for time entries index....
r7964 @entry_count = scope.count
Jean-Philippe Lang
Deprecation warnings (#12774)....
r10909 @entry_pages = Paginator.new @entry_count, per_page_option, params['page']
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 @entries = scope.offset(@entry_pages.offset).limit(@entry_pages.per_page).to_a
Jean-Philippe Lang
Adds named scopes for time entries index....
r7964 @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
Merged rails-4.1 branch (#14534)....
r13100 @entries = scope.offset(@offset).limit(@limit).preload(:custom_values => :custom_field).to_a
Jean-Philippe Lang
Replaces TimeEntry.visible_by with a visible scope....
r5029 }
format.atom {
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 entries = scope.limit(Setting.feeds_limit.to_i).reorder("#{TimeEntry.table_name}.created_on DESC").to_a
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
Merged rails-4.1 branch (#14534)....
r13100 @entries = scope.to_a
Jean-Philippe Lang
Refactor: #issues_to_csv and #entries_to_csv merged into QueriesHelper#query_to_csv....
r11218 send_data(query_to_csv(@entries, @query, params), :type => 'text/csv; header=present', :filename => 'timelog.csv')
Jean-Philippe Lang
Replaces TimeEntry.visible_by with a visible scope....
r5029 }
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]
Jean-Philippe Lang
Let the new time_entry form be submitted without project (#17954)....
r13058 if @time_entry.project && !User.current.allowed_to?(:log_time, @time_entry.project)
render_403
return
end
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
Let the new time_entry form be submitted without project (#17954)....
r13058 options = {
:time_entry => {
:project_id => params[:time_entry][:project_id],
:issue_id => @time_entry.issue_id,
:activity_id => @time_entry.activity_id
},
:back_url => params[:back_url]
}
if params[:project_id] && @time_entry.project
redirect_to new_project_time_entry_path(@time_entry.project, options)
elsif params[:issue_id] && @time_entry.issue
redirect_to new_issue_time_entry_path(@time_entry.issue, options)
Jean-Philippe Lang
Enable global time logging at /time_entries/new (#10020)....
r8571 else
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
Jean-Philippe Lang
Use logger.info? (#18605)....
r13384 logger.info "time entry could not be updated: #{time_entry.errors.full_messages}" if logger && logger.info?
Toshi MARUYAMA
add bulk edit and bulk update actions for time entries (#7996)....
r5193 # 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
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 @time_entries = TimeEntry.where(:id => params[:id] || params[:ids]).to_a
Toshi MARUYAMA
add bulk edit and bulk update actions for time entries (#7996)....
r5193 raise ActiveRecord::RecordNotFound if @time_entries.empty?
Jean-Philippe Lang
Can't bulk edit own time entries with "Edit own time entries" (#18580)....
r13860 raise Unauthorized unless @time_entries.all? {|t| t.editable_by?(User.current)}
Toshi MARUYAMA
add bulk edit and bulk update actions for time entries (#7996)....
r5193 @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
Adds cross-project time reports support (#994)....
r1777 def find_optional_project
Jean-Philippe Lang
Let the new time_entry form be submitted without project (#17954)....
r13058 if params[:issue_id].present?
Jean-Philippe Lang
Adds cross-project time reports support (#994)....
r1777 @issue = Issue.find(params[:issue_id])
@project = @issue.project
Jean-Philippe Lang
Let the new time_entry form be submitted without project (#17954)....
r13058 elsif params[:project_id].present?
Jean-Philippe Lang
Adds cross-project time reports support (#994)....
r1777 @project = Project.find(params[:project_id])
end
Jean-Philippe Lang
Let the new time_entry form be submitted without project (#17954)....
r13058 rescue ActiveRecord::RecordNotFound
render_404
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
Adds TimeEntryQuery for listing time entries....
r10740 # Returns the TimeEntry scope for index and report actions
Jean-Philippe Lang
Fixed that sorting time entries by custom field raises a SQL error (#14366)....
r11812 def time_entry_scope(options={})
scope = @query.results_scope(options)
Jean-Philippe Lang
Adds TimeEntryQuery for listing time entries....
r10740 if @issue
scope = scope.on_issue(@issue)
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