Feature #3848 » log-time-for-other-users.diff
| app/controllers/timelog_controller.rb | ||
|---|---|---|
| 118 | 118 |
end |
| 119 | 119 | |
| 120 | 120 |
def create |
| 121 |
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today) |
|
| 121 |
# Check if current user has permissions to edit time entries |
|
| 122 |
if request.post? and User.current.allowed_to?(:edit_time_entries, @project) |
|
| 123 |
user = User.find(params[:time_entry][:user_id]) |
|
| 124 |
else |
|
| 125 |
user = User.current |
|
| 126 |
end |
|
| 127 |
|
|
| 128 |
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => user, :spent_on => user.today) |
|
| 122 | 129 |
@time_entry.safe_attributes = params[:time_entry] |
| 123 | 130 | |
| 124 | 131 |
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
|
| app/helpers/timelog_helper.rb | ||
|---|---|---|
| 54 | 54 |
activities.each { |a| collection << [a.name, a.id] }
|
| 55 | 55 |
collection |
| 56 | 56 |
end |
| 57 |
|
|
| 58 |
# Returns a collection of users for a select field. |
|
| 59 |
def user_collection_for_select_options(project, selected = nil) |
|
| 60 |
collection = project.members.map{|member| member.user }
|
|
| 61 |
collection.keep_if{|user| user.allowed_to?(:log_time, project)}
|
|
| 62 |
|
|
| 63 |
s = '' |
|
| 64 |
s << content_tag('option', "<< #{l(:label_me)} >>", :value => User.current.id) if User.current.admin? || collection.include?(User.current)
|
|
| 65 | ||
| 66 |
collection.sort.each do |element| |
|
| 67 |
selected_attribute = ' selected="selected"' if option_value_selected?(element, selected) |
|
| 68 |
s << %(<option value="#{element.id}"#{selected_attribute}>#{h element.name}</option>)
|
|
| 69 |
end |
|
| 70 |
|
|
| 71 |
s.html_safe |
|
| 72 |
end |
|
| 57 | 73 | |
| 58 | 74 |
def select_hours(data, criteria, value) |
| 59 | 75 |
if value.to_s.empty? |
| app/models/issue.rb | ||
|---|---|---|
| 979 | 979 |
@time_entry = existing_time_entry || TimeEntry.new |
| 980 | 980 |
@time_entry.project = project |
| 981 | 981 |
@time_entry.issue = self |
| 982 |
@time_entry.user = User.current
|
|
| 983 |
@time_entry.spent_on = User.current.today
|
|
| 984 |
@time_entry.attributes = params[:time_entry] |
|
| 985 |
self.time_entries << @time_entry |
|
| 982 |
@time_entry.user ||= User.current # For some unknown reason, if User.current override @time_entry.user when it's already set,
|
|
| 983 |
@time_entry.spent_on ||= User.current.today
|
|
| 984 |
@time_entry.attributes = params[:time_entry] # and although this instruction will revert the user to that in params[:time_entry][:user_id]
|
|
| 985 |
self.time_entries << @time_entry # This instruction will force @time_entry.user to be User.current, independently of what it has already set. Or at least that happened to me.
|
|
| 986 | 986 |
end |
| 987 | 987 | |
| 988 | 988 |
# TODO: Rename hook |
| app/models/time_entry.rb | ||
|---|---|---|
| 24 | 24 |
belongs_to :user |
| 25 | 25 |
belongs_to :activity, :class_name => 'TimeEntryActivity', :foreign_key => 'activity_id' |
| 26 | 26 | |
| 27 |
attr_protected :project_id, :user_id, :tyear, :tmonth, :tweek
|
|
| 27 |
attr_protected :project_id, :tyear, :tmonth, :tweek |
|
| 28 | 28 | |
| 29 | 29 |
acts_as_customizable |
| 30 | 30 |
acts_as_event :title => Proc.new {|o| "#{l_hours(o.hours)} (#{(o.issue || o.project).event_title})"},
|
| ... | ... | |
| 66 | 66 |
} |
| 67 | 67 | |
| 68 | 68 |
safe_attributes 'hours', 'comments', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values', 'custom_fields' |
| 69 |
safe_attributes 'user_id', :if => lambda{ |time_entry, user| user.allowed_to?(:edit_time_entries, time_entry.project) }
|
|
| 69 | 70 | |
| 70 | 71 |
def initialize(attributes=nil, *args) |
| 71 | 72 |
super |
| app/views/issues/_edit.html.erb | ||
|---|---|---|
| 18 | 18 |
<div class="splitcontentright"> |
| 19 | 19 |
<p><%= time_entry.select :activity_id, activity_collection_for_select_options %></p> |
| 20 | 20 |
</div> |
| 21 |
<% if User.current.allowed_to?(:edit_time_entries, @project) %> |
|
| 22 |
<p> <%= time_entry.select :user_id, user_collection_for_select_options(@project, @time_entry.user), :required => true %></p> |
|
| 23 |
<% end %> |
|
| 21 | 24 |
<p><%= time_entry.text_field :comments, :size => 60 %></p> |
| 22 | 25 |
<% @time_entry.custom_field_values.each do |value| %> |
| 23 | 26 |
<p><%= custom_field_tag_with_label :time_entry, value %></p> |
| app/views/timelog/_form.html.erb | ||
|---|---|---|
| 15 | 15 |
</p> |
| 16 | 16 |
<p><%= f.text_field :spent_on, :size => 10, :required => true %><%= calendar_for('time_entry_spent_on') %></p>
|
| 17 | 17 |
<p><%= f.text_field :hours, :size => 6, :required => true %></p> |
| 18 |
<% if User.current.allowed_to?(:edit_time_entries, @project) %> |
|
| 19 |
<p> <%= f.select :user_id, user_collection_for_select_options(@project, @time_entry.user), :required => true %></p> |
|
| 20 |
<% end %> |
|
| 18 | 21 |
<p><%= f.text_field :comments, :size => 100, :maxlength => 255 %></p> |
| 19 | 22 |
<p><%= f.select :activity_id, activity_collection_for_select_options(@time_entry), :required => true %></p> |
| 20 | 23 |
<% @time_entry.custom_field_values.each do |value| %> |