Commit c4699cd6ffc32f63c3c489f54dbbdbaf893b3510
1 parent
b9d996f4
Exists in
master
and in
28 other branches
ActionItem16: merging work done at Recife airport, waiting for the
flight. As usual, keeping the local commits' log messages below so they are referenced in the corresponding items. r751@cabula: terceiro | 2007-10-20 06:50:14 +0000 ActionItem16: making Task optionally send a message to the task target upon task creation r752@cabula: terceiro | 2007-10-20 06:52:54 +0000 ActionItem16: refactoring: extract method of code that handles different types of messages r753@cabula: terceiro | 2007-10-20 07:36:30 +0000 ActionItem16: actually send e-mail r838@cabula: terceiro | 2007-10-21 14:50:35 +0000 ActionItem16: documenting the fact that we need ruby-gettext at least version 1.9.0 r839@cabula: terceiro | 2007-10-21 14:51:25 +0000 ActionItem16: adding test for missing task git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@805 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
7 changed files
with
87 additions
and
7 deletions
Show diff stats
app/models/task.rb
@@ -46,6 +46,11 @@ class Task < ActiveRecord::Base | @@ -46,6 +46,11 @@ class Task < ActiveRecord::Base | ||
46 | 46 | ||
47 | after_create do |task| | 47 | after_create do |task| |
48 | task.send(:send_notification, :created) | 48 | task.send(:send_notification, :created) |
49 | + | ||
50 | + target_msg = task.target_notification_message | ||
51 | + unless target_msg.nil? | ||
52 | + TaskMailer.deliver_target_notification(self, target_msg) | ||
53 | + end | ||
49 | end | 54 | end |
50 | 55 | ||
51 | # this method finished the task. It calls #perform, which must be overriden | 56 | # this method finished the task. It calls #perform, which must be overriden |
@@ -100,6 +105,16 @@ class Task < ActiveRecord::Base | @@ -100,6 +105,16 @@ class Task < ActiveRecord::Base | ||
100 | _("The task was cancelled at %s") % (self.end_date.to_s) | 105 | _("The task was cancelled at %s") % (self.end_date.to_s) |
101 | end | 106 | end |
102 | 107 | ||
108 | + # The message that will be sent to the *target* on the task when it is | ||
109 | + # created. | ||
110 | + # | ||
111 | + # The implementation in this class returns +nil+, what makes the notification | ||
112 | + # not to be sent. If you want to send a notification to the target upon task | ||
113 | + # creation, override this method and return a String. | ||
114 | + def target_notification_message | ||
115 | + nil | ||
116 | + end | ||
117 | + | ||
103 | protected | 118 | protected |
104 | 119 | ||
105 | # This method must be overrided in subclasses, and its implementation must do | 120 | # This method must be overrided in subclasses, and its implementation must do |
app/models/task_mailer.rb
@@ -9,16 +9,33 @@ class TaskMailer < ActionMailer::Base | @@ -9,16 +9,33 @@ class TaskMailer < ActionMailer::Base | ||
9 | end | 9 | end |
10 | end | 10 | end |
11 | 11 | ||
12 | + def target_notification(task, message) | ||
13 | + msg = extract_message(message) | ||
14 | + | ||
15 | + recipients task.target.contact_email | ||
16 | + | ||
17 | + from task.requestor.environment.contact_email | ||
18 | + subject task.description | ||
19 | + body :requestor => task.requestor.name, | ||
20 | + :target => task.target.name, | ||
21 | + :message => msg, | ||
22 | + :environment => task.requestor.environment.name, | ||
23 | + :url => url_for(:host => task.requestor.environment.default_hostname, :controller => 'home') | ||
24 | + end | ||
25 | + | ||
12 | protected | 26 | protected |
13 | 27 | ||
28 | + def extract_message(message) | ||
29 | + if message.kind_of?(Proc) | ||
30 | + self.instance_eval(&message) | ||
31 | + else | ||
32 | + message.to_s | ||
33 | + end | ||
34 | + end | ||
35 | + | ||
14 | def send_message(task, message) | 36 | def send_message(task, message) |
15 | 37 | ||
16 | - text = | ||
17 | - if message.kind_of?(Proc) | ||
18 | - self.instance_eval(&message) | ||
19 | - else | ||
20 | - message | ||
21 | - end | 38 | + text = extract_message(message) |
22 | 39 | ||
23 | recipients task.requestor.email | 40 | recipients task.requestor.email |
24 | from task.requestor.environment.contact_email | 41 | from task.requestor.environment.contact_email |
doc/README_FOR_APP
@@ -11,7 +11,7 @@ You need to have a Subversion client (svn) installed, as well as: | @@ -11,7 +11,7 @@ You need to have a Subversion client (svn) installed, as well as: | ||
11 | 11 | ||
12 | * Ruby: http://www.ruby-lang.org/ | 12 | * Ruby: http://www.ruby-lang.org/ |
13 | * Rake: http://rake.rubyforge.org/ | 13 | * Rake: http://rake.rubyforge.org/ |
14 | -* Ruby-GetText: http://www.yotabanana.com/hiki/ruby-gettext.html?ruby-gettext | 14 | +* Ruby-GetText: http://www.yotabanana.com/hiki/ruby-gettext.html?ruby-gettext (at least version 1.9.0) |
15 | * Mocha: http://mocha.rubyforge.org/ | 15 | * Mocha: http://mocha.rubyforge.org/ |
16 | * Ruby-sqlite3: http://rubyforge.org/projects/sqlite-ruby | 16 | * Ruby-sqlite3: http://rubyforge.org/projects/sqlite-ruby |
17 | * rcov: http://eigenclass.org/hiki/rcov | 17 | * rcov: http://eigenclass.org/hiki/rcov |
test/unit/profile_test.rb
@@ -144,6 +144,10 @@ class ProfileTest < Test::Unit::TestCase | @@ -144,6 +144,10 @@ class ProfileTest < Test::Unit::TestCase | ||
144 | assert_equal doc1.id, docs.first.id | 144 | assert_equal doc1.id, docs.first.id |
145 | end | 145 | end |
146 | 146 | ||
147 | + should 'provide a contact_email method which returns a ... contact email address' do | ||
148 | + flunk 'not implemented yet' | ||
149 | + end | ||
150 | + | ||
147 | private | 151 | private |
148 | 152 | ||
149 | def assert_invalid_identifier(id) | 153 | def assert_invalid_identifier(id) |
test/unit/task_mailer_test.rb
@@ -80,6 +80,29 @@ class TaskMailerTest < Test::Unit::TestCase | @@ -80,6 +80,29 @@ class TaskMailerTest < Test::Unit::TestCase | ||
80 | TaskMailer.deliver_task_created(task) | 80 | TaskMailer.deliver_task_created(task) |
81 | end | 81 | end |
82 | 82 | ||
83 | + should 'be able to send a "target notification" message' do | ||
84 | + task = Task.new | ||
85 | + task.expects(:description).returns('the task') | ||
86 | + | ||
87 | + requestor = mock() | ||
88 | + requestor.expects(:name).returns('my name') | ||
89 | + | ||
90 | + target = mock() | ||
91 | + target.expects(:contact_email).returns('target@example.com') | ||
92 | + target.expects(:name).returns('Target') | ||
93 | + | ||
94 | + environment = mock() | ||
95 | + environment.expects(:contact_email).returns('sender@example.com') | ||
96 | + environment.expects(:default_hostname).returns('example.com') | ||
97 | + environment.expects(:name).returns('example') | ||
98 | + | ||
99 | + task.expects(:requestor).returns(requestor).at_least_once | ||
100 | + task.expects(:target).returns(target).at_least_once | ||
101 | + requestor.expects(:environment).returns(environment).at_least_once | ||
102 | + | ||
103 | + TaskMailer.deliver_target_notification(task, 'the message') | ||
104 | + end | ||
105 | + | ||
83 | 106 | ||
84 | private | 107 | private |
85 | def read_fixture(action) | 108 | def read_fixture(action) |
test/unit/task_test.rb
@@ -135,6 +135,20 @@ class TaskTest < Test::Unit::TestCase | @@ -135,6 +135,20 @@ class TaskTest < Test::Unit::TestCase | ||
135 | assert_not_nil Task.find_by_code(task.code) | 135 | assert_not_nil Task.find_by_code(task.code) |
136 | end | 136 | end |
137 | 137 | ||
138 | + should 'not send notification to target when target_notification_message is nil (as in Task base class)' do | ||
139 | + task = Task.new | ||
140 | + TaskMailer.expects(:deliver_target_notification).never | ||
141 | + task.save! | ||
142 | + assert_nil task.target_notification_message | ||
143 | + end | ||
144 | + | ||
145 | + should 'send notification to target just after task creation' do | ||
146 | + task = Task.new | ||
147 | + task.stubs(:target_notification_message).returns('some non nil message to be sent to target') | ||
148 | + TaskMailer.expects(:deliver_target_notification).once | ||
149 | + task.save! | ||
150 | + end | ||
151 | + | ||
138 | protected | 152 | protected |
139 | 153 | ||
140 | def sample_user | 154 | def sample_user |