--- ./lib/redmine.rb.orig 2016-05-24 18:49:19.000000000 +0200 +++ ./lib/redmine.rb 2016-07-29 12:14:58.165121070 +0200 @@ -126,6 +126,7 @@ map.permission :edit_time_entries, {:timelog => [:edit, :update, :destroy, :bulk_edit, :bulk_update]}, :require => :member map.permission :edit_own_time_entries, {:timelog => [:edit, :update, :destroy,:bulk_edit, :bulk_update]}, :require => :loggedin map.permission :manage_project_activities, {:project_enumerations => [:update, :destroy]}, :require => :member + map.permission :log_foreign_time, {:timelog => [:new, :create]}, :require => :member end map.project_module :news do |map| --- ./config/locales/en.yml.orig 2015-12-06 15:06:23.000000000 +0100 +++ ./config/locales/en.yml 2016-07-29 12:14:10.875012095 +0200 @@ -472,6 +472,7 @@ permission_edit_documents: Edit documents permission_delete_documents: Delete documents permission_manage_files: Manage files + permission_log_foreign_time: Add time logs for other users permission_view_files: View files permission_manage_wiki: Manage wiki permission_rename_wiki_pages: Rename wiki pages --- ./app/views/timelog/_form.html.erb.orig 2016-07-29 12:13:05.212249291 +0200 +++ ./app/views/timelog/_form.html.erb 2016-07-29 12:12:56.804407709 +0200 @@ -19,6 +19,9 @@

<%= f.text_field :spent_on, :size => 10, :required => true %><%= calendar_for('time_entry_spent_on') %>

<%= f.hours_field :hours, :size => 6, :required => true %>

+ <% if User.current.allowed_to?(:log_foreign_time, @project) %> +

<%= f.select :user_id, user_collection_for_select_options(@project, @time_entry.user), :required => true %>

+ <% end %>

<%= f.text_field :comments, :size => 100, :maxlength => 1024, :required => Setting.timelog_required_fields.include?('comments') %>

<%= f.select :activity_id, activity_collection_for_select_options(@time_entry), :required => true %>

<% @time_entry.custom_field_values.each do |value| %> --- ./app/helpers/timelog_helper.rb.orig 2015-12-06 15:06:18.000000000 +0100 +++ ./app/helpers/timelog_helper.rb 2016-07-29 12:16:55.200915920 +0200 @@ -56,6 +56,18 @@ collection end + def user_collection_for_select_options(project, selected = nil) + collection = project.members.map{ |member| member.user } + collection.keep_if{ |user| user.allowed_to?(:log_time, project) } + s = '' + s << content_tag('option', "<< #{l(:label_me)} >>", :value => User.current.id) if User.current.admin? || collection.include?(User.current) + collection.sort.each do |element| + selected_attribute = ' selected="selected"' if option_value_selected?(element, selected) + s << %() + end + s.html_safe + end + def select_hours(data, criteria, value) if value.to_s.empty? data.select {|row| row[criteria].blank? } --- ./app/controllers/timelog_controller.rb.orig 2015-12-06 15:06:19.000000000 +0100 +++ ./app/controllers/timelog_controller.rb 2016-07-29 12:05:37.046693478 +0200 @@ -100,7 +100,12 @@ end def create - @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today) + if request.post? and User.current.allowed_to?(:log_foreign_time, @project) + user = User.find(params[:time_entry][:user_id]) + else + user = User.current + end + @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => user, :spent_on => User.current.today) @time_entry.safe_attributes = params[:time_entry] if @time_entry.project && !User.current.allowed_to?(:log_time, @time_entry.project) render_403