Commit 933d37711a7b49d2cef28bfac618f1922c546031
Exists in
theme-brasil-digital-from-staging
and in
9 other branches
Merge branch 'email_template' into production
Conflicts: app/models/article.rb test/functional/tasks_controller_test.rb
Showing
11 changed files
with
117 additions
and
11 deletions
Show diff stats
app/controllers/my_profile/tasks_controller.rb
@@ -4,7 +4,8 @@ class TasksController < MyProfileController | @@ -4,7 +4,8 @@ class TasksController < MyProfileController | ||
4 | protect :perform_task, :profile, :except => [:index, :save_tags, :search_tags] | 4 | protect :perform_task, :profile, :except => [:index, :save_tags, :search_tags] |
5 | 5 | ||
6 | def index | 6 | def index |
7 | - @email_templates = profile.email_templates.find_all_by_template_type(:task_rejection) | 7 | + @rejection_email_templates = profile.email_templates.find_all_by_template_type(:task_rejection) |
8 | + @acceptance_email_templates = profile.email_templates.find_all_by_template_type(:task_acceptance) | ||
8 | 9 | ||
9 | @filter_type = params[:filter_type].presence | 10 | @filter_type = params[:filter_type].presence |
10 | @filter_text = params[:filter_text].presence | 11 | @filter_text = params[:filter_text].presence |
app/helpers/application_helper.rb
@@ -44,6 +44,8 @@ module ApplicationHelper | @@ -44,6 +44,8 @@ module ApplicationHelper | ||
44 | 44 | ||
45 | include PluginsHelper | 45 | include PluginsHelper |
46 | 46 | ||
47 | + include TaskHelper | ||
48 | + | ||
47 | def locale | 49 | def locale |
48 | (@page && !@page.language.blank?) ? @page.language : FastGettext.locale | 50 | (@page && !@page.language.blank?) ? @page.language : FastGettext.locale |
49 | end | 51 | end |
@@ -0,0 +1,13 @@ | @@ -0,0 +1,13 @@ | ||
1 | +module TaskHelper | ||
2 | + | ||
3 | + def task_email_template(description, email_templates, task) | ||
4 | + return '' unless email_templates.present? | ||
5 | + | ||
6 | + content_tag( | ||
7 | + :div, | ||
8 | + labelled_form_field(description, select_tag("tasks[#{task.id}][task][email_template_id]", options_from_collection_for_select(email_templates, :id, :name), :include_blank => true, 'data-url' => url_for(:controller => 'email_templates', :action => 'show_parsed', :profile => profile.identifier))), | ||
9 | + :class => 'template-selection' | ||
10 | + ) | ||
11 | + end | ||
12 | + | ||
13 | +end |
app/models/article.rb
@@ -821,6 +821,10 @@ class Article < ActiveRecord::Base | @@ -821,6 +821,10 @@ class Article < ActiveRecord::Base | ||
821 | "content_viewer/view_page" | 821 | "content_viewer/view_page" |
822 | end | 822 | end |
823 | 823 | ||
824 | + def to_liquid | ||
825 | + HashWithIndifferentAccess.new :name => name, :abstract => abstract, :body => body, :id => id, :parent_id => parent_id, :author => author | ||
826 | + end | ||
827 | + | ||
824 | private | 828 | private |
825 | 829 | ||
826 | def sanitize_tag_list | 830 | def sanitize_tag_list |
app/models/email_template.rb
@@ -17,6 +17,7 @@ class EmailTemplate < ActiveRecord::Base | @@ -17,6 +17,7 @@ class EmailTemplate < ActiveRecord::Base | ||
17 | def available_types | 17 | def available_types |
18 | HashWithIndifferentAccess.new ({ | 18 | HashWithIndifferentAccess.new ({ |
19 | :task_rejection => {:description => _('Task Rejection')}, | 19 | :task_rejection => {:description => _('Task Rejection')}, |
20 | + :task_acceptance => {:description => _('Task Acceptance')}, | ||
20 | :organization_members => {:description => _('Organization Members')} | 21 | :organization_members => {:description => _('Organization Members')} |
21 | }) | 22 | }) |
22 | end | 23 | end |
app/views/tasks/_task.html.erb
@@ -52,12 +52,14 @@ | @@ -52,12 +52,14 @@ | ||
52 | <%= fields_for "tasks[#{task.id}][task]", task do |f| %> | 52 | <%= fields_for "tasks[#{task.id}][task]", task do |f| %> |
53 | <% if task.accept_details %> | 53 | <% if task.accept_details %> |
54 | <div id="on-accept-information-<%=task.id%>" style="display: none"> | 54 | <div id="on-accept-information-<%=task.id%>" style="display: none"> |
55 | + <%= task_email_template(_('Select an acceptance email template:'), @acceptance_email_templates, task) %> | ||
55 | <%= render :partial => partial_for_class(task.class, nil, :accept_details), :locals => {:task => task, :f => f} %> | 56 | <%= render :partial => partial_for_class(task.class, nil, :accept_details), :locals => {:task => task, :f => f} %> |
56 | </div> | 57 | </div> |
57 | <% end %> | 58 | <% end %> |
58 | 59 | ||
59 | <% if task.reject_details %> | 60 | <% if task.reject_details %> |
60 | <div id="on-reject-information-<%=task.id%>" style="display: none"> | 61 | <div id="on-reject-information-<%=task.id%>" style="display: none"> |
62 | + <%= task_email_template(_('Select a rejection email template:'), @rejection_email_templates, task) %> | ||
61 | <%= render :partial => partial_for_class(task.class, nil, :reject_details), :locals => {:task => task, :f => f} %> | 63 | <%= render :partial => partial_for_class(task.class, nil, :reject_details), :locals => {:task => task, :f => f} %> |
62 | </div> | 64 | </div> |
63 | <% end %> | 65 | <% end %> |
app/views/tasks/_task_reject_details.html.erb
1 | -<% if @email_templates.present? %> | ||
2 | - <div class="template-selection"> | ||
3 | - <%= labelled_form_field(_('Select a rejection email template:'), select_tag("tasks[#{task.id}][task][email_template_id]", options_from_collection_for_select(@email_templates, :id, :name), :include_blank => true, 'data-url' => url_for(:controller => 'email_templates', :action => 'show_parsed'))) %> | ||
4 | - </div> | ||
5 | -<% end %> | ||
6 | - | ||
7 | <%= labelled_form_field(_('Rejection explanation'), f.text_area(:reject_explanation, :rows => 5)) %> | 1 | <%= labelled_form_field(_('Rejection explanation'), f.text_area(:reject_explanation, :rows => 5)) %> |
public/javascripts/tasks.js
@@ -106,16 +106,28 @@ | @@ -106,16 +106,28 @@ | ||
106 | 106 | ||
107 | $("input.task_accept_radio").click(function(){ | 107 | $("input.task_accept_radio").click(function(){ |
108 | task_id = this.getAttribute("task_id"); | 108 | task_id = this.getAttribute("task_id"); |
109 | - $('#on-accept-information-' + task_id).show('fast'); | ||
110 | - $('#on-reject-information-' + task_id).hide('fast'); | 109 | + var accept_container = $('#on-accept-information-' + task_id); |
110 | + var reject_container = $('#on-reject-information-' + task_id); | ||
111 | + | ||
112 | + accept_container.show('fast'); | ||
113 | + reject_container.hide('fast'); | ||
111 | $('#on-skip-information-' + task_id).hide('fast'); | 114 | $('#on-skip-information-' + task_id).hide('fast'); |
115 | + | ||
116 | + reject_container.find('input, select').prop('disabled', true); | ||
117 | + accept_container.find('input, select').prop('disabled', false); | ||
112 | }) | 118 | }) |
113 | 119 | ||
114 | $("input.task_reject_radio").click(function(){ | 120 | $("input.task_reject_radio").click(function(){ |
115 | task_id = this.getAttribute("task_id"); | 121 | task_id = this.getAttribute("task_id"); |
116 | - $('#on-accept-information-' + task_id).hide('fast'); | ||
117 | - $('#on-reject-information-' + task_id).show('fast'); | 122 | + var accept_container = $('#on-accept-information-' + task_id); |
123 | + var reject_container = $('#on-reject-information-' + task_id); | ||
124 | + | ||
125 | + accept_container.hide('fast'); | ||
126 | + reject_container.show('fast'); | ||
118 | $('#on-skip-information-' + task_id).hide('fast'); | 127 | $('#on-skip-information-' + task_id).hide('fast'); |
128 | + | ||
129 | + reject_container.find('input, select').prop('disabled', false); | ||
130 | + accept_container.find('input, select').prop('disabled', true); | ||
119 | }) | 131 | }) |
120 | 132 | ||
121 | $("input.task_skip_radio").click(function(){ | 133 | $("input.task_skip_radio").click(function(){ |
test/functional/tasks_controller_test.rb
@@ -762,4 +762,30 @@ class TasksControllerTest < ActionController::TestCase | @@ -762,4 +762,30 @@ class TasksControllerTest < ActionController::TestCase | ||
762 | assert_equal [task], assigns(:tasks) | 762 | assert_equal [task], assigns(:tasks) |
763 | end | 763 | end |
764 | 764 | ||
765 | + should "display email template selection when accept a task" do | ||
766 | + community = fast_create(Community) | ||
767 | + @controller.stubs(:profile).returns(community) | ||
768 | + person = create_user_with_permission('taskviewer', 'view_tasks', community) | ||
769 | + login_as person.user.login | ||
770 | + | ||
771 | + email_template = EmailTemplate.create!(:name => 'template', :owner => community, :template_type => :task_acceptance) | ||
772 | + task = ApproveArticle.create!(:requestor => person, :target => community, :responsible => person) | ||
773 | + get :index | ||
774 | + assert_select "#on-accept-information-#{task.id} .template-selection" | ||
775 | + assert_equal [email_template], assigns(:acceptance_email_templates) | ||
776 | + end | ||
777 | + | ||
778 | + should "display email template selection when reject a task" do | ||
779 | + community = fast_create(Community) | ||
780 | + @controller.stubs(:profile).returns(community) | ||
781 | + person = create_user_with_permission('taskviewer', 'view_tasks', community) | ||
782 | + login_as person.user.login | ||
783 | + | ||
784 | + email_template = EmailTemplate.create!(:name => 'template', :owner => community, :template_type => :task_rejection) | ||
785 | + task = ApproveArticle.create!(:requestor => person, :target => community, :responsible => person) | ||
786 | + get :index | ||
787 | + assert_select "#on-reject-information-#{task.id} .template-selection" | ||
788 | + assert_equal [email_template], assigns(:rejection_email_templates) | ||
789 | + end | ||
790 | + | ||
765 | end | 791 | end |
@@ -0,0 +1,23 @@ | @@ -0,0 +1,23 @@ | ||
1 | +require_relative "../test_helper" | ||
2 | + | ||
3 | +class TaskHelperTest < ActionView::TestCase | ||
4 | + | ||
5 | + include ApplicationHelper | ||
6 | + | ||
7 | + def setup | ||
8 | + @profile = fast_create(Profile) | ||
9 | + @task = fast_create(Task, :target_id => @profile.id) | ||
10 | + end | ||
11 | + | ||
12 | + attr_accessor :task, :profile | ||
13 | + | ||
14 | + should 'return select field for template selection when there is templates to choose' do | ||
15 | + email_templates = 3.times.map { EmailTemplate.new } | ||
16 | + assert_tag_in_string task_email_template('Description', email_templates, task), :tag => 'div', :attributes => {:class => 'template-selection'} | ||
17 | + end | ||
18 | + | ||
19 | + should 'not return select field for template selection when there is no templates to choose' do | ||
20 | + assert task_email_template('Description', [], task).blank? | ||
21 | + end | ||
22 | + | ||
23 | +end |
test/unit/task_mailer_test.rb
@@ -195,6 +195,34 @@ class TaskMailerTest < ActiveSupport::TestCase | @@ -195,6 +195,34 @@ class TaskMailerTest < ActiveSupport::TestCase | ||
195 | assert_equal 'template body - example - my name - explanation', mail.body.to_s | 195 | assert_equal 'template body - example - my name - explanation', mail.body.to_s |
196 | end | 196 | end |
197 | 197 | ||
198 | + should 'be able to send accept notification based on a selected template' do | ||
199 | + task = Task.new | ||
200 | + task.expects(:task_finished_message).returns('the message') | ||
201 | + | ||
202 | + profile = fast_create(Community) | ||
203 | + email_template = EmailTemplate.create!(:owner => profile, :name => 'Template 1', :subject => 'template subject - {{environment.name}}', :body => 'template body - {{environment.name}} - {{task.requestor.name}}') | ||
204 | + task.email_template_id = email_template.id | ||
205 | + | ||
206 | + requestor = Profile.new(:name => 'my name') | ||
207 | + requestor.expects(:notification_emails).returns(['requestor@example.com']).at_least_once | ||
208 | + | ||
209 | + environment = Environment.default | ||
210 | + environment.expects(:noreply_email).returns('sender@example.com') | ||
211 | + environment.expects(:default_hostname).returns('example.com') | ||
212 | + environment.expects(:name).returns('example').at_least_once | ||
213 | + | ||
214 | + task.expects(:requestor).returns(requestor).at_least_once | ||
215 | + requestor.expects(:environment).returns(environment).at_least_once | ||
216 | + task.expects(:environment).returns(environment).at_least_once | ||
217 | + | ||
218 | + task.send(:send_notification, :finished).deliver | ||
219 | + assert !ActionMailer::Base.deliveries.empty? | ||
220 | + mail = ActionMailer::Base.deliveries.last | ||
221 | + assert_match /text\/html/, mail.content_type | ||
222 | + assert_equal 'template subject - example', mail.subject.to_s | ||
223 | + assert_equal 'template body - example - my name', mail.body.to_s | ||
224 | + end | ||
225 | + | ||
198 | private | 226 | private |
199 | def read_fixture(action) | 227 | def read_fixture(action) |
200 | IO.readlines("#{FIXTURES_PATH}/task_mailer/#{action}") | 228 | IO.readlines("#{FIXTURES_PATH}/task_mailer/#{action}") |