Commit 6d92aa6d12b875b4987666da98658191ae426892
1 parent
55f83385
Exists in
master
and in
4 other branches
Fix IssueObserver current_user assign. Refactored observers
Showing
13 changed files
with
159 additions
and
151 deletions
Show diff stats
app/controllers/application_controller.rb
1 | 1 | class ApplicationController < ActionController::Base |
2 | 2 | before_filter :authenticate_user! |
3 | 3 | before_filter :reject_blocked! |
4 | - before_filter :set_current_user_for_mailer, :check_token_auth | |
4 | + before_filter :set_current_user_for_mailer | |
5 | + before_filter :check_token_auth | |
6 | + before_filter :set_current_user_for_observers | |
7 | + | |
5 | 8 | protect_from_forgery |
9 | + | |
6 | 10 | helper_method :abilities, :can? |
7 | 11 | |
8 | 12 | rescue_from Gitlab::Gitolite::AccessDenied do |exception| |
... | ... | @@ -58,6 +62,10 @@ class ApplicationController < ActionController::Base |
58 | 62 | MailerObserver.current_user = current_user |
59 | 63 | end |
60 | 64 | |
65 | + def set_current_user_for_observers | |
66 | + IssueObserver.current_user = current_user | |
67 | + end | |
68 | + | |
61 | 69 | def abilities |
62 | 70 | @abilities ||= Six.new |
63 | 71 | end | ... | ... |
app/models/activity_observer.rb
... | ... | @@ -1,25 +0,0 @@ |
1 | -class ActivityObserver < ActiveRecord::Observer | |
2 | - observe :issue, :merge_request | |
3 | - | |
4 | - def after_create(record) | |
5 | - Event.create( | |
6 | - :project => record.project, | |
7 | - :target_id => record.id, | |
8 | - :target_type => record.class.name, | |
9 | - :action => Event.determine_action(record), | |
10 | - :author_id => record.author_id | |
11 | - ) | |
12 | - end | |
13 | - | |
14 | - def after_save(record) | |
15 | - if record.changed.include?("closed") | |
16 | - Event.create( | |
17 | - :project => record.project, | |
18 | - :target_id => record.id, | |
19 | - :target_type => record.class.name, | |
20 | - :action => (record.closed ? Event::Closed : Event::Reopened), | |
21 | - :author_id => record.author_id_of_changes | |
22 | - ) | |
23 | - end | |
24 | - end | |
25 | -end |
app/models/issue_observer.rb
... | ... | @@ -1,23 +0,0 @@ |
1 | -class IssueObserver < ActiveRecord::Observer | |
2 | - cattr_accessor :current_user | |
3 | - | |
4 | - def after_create(issue) | |
5 | - Notify.new_issue_email(issue.id).deliver if issue.assignee != current_user | |
6 | - end | |
7 | - | |
8 | - def after_update(issue) | |
9 | - send_reassigned_email(issue) if issue.is_being_reassigned? | |
10 | - Note.create_status_change_note(issue, current_user, 'closed') if issue.is_being_closed? | |
11 | - Note.create_status_change_note(issue, current_user, 'reopened') if issue.is_being_reopened? | |
12 | - end | |
13 | - | |
14 | - protected | |
15 | - | |
16 | - def send_reassigned_email(issue) | |
17 | - recipient_ids = [issue.assignee_id, issue.assignee_id_was].keep_if {|id| id != current_user.id } | |
18 | - | |
19 | - recipient_ids.each do |recipient_id| | |
20 | - Notify.reassigned_issue_email(recipient_id, issue.id, issue.assignee_id_was).deliver | |
21 | - end | |
22 | - end | |
23 | -end |
app/models/key_observer.rb
app/models/mailer_observer.rb
... | ... | @@ -1,79 +0,0 @@ |
1 | -class MailerObserver < ActiveRecord::Observer | |
2 | - observe :note, :merge_request | |
3 | - cattr_accessor :current_user | |
4 | - | |
5 | - def after_create(model) | |
6 | - new_note(model) if model.kind_of?(Note) | |
7 | - new_merge_request(model) if model.kind_of?(MergeRequest) | |
8 | - end | |
9 | - | |
10 | - def after_update(model) | |
11 | - changed_merge_request(model) if model.kind_of?(MergeRequest) | |
12 | - end | |
13 | - | |
14 | - protected | |
15 | - | |
16 | - def new_note(note) | |
17 | - if note.notify | |
18 | - # Notify whole team except author of note | |
19 | - notify_note(note) | |
20 | - elsif note.notify_author | |
21 | - # Notify only author of resource | |
22 | - Notify.note_commit_email(note.commit_author.id, note.id).deliver | |
23 | - else | |
24 | - # Otherwise ignore it | |
25 | - nil | |
26 | - end | |
27 | - end | |
28 | - | |
29 | - def notify_note note | |
30 | - # reject author of note from mail list | |
31 | - users = note.project.users.reject { |u| u.id == current_user.id } | |
32 | - | |
33 | - users.each do |u| | |
34 | - case note.noteable_type | |
35 | - when "Commit"; Notify.note_commit_email(u.id, note.id).deliver | |
36 | - when "Issue"; Notify.note_issue_email(u.id, note.id).deliver | |
37 | - when "MergeRequest"; Notify.note_merge_request_email(u.id, note.id).deliver | |
38 | - when "Snippet"; true | |
39 | - else | |
40 | - Notify.note_wall_email(u.id, note.id).deliver | |
41 | - end | |
42 | - end | |
43 | - end | |
44 | - | |
45 | - def new_merge_request(merge_request) | |
46 | - if merge_request.assignee != current_user | |
47 | - Notify.new_merge_request_email(merge_request.id).deliver | |
48 | - end | |
49 | - end | |
50 | - | |
51 | - def changed_merge_request(merge_request) | |
52 | - status_notify_and_comment merge_request, :reassigned_merge_request_email | |
53 | - end | |
54 | - | |
55 | - # This method used for Issues & Merge Requests | |
56 | - # | |
57 | - # It create a comment for Issue or MR if someone close/reopen. | |
58 | - # It also notify via email if assignee was changed | |
59 | - # | |
60 | - def status_notify_and_comment target, mail_method | |
61 | - # If assigne changed - notify to recipients | |
62 | - if target.assignee_id_changed? | |
63 | - recipients_ids = target.assignee_id_was, target.assignee_id | |
64 | - recipients_ids.delete current_user.id | |
65 | - | |
66 | - recipients_ids.each do |recipient_id| | |
67 | - Notify.send(mail_method, recipient_id, target.id, target.assignee_id_was).deliver | |
68 | - end | |
69 | - end | |
70 | - | |
71 | - # Create comment about status changed | |
72 | - if target.closed_changed? | |
73 | - note = Note.new(:noteable => target, :project => target.project) | |
74 | - note.author = current_user | |
75 | - note.note = "_Status changed to #{target.closed ? 'closed' : 'reopened'}_" | |
76 | - note.save() | |
77 | - end | |
78 | - end | |
79 | -end |
app/models/project_observer.rb
app/models/user_observer.rb
... | ... | @@ -0,0 +1,25 @@ |
1 | +class ActivityObserver < ActiveRecord::Observer | |
2 | + observe :issue, :merge_request | |
3 | + | |
4 | + def after_create(record) | |
5 | + Event.create( | |
6 | + :project => record.project, | |
7 | + :target_id => record.id, | |
8 | + :target_type => record.class.name, | |
9 | + :action => Event.determine_action(record), | |
10 | + :author_id => record.author_id | |
11 | + ) | |
12 | + end | |
13 | + | |
14 | + def after_save(record) | |
15 | + if record.changed.include?("closed") | |
16 | + Event.create( | |
17 | + :project => record.project, | |
18 | + :target_id => record.id, | |
19 | + :target_type => record.class.name, | |
20 | + :action => (record.closed ? Event::Closed : Event::Reopened), | |
21 | + :author_id => record.author_id_of_changes | |
22 | + ) | |
23 | + end | |
24 | + end | |
25 | +end | ... | ... |
... | ... | @@ -0,0 +1,23 @@ |
1 | +class IssueObserver < ActiveRecord::Observer | |
2 | + cattr_accessor :current_user | |
3 | + | |
4 | + def after_create(issue) | |
5 | + Notify.new_issue_email(issue.id).deliver if issue.assignee != current_user | |
6 | + end | |
7 | + | |
8 | + def after_update(issue) | |
9 | + send_reassigned_email(issue) if issue.is_being_reassigned? | |
10 | + Note.create_status_change_note(issue, current_user, 'closed') if issue.is_being_closed? | |
11 | + Note.create_status_change_note(issue, current_user, 'reopened') if issue.is_being_reopened? | |
12 | + end | |
13 | + | |
14 | + protected | |
15 | + | |
16 | + def send_reassigned_email(issue) | |
17 | + recipient_ids = [issue.assignee_id, issue.assignee_id_was].keep_if {|id| id != current_user.id } | |
18 | + | |
19 | + recipient_ids.each do |recipient_id| | |
20 | + Notify.reassigned_issue_email(recipient_id, issue.id, issue.assignee_id_was).deliver | |
21 | + end | |
22 | + end | |
23 | +end | ... | ... |
... | ... | @@ -0,0 +1,79 @@ |
1 | +class MailerObserver < ActiveRecord::Observer | |
2 | + observe :note, :merge_request | |
3 | + cattr_accessor :current_user | |
4 | + | |
5 | + def after_create(model) | |
6 | + new_note(model) if model.kind_of?(Note) | |
7 | + new_merge_request(model) if model.kind_of?(MergeRequest) | |
8 | + end | |
9 | + | |
10 | + def after_update(model) | |
11 | + changed_merge_request(model) if model.kind_of?(MergeRequest) | |
12 | + end | |
13 | + | |
14 | + protected | |
15 | + | |
16 | + def new_note(note) | |
17 | + if note.notify | |
18 | + # Notify whole team except author of note | |
19 | + notify_note(note) | |
20 | + elsif note.notify_author | |
21 | + # Notify only author of resource | |
22 | + Notify.note_commit_email(note.commit_author.id, note.id).deliver | |
23 | + else | |
24 | + # Otherwise ignore it | |
25 | + nil | |
26 | + end | |
27 | + end | |
28 | + | |
29 | + def notify_note note | |
30 | + # reject author of note from mail list | |
31 | + users = note.project.users.reject { |u| u.id == current_user.id } | |
32 | + | |
33 | + users.each do |u| | |
34 | + case note.noteable_type | |
35 | + when "Commit"; Notify.note_commit_email(u.id, note.id).deliver | |
36 | + when "Issue"; Notify.note_issue_email(u.id, note.id).deliver | |
37 | + when "MergeRequest"; Notify.note_merge_request_email(u.id, note.id).deliver | |
38 | + when "Snippet"; true | |
39 | + else | |
40 | + Notify.note_wall_email(u.id, note.id).deliver | |
41 | + end | |
42 | + end | |
43 | + end | |
44 | + | |
45 | + def new_merge_request(merge_request) | |
46 | + if merge_request.assignee != current_user | |
47 | + Notify.new_merge_request_email(merge_request.id).deliver | |
48 | + end | |
49 | + end | |
50 | + | |
51 | + def changed_merge_request(merge_request) | |
52 | + status_notify_and_comment merge_request, :reassigned_merge_request_email | |
53 | + end | |
54 | + | |
55 | + # This method used for Issues & Merge Requests | |
56 | + # | |
57 | + # It create a comment for Issue or MR if someone close/reopen. | |
58 | + # It also notify via email if assignee was changed | |
59 | + # | |
60 | + def status_notify_and_comment target, mail_method | |
61 | + # If assigne changed - notify to recipients | |
62 | + if target.assignee_id_changed? | |
63 | + recipients_ids = target.assignee_id_was, target.assignee_id | |
64 | + recipients_ids.delete current_user.id | |
65 | + | |
66 | + recipients_ids.each do |recipient_id| | |
67 | + Notify.send(mail_method, recipient_id, target.id, target.assignee_id_was).deliver | |
68 | + end | |
69 | + end | |
70 | + | |
71 | + # Create comment about status changed | |
72 | + if target.closed_changed? | |
73 | + note = Note.new(:noteable => target, :project => target.project) | |
74 | + note.author = current_user | |
75 | + note.note = "_Status changed to #{target.closed ? 'closed' : 'reopened'}_" | |
76 | + note.save() | |
77 | + end | |
78 | + end | |
79 | +end | ... | ... |