From 6d92aa6d12b875b4987666da98658191ae426892 Mon Sep 17 00:00:00 2001 From: randx Date: Sun, 24 Jun 2012 10:01:42 +0300 Subject: [PATCH] Fix IssueObserver current_user assign. Refactored observers --- app/controllers/application_controller.rb | 10 +++++++++- app/models/activity_observer.rb | 25 ------------------------- app/models/issue_observer.rb | 23 ----------------------- app/models/key_observer.rb | 9 --------- app/models/mailer_observer.rb | 79 ------------------------------------------------------------------------------- app/models/project_observer.rb | 9 --------- app/models/user_observer.rb | 5 ----- app/observers/activity_observer.rb | 25 +++++++++++++++++++++++++ app/observers/issue_observer.rb | 23 +++++++++++++++++++++++ app/observers/key_observer.rb | 9 +++++++++ app/observers/mailer_observer.rb | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/observers/project_observer.rb | 9 +++++++++ app/observers/user_observer.rb | 5 +++++ 13 files changed, 159 insertions(+), 151 deletions(-) delete mode 100644 app/models/activity_observer.rb delete mode 100644 app/models/issue_observer.rb delete mode 100644 app/models/key_observer.rb delete mode 100644 app/models/mailer_observer.rb delete mode 100644 app/models/project_observer.rb delete mode 100644 app/models/user_observer.rb create mode 100644 app/observers/activity_observer.rb create mode 100644 app/observers/issue_observer.rb create mode 100644 app/observers/key_observer.rb create mode 100644 app/observers/mailer_observer.rb create mode 100644 app/observers/project_observer.rb create mode 100644 app/observers/user_observer.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0c31788..9a0f95b 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,8 +1,12 @@ class ApplicationController < ActionController::Base before_filter :authenticate_user! before_filter :reject_blocked! - before_filter :set_current_user_for_mailer, :check_token_auth + before_filter :set_current_user_for_mailer + before_filter :check_token_auth + before_filter :set_current_user_for_observers + protect_from_forgery + helper_method :abilities, :can? rescue_from Gitlab::Gitolite::AccessDenied do |exception| @@ -58,6 +62,10 @@ class ApplicationController < ActionController::Base MailerObserver.current_user = current_user end + def set_current_user_for_observers + IssueObserver.current_user = current_user + end + def abilities @abilities ||= Six.new end diff --git a/app/models/activity_observer.rb b/app/models/activity_observer.rb deleted file mode 100644 index 324d820..0000000 --- a/app/models/activity_observer.rb +++ /dev/null @@ -1,25 +0,0 @@ -class ActivityObserver < ActiveRecord::Observer - observe :issue, :merge_request - - def after_create(record) - Event.create( - :project => record.project, - :target_id => record.id, - :target_type => record.class.name, - :action => Event.determine_action(record), - :author_id => record.author_id - ) - end - - def after_save(record) - if record.changed.include?("closed") - Event.create( - :project => record.project, - :target_id => record.id, - :target_type => record.class.name, - :action => (record.closed ? Event::Closed : Event::Reopened), - :author_id => record.author_id_of_changes - ) - end - end -end diff --git a/app/models/issue_observer.rb b/app/models/issue_observer.rb deleted file mode 100644 index fadedd3..0000000 --- a/app/models/issue_observer.rb +++ /dev/null @@ -1,23 +0,0 @@ -class IssueObserver < ActiveRecord::Observer - cattr_accessor :current_user - - def after_create(issue) - Notify.new_issue_email(issue.id).deliver if issue.assignee != current_user - end - - def after_update(issue) - send_reassigned_email(issue) if issue.is_being_reassigned? - Note.create_status_change_note(issue, current_user, 'closed') if issue.is_being_closed? - Note.create_status_change_note(issue, current_user, 'reopened') if issue.is_being_reopened? - end - - protected - - def send_reassigned_email(issue) - recipient_ids = [issue.assignee_id, issue.assignee_id_was].keep_if {|id| id != current_user.id } - - recipient_ids.each do |recipient_id| - Notify.reassigned_issue_email(recipient_id, issue.id, issue.assignee_id_was).deliver - end - end -end diff --git a/app/models/key_observer.rb b/app/models/key_observer.rb deleted file mode 100644 index fac53a6..0000000 --- a/app/models/key_observer.rb +++ /dev/null @@ -1,9 +0,0 @@ -class KeyObserver < ActiveRecord::Observer - def after_save(key) - key.update_repository - end - - def after_destroy(key) - key.repository_delete_key - end -end diff --git a/app/models/mailer_observer.rb b/app/models/mailer_observer.rb deleted file mode 100644 index 880fd50..0000000 --- a/app/models/mailer_observer.rb +++ /dev/null @@ -1,79 +0,0 @@ -class MailerObserver < ActiveRecord::Observer - observe :note, :merge_request - cattr_accessor :current_user - - def after_create(model) - new_note(model) if model.kind_of?(Note) - new_merge_request(model) if model.kind_of?(MergeRequest) - end - - def after_update(model) - changed_merge_request(model) if model.kind_of?(MergeRequest) - end - - protected - - def new_note(note) - if note.notify - # Notify whole team except author of note - notify_note(note) - elsif note.notify_author - # Notify only author of resource - Notify.note_commit_email(note.commit_author.id, note.id).deliver - else - # Otherwise ignore it - nil - end - end - - def notify_note note - # reject author of note from mail list - users = note.project.users.reject { |u| u.id == current_user.id } - - users.each do |u| - case note.noteable_type - when "Commit"; Notify.note_commit_email(u.id, note.id).deliver - when "Issue"; Notify.note_issue_email(u.id, note.id).deliver - when "MergeRequest"; Notify.note_merge_request_email(u.id, note.id).deliver - when "Snippet"; true - else - Notify.note_wall_email(u.id, note.id).deliver - end - end - end - - def new_merge_request(merge_request) - if merge_request.assignee != current_user - Notify.new_merge_request_email(merge_request.id).deliver - end - end - - def changed_merge_request(merge_request) - status_notify_and_comment merge_request, :reassigned_merge_request_email - end - - # This method used for Issues & Merge Requests - # - # It create a comment for Issue or MR if someone close/reopen. - # It also notify via email if assignee was changed - # - def status_notify_and_comment target, mail_method - # If assigne changed - notify to recipients - if target.assignee_id_changed? - recipients_ids = target.assignee_id_was, target.assignee_id - recipients_ids.delete current_user.id - - recipients_ids.each do |recipient_id| - Notify.send(mail_method, recipient_id, target.id, target.assignee_id_was).deliver - end - end - - # Create comment about status changed - if target.closed_changed? - note = Note.new(:noteable => target, :project => target.project) - note.author = current_user - note.note = "_Status changed to #{target.closed ? 'closed' : 'reopened'}_" - note.save() - end - end -end diff --git a/app/models/project_observer.rb b/app/models/project_observer.rb deleted file mode 100644 index 135959a..0000000 --- a/app/models/project_observer.rb +++ /dev/null @@ -1,9 +0,0 @@ -class ProjectObserver < ActiveRecord::Observer - def after_save(project) - project.update_repository - end - - def after_destroy(project) - project.destroy_repository - end -end diff --git a/app/models/user_observer.rb b/app/models/user_observer.rb deleted file mode 100644 index d12bcc9..0000000 --- a/app/models/user_observer.rb +++ /dev/null @@ -1,5 +0,0 @@ -class UserObserver < ActiveRecord::Observer - def after_create(user) - Notify.new_user_email(user.id, user.password).deliver - end -end diff --git a/app/observers/activity_observer.rb b/app/observers/activity_observer.rb new file mode 100644 index 0000000..324d820 --- /dev/null +++ b/app/observers/activity_observer.rb @@ -0,0 +1,25 @@ +class ActivityObserver < ActiveRecord::Observer + observe :issue, :merge_request + + def after_create(record) + Event.create( + :project => record.project, + :target_id => record.id, + :target_type => record.class.name, + :action => Event.determine_action(record), + :author_id => record.author_id + ) + end + + def after_save(record) + if record.changed.include?("closed") + Event.create( + :project => record.project, + :target_id => record.id, + :target_type => record.class.name, + :action => (record.closed ? Event::Closed : Event::Reopened), + :author_id => record.author_id_of_changes + ) + end + end +end diff --git a/app/observers/issue_observer.rb b/app/observers/issue_observer.rb new file mode 100644 index 0000000..fadedd3 --- /dev/null +++ b/app/observers/issue_observer.rb @@ -0,0 +1,23 @@ +class IssueObserver < ActiveRecord::Observer + cattr_accessor :current_user + + def after_create(issue) + Notify.new_issue_email(issue.id).deliver if issue.assignee != current_user + end + + def after_update(issue) + send_reassigned_email(issue) if issue.is_being_reassigned? + Note.create_status_change_note(issue, current_user, 'closed') if issue.is_being_closed? + Note.create_status_change_note(issue, current_user, 'reopened') if issue.is_being_reopened? + end + + protected + + def send_reassigned_email(issue) + recipient_ids = [issue.assignee_id, issue.assignee_id_was].keep_if {|id| id != current_user.id } + + recipient_ids.each do |recipient_id| + Notify.reassigned_issue_email(recipient_id, issue.id, issue.assignee_id_was).deliver + end + end +end diff --git a/app/observers/key_observer.rb b/app/observers/key_observer.rb new file mode 100644 index 0000000..fac53a6 --- /dev/null +++ b/app/observers/key_observer.rb @@ -0,0 +1,9 @@ +class KeyObserver < ActiveRecord::Observer + def after_save(key) + key.update_repository + end + + def after_destroy(key) + key.repository_delete_key + end +end diff --git a/app/observers/mailer_observer.rb b/app/observers/mailer_observer.rb new file mode 100644 index 0000000..880fd50 --- /dev/null +++ b/app/observers/mailer_observer.rb @@ -0,0 +1,79 @@ +class MailerObserver < ActiveRecord::Observer + observe :note, :merge_request + cattr_accessor :current_user + + def after_create(model) + new_note(model) if model.kind_of?(Note) + new_merge_request(model) if model.kind_of?(MergeRequest) + end + + def after_update(model) + changed_merge_request(model) if model.kind_of?(MergeRequest) + end + + protected + + def new_note(note) + if note.notify + # Notify whole team except author of note + notify_note(note) + elsif note.notify_author + # Notify only author of resource + Notify.note_commit_email(note.commit_author.id, note.id).deliver + else + # Otherwise ignore it + nil + end + end + + def notify_note note + # reject author of note from mail list + users = note.project.users.reject { |u| u.id == current_user.id } + + users.each do |u| + case note.noteable_type + when "Commit"; Notify.note_commit_email(u.id, note.id).deliver + when "Issue"; Notify.note_issue_email(u.id, note.id).deliver + when "MergeRequest"; Notify.note_merge_request_email(u.id, note.id).deliver + when "Snippet"; true + else + Notify.note_wall_email(u.id, note.id).deliver + end + end + end + + def new_merge_request(merge_request) + if merge_request.assignee != current_user + Notify.new_merge_request_email(merge_request.id).deliver + end + end + + def changed_merge_request(merge_request) + status_notify_and_comment merge_request, :reassigned_merge_request_email + end + + # This method used for Issues & Merge Requests + # + # It create a comment for Issue or MR if someone close/reopen. + # It also notify via email if assignee was changed + # + def status_notify_and_comment target, mail_method + # If assigne changed - notify to recipients + if target.assignee_id_changed? + recipients_ids = target.assignee_id_was, target.assignee_id + recipients_ids.delete current_user.id + + recipients_ids.each do |recipient_id| + Notify.send(mail_method, recipient_id, target.id, target.assignee_id_was).deliver + end + end + + # Create comment about status changed + if target.closed_changed? + note = Note.new(:noteable => target, :project => target.project) + note.author = current_user + note.note = "_Status changed to #{target.closed ? 'closed' : 'reopened'}_" + note.save() + end + end +end diff --git a/app/observers/project_observer.rb b/app/observers/project_observer.rb new file mode 100644 index 0000000..135959a --- /dev/null +++ b/app/observers/project_observer.rb @@ -0,0 +1,9 @@ +class ProjectObserver < ActiveRecord::Observer + def after_save(project) + project.update_repository + end + + def after_destroy(project) + project.destroy_repository + end +end diff --git a/app/observers/user_observer.rb b/app/observers/user_observer.rb new file mode 100644 index 0000000..d12bcc9 --- /dev/null +++ b/app/observers/user_observer.rb @@ -0,0 +1,5 @@ +class UserObserver < ActiveRecord::Observer + def after_create(user) + Notify.new_user_email(user.id, user.password).deliver + end +end -- libgit2 0.21.2