Feature #1739 » redmine_changeable_author_r21324.patch
app/helpers/issues_helper.rb | ||
---|---|---|
534 | 534 |
old_value = format_date(detail.old_value.to_date) if detail.old_value |
535 | 535 | |
536 | 536 |
when 'project_id', 'status_id', 'tracker_id', 'assigned_to_id', |
537 |
'priority_id', 'category_id', 'fixed_version_id' |
|
537 |
'priority_id', 'category_id', 'fixed_version_id', 'author_id'
|
|
538 | 538 |
value = find_name_by_reflection(field, detail.value) |
539 | 539 |
old_value = find_name_by_reflection(field, detail.old_value) |
540 | 540 |
app/models/issue.rb | ||
---|---|---|
517 | 517 |
safe_attributes( |
518 | 518 |
'deleted_attachment_ids', |
519 | 519 |
:if => lambda {|issue, user| issue.attachments_deletable?(user)}) |
520 |
safe_attributes( |
|
521 |
'author_id', |
|
522 |
:if => lambda {|issue, user| user.allowed_to?(:change_issue_author, issue.project)}) |
|
520 | 523 | |
521 | 524 |
def safe_attribute_names(user=nil) |
522 | 525 |
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 | ||
---|---|---|
533 | 533 |
permission_view_private_notes: View private notes |
534 | 534 |
permission_set_notes_private: Set notes as private |
535 | 535 |
permission_delete_issues: Delete issues |
536 |
permission_change_issue_author: Change issue author |
|
536 | 537 |
permission_manage_public_queries: Manage public queries |
537 | 538 |
permission_save_queries: Save queries |
538 | 539 |
permission_view_gantt: View gantt chart |
lib/redmine/preparation.rb | ||
---|---|---|
71 | 71 |
map.permission :view_private_notes, {}, :read => true, :require => :member |
72 | 72 |
map.permission :set_notes_private, {}, :require => :member |
73 | 73 |
map.permission :delete_issues, {:issues => :destroy}, :require => :member |
74 |
map.permission :change_issue_author, {:issues => [:edit, :update]} |
|
74 | 75 |
# Watchers |
75 | 76 |
map.permission :view_issue_watchers, {}, :read => true |
76 | 77 |
map.permission :add_issue_watchers, {:watchers => [:new, :create, :append, :autocomplete_for_user]} |
test/unit/issue_test.rb | ||
---|---|---|
3427 | 3427 |
r = Issue.like('issue today') |
3428 | 3428 |
assert_include Issue.find(7), r |
3429 | 3429 |
end |
3430 | ||
3431 |
def test_author_should_be_changed_when_user_with_permission_change_issue_author |
|
3432 |
Role.all.each do |r| |
|
3433 |
r.add_permission! :change_issue_author |
|
3434 |
end |
|
3435 |
User.current = User.find(2) |
|
3436 | ||
3437 |
issue = Issue.generate!(:author => User.find(3)) |
|
3438 |
assert_equal 3, issue.author_id |
|
3439 | ||
3440 |
issue.safe_attributes = { 'author_id' => 4 } |
|
3441 |
assert_equal 4, issue.author_id |
|
3442 |
assert_not_equal 3, issue.author_id |
|
3443 |
end |
|
3444 | ||
3445 |
def test_author_should_not_be_changed_when_user_without_permission_change_issue_author |
|
3446 |
Role.all.each do |r| |
|
3447 |
r.remove_permission! :change_issue_author |
|
3448 |
end |
|
3449 |
User.current = User.find(2) |
|
3450 | ||
3451 |
issue = Issue.generate!(:author => User.find(3)) |
|
3452 |
assert_equal 3, issue.author_id |
|
3453 | ||
3454 |
issue.safe_attributes = { 'author_id' => 4 } |
|
3455 |
assert_not_equal 4, issue.author_id |
|
3456 |
assert_equal 3, issue.author_id |
|
3457 |
end |
|
3430 | 3458 |
end |