Feature #1739 » redmine_changeable_author_v4.2.1.patch
app/helpers/issues_helper.rb | ||
---|---|---|
521 | 521 |
old_value = format_date(detail.old_value.to_date) if detail.old_value |
522 | 522 | |
523 | 523 |
when 'project_id', 'status_id', 'tracker_id', 'assigned_to_id', |
524 |
'priority_id', 'category_id', 'fixed_version_id' |
|
524 |
'priority_id', 'category_id', 'fixed_version_id', 'author_id'
|
|
525 | 525 |
value = find_name_by_reflection(field, detail.value) |
526 | 526 |
old_value = find_name_by_reflection(field, detail.old_value) |
527 | 527 |
app/models/issue.rb | ||
---|---|---|
513 | 513 |
safe_attributes( |
514 | 514 |
'deleted_attachment_ids', |
515 | 515 |
:if => lambda {|issue, user| issue.attachments_deletable?(user)}) |
516 |
safe_attributes( |
|
517 |
'author_id', |
|
518 |
:if => lambda {|issue, user| user.allowed_to?(:change_issue_author, issue.project)}) |
|
516 | 519 | |
517 | 520 |
def safe_attribute_names(user=nil) |
518 | 521 |
names = super |
app/views/issues/_attributes.html.erb | ||
---|---|---|
3 | 3 |
<div class="splitcontent"> |
4 | 4 |
<div class="splitcontentleft"> |
5 | 5 |
<% if @issue.safe_attribute?('status_id') && @allowed_statuses.present? %> |
6 |
<% if User.current.allowed_to?(:change_issue_author, @project) %> |
|
7 |
<p><%= f.select :author_id, principals_options_for_select(@issue.assignable_users.select {|m| m.is_a?(User) && m.allowed_to?(:add_issues, @project) }, @issue.author), :include_blank => false, :required => true %> |
|
8 |
<% end %> |
|
6 | 9 |
<p> |
7 | 10 |
<%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), {:required => true}, |
8 | 11 |
:onchange => "updateIssueFrom('#{escape_javascript(update_issue_form_path(@project, @issue))}', this)" %> |
config/locales/en.yml | ||
---|---|---|
532 | 532 |
permission_view_private_notes: View private notes |
533 | 533 |
permission_set_notes_private: Set notes as private |
534 | 534 |
permission_delete_issues: Delete issues |
535 |
permission_change_issue_author: Change issue author |
|
535 | 536 |
permission_manage_public_queries: Manage public queries |
536 | 537 |
permission_save_queries: Save queries |
537 | 538 |
permission_view_gantt: View gantt chart |
lib/redmine.rb | ||
---|---|---|
118 | 118 |
map.permission :view_private_notes, {}, :read => true, :require => :member |
119 | 119 |
map.permission :set_notes_private, {}, :require => :member |
120 | 120 |
map.permission :delete_issues, {:issues => :destroy}, :require => :member |
121 |
map.permission :change_issue_author, {:issues => [:edit, :update]} |
|
121 | 122 |
# Watchers |
122 | 123 |
map.permission :view_issue_watchers, {}, :read => true |
123 | 124 |
map.permission :add_issue_watchers, {:watchers => [:new, :create, :append, :autocomplete_for_user]} |
test/unit/issue_test.rb | ||
---|---|---|
3406 | 3406 | |
3407 | 3407 |
assert_equal [5], issue2.filter_projects_scope('').ids.sort |
3408 | 3408 |
end |
3409 | ||
3410 |
def test_author_should_be_changed_when_user_with_permission_change_issue_author |
|
3411 |
Role.all.each do |r| |
|
3412 |
r.add_permission! :change_issue_author |
|
3413 |
end |
|
3414 |
User.current = User.find(2) |
|
3415 | ||
3416 |
issue = Issue.generate!(:author => User.find(3)) |
|
3417 |
assert_equal 3, issue.author_id |
|
3418 | ||
3419 |
issue.safe_attributes = { 'author_id' => 4 } |
|
3420 |
assert_equal 4, issue.author_id |
|
3421 |
assert_not_equal 3, issue.author_id |
|
3422 |
end |
|
3423 | ||
3424 |
def test_author_should_not_be_changed_when_user_without_permission_change_issue_author |
|
3425 |
Role.all.each do |r| |
|
3426 |
r.remove_permission! :change_issue_author |
|
3427 |
end |
|
3428 |
User.current = User.find(2) |
|
3429 | ||
3430 |
issue = Issue.generate!(:author => User.find(3)) |
|
3431 |
assert_equal 3, issue.author_id |
|
3432 | ||
3433 |
issue.safe_attributes = { 'author_id' => 4 } |
|
3434 |
assert_not_equal 4, issue.author_id |
|
3435 |
assert_equal 3, issue.author_id |
|
3436 |
end |
|
3409 | 3437 |
end |