Commit fc9326eed40b0e1c0c6efaf3a6dfe24a047c53a2
1 parent
ba00654d
Exists in
theme-brasil-digital-from-staging
and in
9 other branches
Send activation code with email template
Showing
7 changed files
with
85 additions
and
2 deletions
Show diff stats
... | ... | @@ -0,0 +1,9 @@ |
1 | +module EmailTemplateHelper | |
2 | + | |
3 | + def mail_with_template(params={}) | |
4 | + params[:body] = params[:email_template].present? ? params[:email_template].parsed_body(params[:template_params]) : params[:body] | |
5 | + params[:subject] = params[:email_template].present? ? params[:email_template].parsed_subject(params[:template_params]) : params[:subject] | |
6 | + mail(params.except(:email_template)) | |
7 | + end | |
8 | + | |
9 | +end | ... | ... |
app/mailers/user_mailer.rb
1 | 1 | class UserMailer < ActionMailer::Base |
2 | + | |
3 | + include EmailTemplateHelper | |
4 | + | |
2 | 5 | def activation_email_notify(user) |
3 | 6 | user_email = "#{user.login}@#{user.email_domain}" |
4 | 7 | @name = user.name |
... | ... | @@ -22,10 +25,12 @@ class UserMailer < ActionMailer::Base |
22 | 25 | @redirection = (true if user.return_to) |
23 | 26 | @join = (user.community_to_join if user.community_to_join) |
24 | 27 | |
25 | - mail( | |
28 | + mail_with_template( | |
26 | 29 | from: "#{user.environment.name} <#{user.environment.contact_email}>", |
27 | 30 | to: user.email, |
28 | 31 | subject: _("[%s] Activate your account") % [user.environment.name], |
32 | + template_params: {:environment => user.environment, :activation_code => @activation_code, :redirection => @redirection, :join => @join}, | |
33 | + email_template: user.environment.email_templates.find_by_template_type(:user_activation), | |
29 | 34 | ) |
30 | 35 | end |
31 | 36 | ... | ... |
app/models/email_template.rb
... | ... | @@ -6,6 +6,10 @@ class EmailTemplate < ActiveRecord::Base |
6 | 6 | |
7 | 7 | validates_presence_of :name |
8 | 8 | |
9 | + validates :name, uniqueness: { scope: [:owner_type, :owner_id] } | |
10 | + | |
11 | + validates :template_type, uniqueness: { scope: [:owner_type, :owner_id] }, if: :unique_by_type? | |
12 | + | |
9 | 13 | def parsed_body(params) |
10 | 14 | @parsed_body ||= parse(body, params) |
11 | 15 | end |
... | ... | @@ -18,10 +22,15 @@ class EmailTemplate < ActiveRecord::Base |
18 | 22 | HashWithIndifferentAccess.new ({ |
19 | 23 | :task_rejection => {:description => _('Task Rejection')}, |
20 | 24 | :task_acceptance => {:description => _('Task Acceptance')}, |
21 | - :organization_members => {:description => _('Organization Members')} | |
25 | + :organization_members => {:description => _('Organization Members')}, | |
26 | + :user_activation => {:description => _('User Activation'), :unique => true} | |
22 | 27 | }) |
23 | 28 | end |
24 | 29 | |
30 | + def unique_by_type? | |
31 | + available_types.fetch(template_type, {})[:unique] | |
32 | + end | |
33 | + | |
25 | 34 | protected |
26 | 35 | |
27 | 36 | def parse(source, params) | ... | ... |
app/models/environment.rb
... | ... | @@ -21,6 +21,7 @@ class Environment < ActiveRecord::Base |
21 | 21 | |
22 | 22 | has_many :tasks, :dependent => :destroy, :as => 'target' |
23 | 23 | has_many :search_terms, :as => :context |
24 | + has_many :email_templates, :foreign_key => :owner_id | |
24 | 25 | |
25 | 26 | IDENTIFY_SCRIPTS = /(php[0-9s]?|[sp]htm[l]?|pl|py|cgi|rb)/ |
26 | 27 | ... | ... |
... | ... | @@ -0,0 +1,20 @@ |
1 | +require_relative "../test_helper" | |
2 | + | |
3 | +class EmailTemplateHelperTest < ActionView::TestCase | |
4 | + | |
5 | + should 'replace body and subject with parsed values from template' do | |
6 | + template = mock | |
7 | + template.expects(:parsed_body).returns('parsed body') | |
8 | + template.expects(:parsed_subject).returns('parsed subject') | |
9 | + params = {:subject => 'subject', :body => 'body', :email_template => template} | |
10 | + expects(:mail).with({:subject => 'parsed subject', :body => 'parsed body'}) | |
11 | + mail_with_template(params) | |
12 | + end | |
13 | + | |
14 | + should 'do not change params if there is no email template' do | |
15 | + params = {:subject => 'subject', :body => 'body'} | |
16 | + expects(:mail).with(params) | |
17 | + mail_with_template(params) | |
18 | + end | |
19 | + | |
20 | +end | ... | ... |
test/unit/email_template_test.rb
... | ... | @@ -19,4 +19,25 @@ class EmailTemplateTest < ActiveSupport::TestCase |
19 | 19 | assert_equal 'Hi John', template.parsed_subject({:person => 'John'}) |
20 | 20 | end |
21 | 21 | |
22 | + should 'not create template with the same name of other' do | |
23 | + template1 = EmailTemplate.new(:template_type => :type1, :name => 'template') | |
24 | + template2 = EmailTemplate.new(:template_type => :type1, :name => 'template') | |
25 | + assert template1.save | |
26 | + assert !template2.save | |
27 | + end | |
28 | + | |
29 | + should 'not create duplicated template when template type is unique' do | |
30 | + template1 = EmailTemplate.new(:template_type => :user_activation, :name => 'template1') | |
31 | + template2 = EmailTemplate.new(:template_type => :user_activation, :name => 'template2') | |
32 | + assert template1.save | |
33 | + assert !template2.save | |
34 | + end | |
35 | + | |
36 | + should 'create duplicated template when template type is not unique' do | |
37 | + template1 = EmailTemplate.new(:template_type => :task_rejection, :name => 'template1') | |
38 | + template2 = EmailTemplate.new(:template_type => :task_rejection, :name => 'template2') | |
39 | + assert template1.save | |
40 | + assert template2.save | |
41 | + end | |
42 | + | |
22 | 43 | end | ... | ... |
test/unit/user_mailer_test.rb
... | ... | @@ -26,6 +26,24 @@ fast_create(Person)) |
26 | 26 | assert_match /profile\/some-user\/friends\/suggest/, email.body.to_s |
27 | 27 | end |
28 | 28 | |
29 | + should 'deliver activation code email' do | |
30 | + assert_difference 'ActionMailer::Base.deliveries.size' do | |
31 | + u = create_user('some-user') | |
32 | + UserMailer.activation_code(u).deliver | |
33 | + end | |
34 | + end | |
35 | + | |
36 | + should 'deliver activation code email with template' do | |
37 | + EmailTemplate.create!(:template_type => :user_activation, :name => 'template1', :subject => 'activation template subject', :body => 'activation template body', :owner => Environment.default) | |
38 | + assert_difference 'ActionMailer::Base.deliveries.size' do | |
39 | + u = create_user('some-user') | |
40 | + UserMailer.activation_code(u).deliver | |
41 | + end | |
42 | + mail = ActionMailer::Base.deliveries.last | |
43 | + assert_equal 'activation template subject', mail.subject.to_s | |
44 | + assert_equal 'activation template body', mail.body.to_s | |
45 | + end | |
46 | + | |
29 | 47 | private |
30 | 48 | |
31 | 49 | def read_fixture(action) | ... | ... |