Commit ec22524b445e88e7574daf191f0ebfb142d6d3a5
1 parent
35366ee7
Exists in
master
and in
29 other branches
ActionItem14: modularizing notification sending to check for an existing
requestor. Also extended the system to allow other types of notification just by defining a message with the proper name git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@685 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
4 changed files
with
53 additions
and
32 deletions
Show diff stats
app/models/task.rb
| ... | ... | @@ -45,7 +45,7 @@ class Task < ActiveRecord::Base |
| 45 | 45 | end |
| 46 | 46 | |
| 47 | 47 | after_create do |task| |
| 48 | - TaskMailer.deliver_task_created(task) | |
| 48 | + task.send(:send_notification, :created) | |
| 49 | 49 | end |
| 50 | 50 | |
| 51 | 51 | # this method finished the task. It calls #perform, which must be overriden |
| ... | ... | @@ -57,7 +57,7 @@ class Task < ActiveRecord::Base |
| 57 | 57 | self.end_date = Time.now |
| 58 | 58 | self.save! |
| 59 | 59 | self.perform |
| 60 | - TaskMailer.deliver_task_finished(self) | |
| 60 | + send_notification(:finished) | |
| 61 | 61 | end |
| 62 | 62 | end |
| 63 | 63 | |
| ... | ... | @@ -68,36 +68,38 @@ class Task < ActiveRecord::Base |
| 68 | 68 | self.status = Task::Status::CANCELLED |
| 69 | 69 | self.end_date = Time.now |
| 70 | 70 | self.save! |
| 71 | - TaskMailer.deliver_task_cancelled(self) | |
| 71 | + send_notification(:cancelled) | |
| 72 | 72 | end |
| 73 | 73 | end |
| 74 | 74 | |
| 75 | + | |
| 76 | + # Returns the description of the task. | |
| 77 | + # | |
| 78 | + # This method +must+ be overriden in subclasses to return something | |
| 79 | + # meaningful for each kind of task | |
| 80 | + def description | |
| 81 | + _('Generic task') | |
| 82 | + end | |
| 83 | + | |
| 75 | 84 | # The message that will be sent to the requestor of the task when the task is |
| 76 | 85 | # created. |
| 77 | - def create_message | |
| 86 | + def task_created_message | |
| 87 | + # FIXME: use a date properly recorded. | |
| 78 | 88 | _("The task was created at %s") % Time.now |
| 79 | 89 | end |
| 80 | 90 | |
| 81 | 91 | # The message that will be sent to the requestor of the task when its |
| 82 | 92 | # finished. |
| 83 | - def finish_message | |
| 93 | + def task_finished_message | |
| 84 | 94 | _("The task was finished at %s") % (self.end_date.to_s) |
| 85 | 95 | end |
| 86 | 96 | |
| 87 | 97 | # The message that will be sent to the requestor of the task when its |
| 88 | 98 | # cancelled. |
| 89 | - def cancel_message | |
| 99 | + def task_cancelled_message | |
| 90 | 100 | _("The task was cancelled at %s") % (self.end_date.to_s) |
| 91 | 101 | end |
| 92 | 102 | |
| 93 | - # Returns the description of the task. | |
| 94 | - # | |
| 95 | - # This method +must+ be overriden in subclasses to return something | |
| 96 | - # meaningful for each kind of task | |
| 97 | - def description | |
| 98 | - _('Generic task') | |
| 99 | - end | |
| 100 | - | |
| 101 | 103 | protected |
| 102 | 104 | |
| 103 | 105 | # This method must be overrided in subclasses, and its implementation must do |
| ... | ... | @@ -110,6 +112,11 @@ class Task < ActiveRecord::Base |
| 110 | 112 | def perform |
| 111 | 113 | end |
| 112 | 114 | |
| 115 | + # sends notification e-mail about a task, if the task has a requestor. | |
| 116 | + def send_notification(action) | |
| 117 | + TaskMailer.send("deliver_task_#{action}", self) if self.requestor | |
| 118 | + end | |
| 119 | + | |
| 113 | 120 | class << self |
| 114 | 121 | |
| 115 | 122 | # generates a random code string consisting of 36 characters in the ranges | ... | ... |
app/models/task_mailer.rb
| 1 | 1 | class TaskMailer < ActionMailer::Base |
| 2 | 2 | |
| 3 | - def task_finished(task) | |
| 4 | - send_message(task, task.finish_message) | |
| 5 | - end | |
| 6 | - | |
| 7 | - def task_created(task) | |
| 8 | - send_message(task, task.create_message) | |
| 9 | - end | |
| 10 | - | |
| 11 | - def task_cancelled(task) | |
| 12 | - send_message(task, task.cancel_message) | |
| 3 | + def method_missing(name, *args) | |
| 4 | + task = args.shift | |
| 5 | + if task.kind_of?(Task) && task.respond_to?("#{name}_message") | |
| 6 | + send_message(task, task.send("#{name}_message"), *args) | |
| 7 | + else | |
| 8 | + super | |
| 9 | + end | |
| 13 | 10 | end |
| 14 | 11 | |
| 15 | 12 | protected | ... | ... |
test/unit/task_mailer_test.rb
| ... | ... | @@ -18,8 +18,8 @@ class TaskMailerTest < Test::Unit::TestCase |
| 18 | 18 | |
| 19 | 19 | should 'be able to send a "task finished" message' do |
| 20 | 20 | |
| 21 | - task = mock() | |
| 22 | - task.expects(:finish_message).returns('the message') | |
| 21 | + task = Task.new | |
| 22 | + task.expects(:task_finished_message).returns('the message') | |
| 23 | 23 | task.expects(:description).returns('the task') |
| 24 | 24 | |
| 25 | 25 | requestor = mock() |
| ... | ... | @@ -39,8 +39,8 @@ class TaskMailerTest < Test::Unit::TestCase |
| 39 | 39 | |
| 40 | 40 | should 'be able to send a "task cancelled" message' do |
| 41 | 41 | |
| 42 | - task = mock() | |
| 43 | - task.expects(:cancel_message).returns('the message') | |
| 42 | + task = Task.new | |
| 43 | + task.expects(:task_cancelled_message).returns('the message') | |
| 44 | 44 | task.expects(:description).returns('the task') |
| 45 | 45 | |
| 46 | 46 | requestor = mock() |
| ... | ... | @@ -60,8 +60,9 @@ class TaskMailerTest < Test::Unit::TestCase |
| 60 | 60 | |
| 61 | 61 | should 'be able to send a "task created" message' do |
| 62 | 62 | |
| 63 | - task = mock() | |
| 64 | - task.expects(:create_message).returns('the message') | |
| 63 | + task = Task.new | |
| 64 | + | |
| 65 | + task.expects(:task_created_message).returns('the message') | |
| 65 | 66 | task.expects(:description).returns('the task') |
| 66 | 67 | |
| 67 | 68 | requestor = mock() | ... | ... |
test/unit/task_test.rb
| ... | ... | @@ -33,6 +33,7 @@ class TaskTest < Test::Unit::TestCase |
| 33 | 33 | def test_should_call_perform_in_finish |
| 34 | 34 | TaskMailer.expects(:deliver_task_finished) |
| 35 | 35 | t = Task.create |
| 36 | + t.requestor = sample_user | |
| 36 | 37 | t.expects(:perform) |
| 37 | 38 | t.finish |
| 38 | 39 | assert_equal Task::Status::FINISHED, t.status |
| ... | ... | @@ -41,6 +42,7 @@ class TaskTest < Test::Unit::TestCase |
| 41 | 42 | def test_should_have_cancelled_status_after_cancel |
| 42 | 43 | TaskMailer.expects(:deliver_task_cancelled) |
| 43 | 44 | t = Task.create |
| 45 | + t.requestor = sample_user | |
| 44 | 46 | t.cancel |
| 45 | 47 | assert_equal Task::Status::CANCELLED, t.status |
| 46 | 48 | end |
| ... | ... | @@ -52,13 +54,19 @@ class TaskTest < Test::Unit::TestCase |
| 52 | 54 | |
| 53 | 55 | def test_should_notify_finish |
| 54 | 56 | t = Task.create |
| 57 | + t.requestor = sample_user | |
| 58 | + | |
| 55 | 59 | TaskMailer.expects(:deliver_task_finished).with(t) |
| 60 | + | |
| 56 | 61 | t.finish |
| 57 | 62 | end |
| 58 | 63 | |
| 59 | 64 | def test_should_notify_cancel |
| 60 | 65 | t = Task.create |
| 66 | + t.requestor = sample_user | |
| 67 | + | |
| 61 | 68 | TaskMailer.expects(:deliver_task_cancelled).with(t) |
| 69 | + | |
| 62 | 70 | t.cancel |
| 63 | 71 | end |
| 64 | 72 | |
| ... | ... | @@ -84,6 +92,8 @@ class TaskTest < Test::Unit::TestCase |
| 84 | 92 | |
| 85 | 93 | should 'notify just after the task is created' do |
| 86 | 94 | task = Task.new |
| 95 | + task.requestor = sample_user | |
| 96 | + | |
| 87 | 97 | TaskMailer.expects(:deliver_task_created).with(task) |
| 88 | 98 | task.save! |
| 89 | 99 | end |
| ... | ... | @@ -109,7 +119,7 @@ class TaskTest < Test::Unit::TestCase |
| 109 | 119 | |
| 110 | 120 | should 'find only in active tasks' do |
| 111 | 121 | task = Task.new |
| 112 | - task.requestor = User.create(:login => 'testfindinactivetask', :password => 'test', :password_confirmation => 'test', :email => 'testfindinactivetask@localhost.localdomain').person | |
| 122 | + task.requestor = sample_user | |
| 113 | 123 | task.save! |
| 114 | 124 | |
| 115 | 125 | task.cancel |
| ... | ... | @@ -119,10 +129,16 @@ class TaskTest < Test::Unit::TestCase |
| 119 | 129 | |
| 120 | 130 | should 'be able to find active tasks ' do |
| 121 | 131 | task = Task.new |
| 122 | - task.requestor = User.create(:login => 'testfindinactivetask', :password => 'test', :password_confirmation => 'test', :email => 'testfindinactivetask@localhost.localdomain').person | |
| 132 | + task.requestor = sample_user | |
| 123 | 133 | task.save! |
| 124 | 134 | |
| 125 | 135 | assert_not_nil Task.find_by_code(task.code) |
| 126 | 136 | end |
| 127 | 137 | |
| 138 | + protected | |
| 139 | + | |
| 140 | + def sample_user | |
| 141 | + User.create(:login => 'testfindinactivetask', :password => 'test', :password_confirmation => 'test', :email => 'testfindinactivetask@localhost.localdomain').person | |
| 142 | + end | |
| 143 | + | |
| 128 | 144 | end | ... | ... |