Feature #3848 » log-time-for-other-users.diff
| app/helpers/timelog_helper.rb (copia de trabajo) | ||
|---|---|---|
| 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)
|
|
| 57 | 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 |
|
| 73 | ||
| 58 | 74 |
def select_hours(data, criteria, value) |
| 59 | 75 |
if value.to_s.empty? |
| 60 | 76 |
data.select {|row| row[criteria].blank? }
|
| app/models/time_entry.rb (copia de trabajo) | ||
|---|---|---|
| 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})"},
|
| ... | ... | |
| 67 | 67 |
} |
| 68 | 68 | |
| 69 | 69 |
safe_attributes 'hours', 'comments', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values', 'custom_fields' |
| 70 |
safe_attributes 'user_id', :if => lambda{ |time_entry, user| user.allowed_to?(:edit_time_entries, time_entry.project) }
|
|
| 70 | 71 | |
| 71 | 72 |
def initialize(attributes=nil, *args) |
| 72 | 73 |
super |
| app/models/issue.rb (copia de trabajo) | ||
|---|---|---|
| 954 | 954 |
@time_entry = existing_time_entry || TimeEntry.new |
| 955 | 955 |
@time_entry.project = project |
| 956 | 956 |
@time_entry.issue = self |
| 957 |
@time_entry.user = User.current
|
|
| 958 |
@time_entry.spent_on = User.current.today
|
|
| 959 |
@time_entry.attributes = params[:time_entry] |
|
| 960 |
self.time_entries << @time_entry |
|
| 957 |
@time_entry.user ||= User.current # For some unknown reason, if User.current override @time_entry.user when it's already set,
|
|
| 958 |
@time_entry.spent_on ||= User.current.today
|
|
| 959 |
@time_entry.attributes = params[:time_entry] # and although this instruction will revert the user to that in params[:time_entry][:user_id]
|
|
| 960 |
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.
|
|
| 961 | 961 |
end |
| 962 | 962 | |
| 963 | 963 |
# TODO: Rename hook |
| app/controllers/timelog_controller.rb (copia de trabajo) | ||
|---|---|---|
| 123 | 123 |
end |
| 124 | 124 | |
| 125 | 125 |
def create |
| 126 |
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today) |
|
| 126 |
# Check if current user has permissions to edit time entries |
|
| 127 |
if request.post? and User.current.allowed_to?(:edit_time_entries, @project) |
|
| 128 |
user = User.find(params[:time_entry][:user_id]) |
|
| 129 |
else |
|
| 130 |
user = User.current |
|
| 131 |
end |
|
| 132 |
|
|
| 133 |
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => user, :spent_on => user.today) |
|
| 127 | 134 |
@time_entry.safe_attributes = params[:time_entry] |
| 128 | 135 | |
| 129 | 136 |
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
|
| app/views/timelog/_form.html.erb (copia de trabajo) | ||
|---|---|---|
| 12 | 12 |
<p><%= f.text_field :issue_id, :size => 6 %> <em><%= h("#{@time_entry.issue.tracker.name} ##{@time_entry.issue.id}: #{@time_entry.issue.subject}") if @time_entry.issue %></em></p>
|
| 13 | 13 |
<p><%= f.text_field :spent_on, :size => 10, :required => true %><%= calendar_for('time_entry_spent_on') %></p>
|
| 14 | 14 |
<p><%= f.text_field :hours, :size => 6, :required => true %></p> |
| 15 |
<% if User.current.allowed_to?(:edit_time_entries, @project) %> |
|
| 16 |
<p> <%= f.select :user_id, user_collection_for_select_options(@project, @time_entry.user), :required => true %></p> |
|
| 17 |
<% end %> |
|
| 15 | 18 |
<p><%= f.text_field :comments, :size => 100 %></p> |
| 16 | 19 |
<p><%= f.select :activity_id, activity_collection_for_select_options(@time_entry), :required => true %></p> |
| 17 | 20 |
<% @time_entry.custom_field_values.each do |value| %> |
| app/views/issues/_edit.html.erb (copia de trabajo) | ||
|---|---|---|
| 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> |