Commit 7713f7fefb4601b7ddede29d61fbf80e2b2929b8
1 parent
f7859ec1
Exists in
master
and in
4 other branches
Notification refactoring
Showing
7 changed files
with
55 additions
and
28 deletions
Show diff stats
app/controllers/admin/users_controller.rb
| ... | ... | @@ -27,7 +27,6 @@ class Admin::UsersController < ApplicationController |
| 27 | 27 | |
| 28 | 28 | respond_to do |format| |
| 29 | 29 | if @admin_user.save |
| 30 | - Notify.new_user_email(@admin_user, params[:user][:password]).deliver | |
| 31 | 30 | format.html { redirect_to [:admin, @admin_user], notice: 'User was successfully created.' } |
| 32 | 31 | format.json { render json: @admin_user, status: :created, location: @admin_user } |
| 33 | 32 | else | ... | ... |
app/controllers/application_controller.rb
| 1 | 1 | class ApplicationController < ActionController::Base |
| 2 | 2 | before_filter :authenticate_user! |
| 3 | + before_filter :set_current_user_for_mailer | |
| 3 | 4 | protect_from_forgery |
| 4 | 5 | helper_method :abilities, :can? |
| 5 | 6 | |
| ... | ... | @@ -19,6 +20,10 @@ class ApplicationController < ActionController::Base |
| 19 | 20 | end |
| 20 | 21 | end |
| 21 | 22 | |
| 23 | + def set_current_user_for_mailer | |
| 24 | + MailerObserver.current_user = current_user | |
| 25 | + end | |
| 26 | + | |
| 22 | 27 | def abilities |
| 23 | 28 | @abilities ||= Six.new |
| 24 | 29 | end | ... | ... |
app/controllers/issues_controller.rb
| ... | ... | @@ -67,10 +67,7 @@ class IssuesController < ApplicationController |
| 67 | 67 | def create |
| 68 | 68 | @issue = @project.issues.new(params[:issue]) |
| 69 | 69 | @issue.author = current_user |
| 70 | - | |
| 71 | - if @issue.save && @issue.assignee != current_user | |
| 72 | - Notify.new_issue_email(@issue).deliver | |
| 73 | - end | |
| 70 | + @issue.save | |
| 74 | 71 | |
| 75 | 72 | respond_with(@issue) |
| 76 | 73 | end | ... | ... |
app/controllers/notes_controller.rb
| ... | ... | @@ -12,10 +12,8 @@ class NotesController < ApplicationController |
| 12 | 12 | def create |
| 13 | 13 | @note = @project.notes.new(params[:note]) |
| 14 | 14 | @note.author = current_user |
| 15 | - | |
| 16 | - if @note.save | |
| 17 | - notify if params[:notify] == '1' | |
| 18 | - end | |
| 15 | + @note.notify = true if params[:notify] == '1' | |
| 16 | + @note.save | |
| 19 | 17 | |
| 20 | 18 | respond_to do |format| |
| 21 | 19 | format.html {redirect_to :back} |
| ... | ... | @@ -35,22 +33,4 @@ class NotesController < ApplicationController |
| 35 | 33 | end |
| 36 | 34 | end |
| 37 | 35 | |
| 38 | - protected | |
| 39 | - | |
| 40 | - def notify | |
| 41 | - @project.users.reject { |u| u.id == current_user.id } .each do |u| | |
| 42 | - case @note.noteable_type | |
| 43 | - when "Commit" then | |
| 44 | - Notify.note_commit_email(u, @note).deliver | |
| 45 | - when "Issue" then | |
| 46 | - Notify.note_issue_email(u, @note).deliver | |
| 47 | - when "MergeRequest" | |
| 48 | - true # someone should write email notification | |
| 49 | - when "Snippet" | |
| 50 | - true | |
| 51 | - else | |
| 52 | - Notify.note_wall_email(u, @note).deliver | |
| 53 | - end | |
| 54 | - end | |
| 55 | - end | |
| 56 | 36 | end | ... | ... |
| ... | ... | @@ -0,0 +1,41 @@ |
| 1 | +class MailerObserver < ActiveRecord::Observer | |
| 2 | + observe :issue, :user, :note, :snippet | |
| 3 | + cattr_accessor :current_user | |
| 4 | + | |
| 5 | + def after_create(model) | |
| 6 | + new_issue(model) if model.kind_of?(Issue) | |
| 7 | + new_user(model) if model.kind_of?(User) | |
| 8 | + new_note(model) if model.kind_of?(Note) | |
| 9 | + end | |
| 10 | + | |
| 11 | + protected | |
| 12 | + | |
| 13 | + def new_issue(issue) | |
| 14 | + if issue.assignee != current_user | |
| 15 | + Notify.new_issue_email(issue).deliver | |
| 16 | + end | |
| 17 | + end | |
| 18 | + | |
| 19 | + def new_user(user) | |
| 20 | + Notify.new_user_email(user, user.password).deliver | |
| 21 | + end | |
| 22 | + | |
| 23 | + def new_note(note) | |
| 24 | + return unless note.notify | |
| 25 | + note.project.users.reject { |u| u.id == current_user.id } .each do |u| | |
| 26 | + case note.noteable_type | |
| 27 | + when "Commit" then | |
| 28 | + Notify.note_commit_email(u, note).deliver | |
| 29 | + when "Issue" then | |
| 30 | + Notify.note_issue_email(u, note).deliver | |
| 31 | + when "MergeRequest" | |
| 32 | + true # someone should write email notification | |
| 33 | + when "Snippet" | |
| 34 | + true | |
| 35 | + else | |
| 36 | + Notify.note_wall_email(u, note).deliver | |
| 37 | + end | |
| 38 | + end | |
| 39 | + end | |
| 40 | + | |
| 41 | +end | ... | ... |
app/models/note.rb
| ... | ... | @@ -13,6 +13,7 @@ class Note < ActiveRecord::Base |
| 13 | 13 | :prefix => true |
| 14 | 14 | |
| 15 | 15 | attr_protected :author, :author_id |
| 16 | + attr_accessor :notify | |
| 16 | 17 | |
| 17 | 18 | validates_presence_of :project |
| 18 | 19 | |
| ... | ... | @@ -35,6 +36,10 @@ class Note < ActiveRecord::Base |
| 35 | 36 | scope :inc_author, includes(:author) |
| 36 | 37 | |
| 37 | 38 | mount_uploader :attachment, AttachmentUploader |
| 39 | + | |
| 40 | + def notify | |
| 41 | + @notify ||= false | |
| 42 | + end | |
| 38 | 43 | end |
| 39 | 44 | # == Schema Information |
| 40 | 45 | # | ... | ... |
config/application.rb
| ... | ... | @@ -23,7 +23,7 @@ module Gitlab |
| 23 | 23 | # config.plugins = [ :exception_notification, :ssl_requirement, :all ] |
| 24 | 24 | |
| 25 | 25 | # Activate observers that should always be running. |
| 26 | - # config.active_record.observers = :cacher, :garbage_collector, :forum_observer | |
| 26 | + config.active_record.observers = :mailer_observer | |
| 27 | 27 | |
| 28 | 28 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. |
| 29 | 29 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. | ... | ... |