Skip to content

Commit

Permalink
Merge pull request #121 from helpyio/dev/add-mail-settings
Browse files Browse the repository at this point in the history
Dev/add mail settings
  • Loading branch information
scott committed Apr 18, 2016
2 parents 1f361c1 + ad08acb commit 5927660
Show file tree
Hide file tree
Showing 10 changed files with 173 additions and 13 deletions.
10 changes: 10 additions & 0 deletions app/assets/javascripts/admin.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,16 @@ Helpy.admin = function(){
$('.pick-a-color').pickAColor({
inlineDropdown: true //display underneath field
});

$('input.send-email').off().on('change', function(){
var chosen = $("input.send-email:radio:checked").val();
if (chosen === 'true') {
$('.smtp-settings').removeClass('hidden');
} else {
$('.smtp-settings').addClass('hidden');
}
});

};

$(document).on('page:change', Helpy.admin);
24 changes: 19 additions & 5 deletions app/controllers/admin_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -416,18 +416,32 @@ def settings

def update_settings

# NOTE: We iterate through settings here to establish our universe of settings to save
# this means if you add a setting, you MUST declare a default value in the "default_settings intializer"
@settings = AppSettings.get_all

# iterate through
@settings.each do |setting|
# logger.info("Setting: #{setting[0]}")
# logger.info("Value: #{params[setting[0]]}")

AppSettings[setting[0]] = params[setting[0].to_sym]
end

logger.info(params['i18n'])
AppSettings['i18n.available_locales'] = params['i18n.available_locales']
# logger.info(params['i18n'])
# AppSettings['i18n.available_locales'] = params['i18n.available_locales']

# Configure griddler, mailer
# Griddler.configuration.email_service = params["email.mail_service"].to_sym

# SMTP Settings from AppSettings
# ActionMailer::Base.smtp_settings = {
# :address => params["email.mail_smtp"],
# :port => params["email.mail_port"],
# :user_name => params["email.smtp_mail_username"],
# :password => params["email.smtp_mail_password"],
# :domain => params["email.mail_domain"]
# }
#
# # Toggle Delivery on and off via AppSettings
# ActionMailer::Base.perform_deliveries = AppSettings['email.send_email']

respond_to do |format|
format.html { redirect_to(admin_settings_path) }
Expand Down
27 changes: 27 additions & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ class ApplicationController < ActionController::Base
add_breadcrumb :root

before_action :set_locale
before_action :set_vars
before_action :instantiate_tracker

def url_options
Expand All @@ -29,6 +30,32 @@ def set_locale
end
end

def set_vars
# Configure griddler, mailer
Griddler.configuration.email_service = AppSettings["email.mail_service"].to_sym

ActionMailer::Base.smtp_settings = {
:address => AppSettings["email.mail_smtp"],
:port => AppSettings["email.mail_port"],
:user_name => AppSettings["email.smtp_mail_username"],
:password => AppSettings["email.smtp_mail_password"],
:domain => AppSettings["email.mail_domain"]
}

ActionMailer::Base.perform_deliveries = to_boolean(AppSettings['email.send_email'])

Cloudinary.config do |config|
config.cloud_name = AppSettings['cloudinary.cloud_name']
config.api_key = AppSettings['cloudinary.api_key']
config.api_secret = AppSettings['cloudinary.api_secret']
end

end

def to_boolean(str)
str == 'true'
end

def fetch_counts
@new = Topic.unread.count
@unread = Topic.unread.count
Expand Down
8 changes: 5 additions & 3 deletions app/mailers/topic_mailer.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
#class TopicMailer < MandrillMailer::MessageMailer
class TopicMailer < ActionMailer::Base
default from: "#{Settings.admin_email}"

def new_ticket(topic)
@topic = topic
email_with_name = %("#{topic.user.name}" <#{topic.user.email}>)
mail(to: email_with_name, subject: "[#{AppSettings['settings.site_name']}] ##{topic.id}-#{topic.name}")
mail(
to: email_with_name,
from: %("#{AppSettings['settings.site_name']}" <#{AppSettings['email.admin_email']}>),
subject: "[#{AppSettings['settings.site_name']}] ##{topic.id}-#{topic.name}"
)
end

end
8 changes: 5 additions & 3 deletions app/mailers/user_mailer.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
class UserMailer < ActionMailer::Base

default from: Settings.from_email

def new_user(user, token)
@user = user
@token = token
email_with_name = %("#{user.name}" <#{user.email}>)
mail(to: email_with_name, subject: "Welcome to #{AppSettings['settings.site_name']}")
mail(
to: email_with_name,
from: %("#{AppSettings['settings.site_name']}" <#{AppSettings['email.admin_email']}>),
subject: "Welcome to #{AppSettings['settings.site_name']}"
)
end

end
30 changes: 29 additions & 1 deletion app/views/admin/settings.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
<li><%= link_to t("design", default: "Design"), '#', class: 'settings-link', "data-target" => "design" %></li>
<li><%= link_to t("i18n", default: "Internationalization"), '#', class: 'settings-link', "data-target" => "i18n" %></li>
<li><%= link_to t("widget", default: "Embed Widget"), '#', class: 'settings-link', "data-target" => "widget" %></li>
<li><%= link_to t("email", default: "Email Setup"), '#', class: 'settings-link', "data-target" => "email" %></li>
<li><%= link_to t("cloudinary", default: "Cloudinary"), '#', class: 'settings-link', "data-target" => "cloudinary" %></li>
</ul>
</div>

Expand All @@ -20,6 +22,7 @@
<%= bootstrap_form_tag url: update_settings_path, method: 'put' do |f| %>
<div class="settings-section general">
<%= f.text_field 'settings.site_name', value: AppSettings['settings.site_name'], label: "Site Name" %>
<%= f.text_field 'settings.site_url', value: AppSettings['settings.site_url'], label: "Site URL" %>
<%= f.text_field 'settings.parent_site', value: AppSettings['settings.parent_site'], label: "Parent Site" %>
<%= f.text_field 'settings.parent_company', value: AppSettings['settings.parent_company'], label: "Parent Company" %>
<%= f.text_field 'settings.site_tagline', value: AppSettings['settings.site_tagline'], label: "Site Tagline" %>
Expand Down Expand Up @@ -68,13 +71,38 @@
<br/>
<%= select_default_locale %>
</div>

<div class="settings-section widget hidden">
<%= f.check_box 'widget.show_on_support_site', { checked: AppSettings['widget.show_on_support_site'] == "1"} %>
<%= f.check_box 'widget.show_on_support_site', { checked: AppSettings['widget.show_on_support_site'] == "1", label: "Show Widget on Support Site" } %>
<p>Add the embed widget to your site using the following URL:<br/>
<code><%= "<script src='//#{request.host_with_port}/assets/widget.v1.js'></script>" %></code>
</p>
</div>

<div class="settings-section email hidden">
<%= f.select 'email.mail_service', options_for_select([['Mailgun', 'mailgun'],['Sendgrid', 'sendgrid'],['Mandrill','mandrill'],['Postmark','postmark'],['Sparkpost','sparkpost'],['Mailin','mailin']], AppSettings['email.mail_service']), label: "Inbound Mail Service Provider" %>

<%= f.form_group 'email.send_email', label: { text: "Enable Outbound (SMTP) Email" }, class: 'send-email-toggle' do %>
<%= f.radio_button 'email.send_email', false, label: "No", checked: "#{AppSettings['email.send_email']}" == 'false', class: 'send-email' %>
<%= f.radio_button 'email.send_email', true, label: "Yes", checked: "#{AppSettings['email.send_email']}" == 'true', class: 'send-email' %>
<% end %>
<div class="smtp-settings <%= "hidden" if "#{AppSettings['email.send_email']}" == 'false' %>">
<%= f.text_field 'email.admin_email', value: AppSettings['email.admin_email'], label: "Admin Email" %>
<%= f.text_field 'email.from_email', value: AppSettings['email.from_email'], label: "From Email" %>
<%= f.text_field 'email.smtp_mail_username', value: AppSettings['email.smtp_mail_username'], label: "SMTP Username" %>
<%= f.password_field 'email.smtp_mail_password', value: AppSettings['email.smtp_mail_password'], label: "SMTP Password" %>
<%= f.text_field 'email.mail_smtp', value: AppSettings['email.mail_smtp'], label: "SMTP Server" %>
<%= f.text_field 'email.mail_port', value: AppSettings['email.mail_port'], label: "SMTP Port" %>
<%= f.text_field 'email.mail_domain', value: AppSettings['email.mail_domain'], label: "SMTP Domain" %>
</div>
</div>

<div class="settings-section cloudinary hidden">
<%= f.text_field 'cloudinary.cloud_name', value: AppSettings['cloudinary.cloud_name'], label: "Cloud Name" %>
<%= f.text_field 'cloudinary.api_key', value: AppSettings['cloudinary.api_key'], label: "API Key" %>
<%= f.password_field 'cloudinary.api_secret', value: AppSettings['cloudinary.api_secret'], label: "API Secret" %>
</div>

<div class="submit-section">
<%= f.submit "Save Settings", class: 'btn btn-warning' %>
</div>
Expand Down
2 changes: 1 addition & 1 deletion app/views/layouts/widget.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', '<%= Settings.google_analytics_id %>', 'auto');
ga('create', '<%= AppSettings['settings.google_analytics_id'] %>', 'auto');

$(document).ready(function(){
$('form').find("input").each(function(ev)
Expand Down
19 changes: 19 additions & 0 deletions config/initializers/default_settings.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,22 @@
# Widget:

AppSettings.defaults["widget.show_on_support_site"] = "true"

# Email specific:

AppSettings.defaults["email.admin_email"] = Settings.admin_email
AppSettings.defaults["email.from_email"] = Settings.from_email
AppSettings.defaults["email.send_email"] = Settings.send_email

AppSettings.defaults["email.mail_service"] = Settings.mail_service
AppSettings.defaults["email.smtp_mail_username"] = Settings.smtp_mail_username
AppSettings.defaults["email.smtp_mail_password"] = Settings.smtp_mail_password
AppSettings.defaults["email.mail_smtp"] = Settings.mail_smtp
AppSettings.defaults["email.mail_port"] = Settings.mail_port
AppSettings.defaults["email.mail_domain"]= Settings.mail_domain

# Cloudinary:

AppSettings.defaults['cloudinary.cloud_name'] = ''
AppSettings.defaults['cloudinary.api_key'] = ''
AppSettings.defaults['cloudinary.api_secret'] = ''
46 changes: 46 additions & 0 deletions test/controllers/admin_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -301,4 +301,50 @@ class AdminControllerTest < ActionController::TestCase
assert_equal '1', AppSettings['widget.show_on_support_site']
end

test 'an admin should be able to turn email delivery on and off' do
put :update_settings,
'email.send_email' => 'false'
assert_no_difference 'ActionMailer::Base.deliveries.size' do
xhr :post, :create_ticket, topic: { user: { name: 'a user', email: '[email protected]' }, name: 'some new private topic', body: 'some body text', forum_id: 1 }, post: { body: 'this is the body' }
end
end

test 'an admin should be able to add mail settings' do
put :update_settings,
'email.admin_email' => '[email protected]',
'email.from_email' => '[email protected]',
'email.mail_service' => 'mailgun',
'email.mail_smtp' => 'mail.test.com',
'email.smtp_mail_username' => 'test-login',
'email.smtp_mail_password' => '1234',
'email.mail_port' => '587',
'email.mail_domain' => 'something.com'
assert_redirected_to :admin_settings

assert_equal '[email protected]', AppSettings['email.admin_email']
assert_equal '[email protected]', AppSettings['email.from_email']
assert_equal 'mailgun', AppSettings['email.mail_service']
assert_equal 'mail.test.com', AppSettings['email.mail_smtp']
assert_equal 'test-login', AppSettings['email.smtp_mail_username']
assert_equal '1234', AppSettings['email.smtp_mail_password']
assert_equal '587', AppSettings['email.mail_port']
assert_equal 'something.com', AppSettings['email.mail_domain']
end

test 'an admin should be able to add a cloudinary key' do
put :update_settings,
'cloudinary.cloud_name' => 'something',
'cloudinary.api_key' => 'something',
'cloudinary.api_secret' => 'something'
assert_redirected_to :admin_settings

assert_equal 'something', AppSettings['cloudinary.cloud_name']
assert_equal 'something', AppSettings['cloudinary.api_key']
assert_equal 'something', AppSettings['cloudinary.api_secret']
get :settings
assert_equal 'something', Cloudinary.config.cloud_name
assert_equal 'something', Cloudinary.config.api_key
assert_equal 'something', Cloudinary.config.api_secret
end

end
12 changes: 12 additions & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,16 @@ def set_default_settings
AppSettings['i18n.default_locale'] = 'en'
AppSettings['i18n.available_locales'] = ['en', 'fr', 'de', 'et']
AppSettings['widget.show_on_support_site'] = 'true'
AppSettings['email.admin_email'] = Settings.admin_email
AppSettings['email.from_email'] = Settings.from_email
AppSettings['email.send_email'] = 'true'
AppSettings['email.mail_service'] = Settings.mail_service
AppSettings['email.smtp_mail_username'] = Settings.smtp_mail_username
AppSettings['email.smtp_mail_password'] = Settings.smtp_mail_password
AppSettings['email.mail_smtp'] = Settings.mail_smtp
AppSettings['email.mail_port'] = Settings.mail_port
AppSettings['email.mail_domain'] = Settings.mail_domain
AppSettings['cloudinary.cloud_name'] = ''
AppSettings['cloudinary.api_key'] = ''
AppSettings['cloudinary.api_secret'] = ''
end

0 comments on commit 5927660

Please sign in to comment.