Feature #2964 » 0001-Allow-issues-to-be-assigned-to-a-Group.-2964.patch
app/controllers/issues_controller.rb | ||
---|---|---|
237 | 237 |
tracker = params[:tracker_id].blank? ? nil : @project.trackers.find_by_id(params[:tracker_id]) |
238 | 238 |
status = params[:status_id].blank? ? nil : IssueStatus.find_by_id(params[:status_id]) |
239 | 239 |
priority = params[:priority_id].blank? ? nil : IssuePriority.find_by_id(params[:priority_id]) |
240 |
assigned_to = (params[:assigned_to_id].blank? || params[:assigned_to_id] == 'none') ? nil : User.find_by_id(params[:assigned_to_id])
|
|
240 |
assigned_to = (params[:assigned_to_id].blank? || params[:assigned_to_id] == 'none') ? nil : Principal.find_by_id(params[:assigned_to_id])
|
|
241 | 241 |
category = (params[:category_id].blank? || params[:category_id] == 'none') ? nil : @project.issue_categories.find_by_id(params[:category_id]) |
242 | 242 |
fixed_version = (params[:fixed_version_id].blank? || params[:fixed_version_id] == 'none') ? nil : @project.versions.find_by_id(params[:fixed_version_id]) |
243 | 243 |
custom_field_values = params[:custom_field_values] ? params[:custom_field_values].reject {|k,v| v.blank?} : nil |
app/helpers/issues_helper.rb | ||
---|---|---|
82 | 82 |
t = Tracker.find_by_id(detail.value) and value = t.name if detail.value |
83 | 83 |
t = Tracker.find_by_id(detail.old_value) and old_value = t.name if detail.old_value |
84 | 84 |
when 'assigned_to_id' |
85 |
u = User.find_by_id(detail.value) and value = u.name if detail.value
|
|
86 |
u = User.find_by_id(detail.old_value) and old_value = u.name if detail.old_value
|
|
85 |
u = Principal.find_by_id(detail.value) and value = u.name if detail.value
|
|
86 |
u = Principal.find_by_id(detail.old_value) and old_value = u.name if detail.old_value
|
|
87 | 87 |
when 'priority_id' |
88 | 88 |
e = IssuePriority.find_by_id(detail.value) and value = e.name if detail.value |
89 | 89 |
e = IssuePriority.find_by_id(detail.old_value) and old_value = e.name if detail.old_value |
app/models/group.rb | ||
---|---|---|
28 | 28 |
def to_s |
29 | 29 |
lastname.to_s |
30 | 30 |
end |
31 | ||
32 |
alias :name :to_s |
|
31 | 33 |
|
32 | 34 |
def user_added(user) |
33 | 35 |
members.each do |member| |
app/models/issue.rb | ||
---|---|---|
20 | 20 |
belongs_to :tracker |
21 | 21 |
belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id' |
22 | 22 |
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id' |
23 |
belongs_to :assigned_to, :class_name => 'User', :foreign_key => 'assigned_to_id'
|
|
23 |
belongs_to :assigned_to, :class_name => 'Principal', :foreign_key => 'assigned_to_id'
|
|
24 | 24 |
belongs_to :fixed_version, :class_name => 'Version', :foreign_key => 'fixed_version_id' |
25 | 25 |
belongs_to :priority, :class_name => 'IssuePriority', :foreign_key => 'priority_id' |
26 | 26 |
belongs_to :category, :class_name => 'IssueCategory', :foreign_key => 'category_id' |
... | ... | |
255 | 255 |
notified = project.notified_users |
256 | 256 |
# Author and assignee are always notified unless they have been locked |
257 | 257 |
notified << author if author && author.active? |
258 |
notified << assigned_to if assigned_to && assigned_to.active? |
|
258 |
if assigned_to.is_a? Group |
|
259 |
notified += assigned_to.users |
|
260 |
else |
|
261 |
notified << assigned_to if assigned_to && assigned_to.active? |
|
262 |
end |
|
259 | 263 |
notified.uniq! |
260 | 264 |
# Remove users that can not view the issue |
261 | 265 |
notified.reject! {|user| !visible?(user)} |
app/models/project.rb | ||
---|---|---|
344 | 344 |
|
345 | 345 |
# Users issues can be assigned to |
346 | 346 |
def assignable_users |
347 |
members.select {|m| m.roles.detect {|role| role.assignable?}}.collect {|m| m.user}.sort
|
|
347 |
member_principals.select {|m| m.roles.detect {|role| role.assignable?}}.collect {|m| m.principal }.sort
|
|
348 | 348 |
end |
349 | 349 |
|
350 | 350 |
# Returns the mail adresses of users that should be always notified on project events |
test/exemplars/group_exemplar.rb | ||
---|---|---|
1 |
class Group < Principal |
|
2 |
generator_for :lastname, :method => :next_lastname |
|
3 | ||
4 |
def self.next_lastname |
|
5 |
@last_lastname ||= 'AGroup' |
|
6 |
@last_lastname.succ! |
|
7 |
@last_lastname |
|
8 |
end |
|
9 |
end |
test/functional/issues_controller_test.rb | ||
---|---|---|
532 | 532 |
assert_not_nil v |
533 | 533 |
assert_equal 'Value for field 2', v.value |
534 | 534 |
end |
535 |
|
|
535 | ||
536 |
def test_post_new_with_group_assignment |
|
537 |
@group = Group.find(11) |
|
538 |
@project = Project.find(1) |
|
539 |
@project.members << Member.new(:principal => @group, :roles => [Role.first]) |
|
540 | ||
541 |
@request.session[:user_id] = 2 |
|
542 |
assert_difference 'Issue.count' do |
|
543 |
post :new, :project_id => @project.id, |
|
544 |
:issue => {:tracker_id => 3, |
|
545 |
:subject => 'This is the test_new_with_group_assignment issue', |
|
546 |
:assigned_to_id => @group.id} |
|
547 |
end |
|
548 |
assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id |
|
549 |
|
|
550 |
issue = Issue.find_by_subject('This is the test_new_with_group_assignment issue') |
|
551 |
assert_not_nil issue |
|
552 |
assert_equal @group.id, issue.assigned_to_id |
|
553 |
end |
|
554 | ||
536 | 555 |
def test_post_new_and_continue |
537 | 556 |
@request.session[:user_id] = 2 |
538 | 557 |
post :new, :project_id => 1, |
... | ... | |
933 | 952 |
end |
934 | 953 | |
935 | 954 |
def test_bulk_edit |
955 |
@group = Group.find(11) |
|
956 |
@project = Project.find(1) |
|
957 |
@project.members << Member.new(:principal => @group, :roles => [Role.first]) |
|
936 | 958 |
@request.session[:user_id] = 2 |
937 | 959 |
# update issues priority |
938 | 960 |
post :bulk_edit, :ids => [1, 2], :priority_id => 7, |
939 |
:assigned_to_id => '',
|
|
961 |
:assigned_to_id => @group.id,
|
|
940 | 962 |
:custom_field_values => {'2' => ''}, |
941 | 963 |
:notes => 'Bulk editing' |
942 | 964 |
assert_response 302 |
943 | 965 |
# check that the issues were updated |
944 | 966 |
assert_equal [7, 7], Issue.find_all_by_id([1, 2]).collect {|i| i.priority.id} |
967 |
assert_equal [@group.id, @group.id], Issue.find_all_by_id([1, 2]).collect {|i| i.assigned_to.id} |
|
945 | 968 |
|
946 | 969 |
issue = Issue.find(1) |
947 | 970 |
journal = issue.journals.find(:first, :order => 'created_on DESC') |
948 | 971 |
assert_equal '125', issue.custom_value_for(2).value |
949 | 972 |
assert_equal 'Bulk editing', journal.notes |
950 |
assert_equal 1, journal.details.size
|
|
973 |
assert_equal 2, journal.details.size
|
|
951 | 974 |
end |
952 | 975 | |
953 | 976 |
def test_bullk_edit_should_send_a_notification |
test/unit/issue_test.rb | ||
---|---|---|
27 | 27 |
:custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values, |
28 | 28 |
:time_entries |
29 | 29 | |
30 |
should_belong_to :assigned_to |
|
31 |
|
|
30 | 32 |
def test_create |
31 | 33 |
issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'test_create', :description => 'IssueTest#test_create', :estimated_hours => '1:30') |
32 | 34 |
assert issue.save |
... | ... | |
362 | 364 |
assert !copy.recipients.include?(copy.author.mail) |
363 | 365 |
end |
364 | 366 | |
367 |
test '#recipients should include the assigned group members' do |
|
368 |
group_member = User.generate_with_protected! |
|
369 |
group = Group.generate! |
|
370 |
group.users << group_member |
|
371 |
|
|
372 |
issue = Issue.find(12) |
|
373 |
issue.assigned_to = group |
|
374 |
assert issue.recipients.include?(group_member.mail) |
|
375 |
end |
|
376 | ||
365 | 377 |
def test_watcher_recipients_should_not_include_users_that_cannot_view_the_issue |
366 | 378 |
user = User.find(3) |
367 | 379 |
issue = Issue.find(9) |