Company Name Step which updates the TOS

This commit is contained in:
Robin Ward 2016-09-12 14:43:00 -04:00
parent 28b6c300a0
commit 35b767f6af
8 changed files with 160 additions and 61 deletions

View File

@ -9,8 +9,8 @@ class StepsController < ApplicationController
def update def update
wizard = Wizard::Builder.new(current_user).build wizard = Wizard::Builder.new(current_user).build
updater = wizard.create_updater(params[:id]) updater = wizard.create_updater(params[:id], params[:fields])
updater.update(params[:fields]) updater.update
if updater.success? if updater.success?
result = { success: 'OK' } result = { success: 'OK' }

View File

@ -1410,6 +1410,10 @@ en:
suppress_overlapping_tags_in_list: "If tags match exact words in topic titles, don't show the tag" suppress_overlapping_tags_in_list: "If tags match exact words in topic titles, don't show the tag"
remove_muted_tags_from_latest: "Don't show topics tagged with muted tags in the latest topic list." remove_muted_tags_from_latest: "Don't show topics tagged with muted tags in the latest topic list."
company_short_name: "Company Name (short)"
company_full_name: "Company Name (full)"
company_domain: "Company Domain"
errors: errors:
invalid_email: "Invalid email address." invalid_email: "Invalid email address."
invalid_username: "There's no user with that username." invalid_username: "There's no user with that username."
@ -3265,6 +3269,22 @@ en:
site_contact_username: site_contact_username:
label: "Site Contact Username" label: "Site Contact Username"
description: "All automated messages will be sent from this user." description: "All automated messages will be sent from this user."
corporate:
title: "About your Company"
description: "If you don't have a company, feel free to leave this step blank."
fields:
company_short_name:
label: "Company Name (short)"
placeholder: "PP Inc."
company_full_name:
label: "Company Name (full)"
placeholder: "Pied Piper Incorporated"
company_domain:
label: "Company Domain"
placeholder: "piedpiper.com"
colors: colors:
title: "Choose a Theme" title: "Choose a Theme"
fields: fields:

View File

@ -60,6 +60,12 @@ required:
exclude_rel_nofollow_domains: exclude_rel_nofollow_domains:
default: '' default: ''
type: list type: list
company_short_name:
default: ''
company_full_name:
default: ''
company_domain:
default: ''
basic: basic:
default_locale: default_locale:

View File

@ -33,9 +33,9 @@ class Wizard
end end
end end
def create_updater(step_id) def create_updater(step_id, fields)
step = @steps.find {|s| s.id == step_id.dasherize} step = @steps.find {|s| s.id == step_id.dasherize}
Wizard::StepUpdater.new(@user, step) Wizard::StepUpdater.new(@user, step, fields)
end end
end end

View File

@ -16,10 +16,10 @@ class Wizard
languages.add_choice(locale[:value], label: locale[:name]) languages.add_choice(locale[:value], label: locale[:name])
end end
step.on_update do |updater, fields| step.on_update do |updater|
old_locale = SiteSetting.default_locale old_locale = SiteSetting.default_locale
updater.update_setting_field(:default_locale, fields, :default_locale) updater.apply_setting(:default_locale)
updater.refresh_required = true if old_locale != fields[:default_locale] updater.refresh_required = true if old_locale != updater.fields[:default_locale]
end end
end end
@ -27,9 +27,8 @@ class Wizard
step.add_field(id: 'title', type: 'text', required: true, value: SiteSetting.title) step.add_field(id: 'title', type: 'text', required: true, value: SiteSetting.title)
step.add_field(id: 'site_description', type: 'text', required: true, value: SiteSetting.site_description) step.add_field(id: 'site_description', type: 'text', required: true, value: SiteSetting.site_description)
step.on_update do |updater, fields| step.on_update do |updater|
updater.update_setting_field(:title, fields, :title) updater.apply_settings(:title, :site_description)
updater.update_setting_field(:site_description, fields, :site_description)
end end
end end
@ -42,9 +41,9 @@ class Wizard
privacy.add_choice('open', icon: 'unlock') privacy.add_choice('open', icon: 'unlock')
privacy.add_choice('restricted', icon: 'lock') privacy.add_choice('restricted', icon: 'lock')
step.on_update do |updater, fields| step.on_update do |updater|
updater.update_setting(:login_required, fields[:privacy] == 'restricted') updater.update_setting(:login_required, updater.fields[:privacy] == 'restricted')
updater.update_setting(:invite_only, fields[:privacy] == 'restricted') updater.update_setting(:invite_only, updater.fields[:privacy] == 'restricted')
end end
end end
@ -53,10 +52,31 @@ class Wizard
step.add_field(id: 'contact_url', type: 'text', value: SiteSetting.contact_url) step.add_field(id: 'contact_url', type: 'text', value: SiteSetting.contact_url)
step.add_field(id: 'site_contact_username', type: 'text', value: SiteSetting.site_contact_username) step.add_field(id: 'site_contact_username', type: 'text', value: SiteSetting.site_contact_username)
step.on_update do |updater, fields| step.on_update do |updater|
updater.update_setting_field(:contact_email, fields, :contact_email) updater.apply_settings(:contact_email, :contact_url, :site_contact_username)
updater.update_setting_field(:contact_url, fields, :contact_url) end
updater.update_setting_field(:site_contact_username, fields, :site_contact_username) end
@wizard.append_step('corporate') do |step|
step.add_field(id: 'company_short_name', type: 'text', value: SiteSetting.company_short_name)
step.add_field(id: 'company_full_name', type: 'text', value: SiteSetting.company_full_name)
step.add_field(id: 'company_domain', type: 'text', value: SiteSetting.company_domain)
step.on_update do |updater|
tos_post = Post.where(topic_id: SiteSetting.tos_topic_id, post_number: 1).first
if tos_post.present?
raw = tos_post.raw.dup
replace_company(updater, raw, 'company_full_name')
replace_company(updater, raw, 'company_short_name')
replace_company(updater, raw, 'company_domain')
revisor = PostRevisor.new(tos_post)
revisor.revise!(@wizard.user, raw: raw)
end
updater.apply_settings(:company_short_name, :company_full_name, :company_domain)
end end
end end
@ -68,8 +88,8 @@ class Wizard
ColorScheme.themes.each {|t| themes.add_choice(t[:id], data: t) } ColorScheme.themes.each {|t| themes.add_choice(t[:id], data: t) }
step.add_field(id: 'theme_preview', type: 'component') step.add_field(id: 'theme_preview', type: 'component')
step.on_update do |updater, fields| step.on_update do |updater|
scheme_name = fields[:theme_id] scheme_name = updater.fields[:theme_id]
theme = ColorScheme.themes.find {|s| s[:id] == scheme_name } theme = ColorScheme.themes.find {|s| s[:id] == scheme_name }
@ -104,18 +124,28 @@ class Wizard
step.add_field(id: 'favicon_url', type: 'image', value: SiteSetting.favicon_url) step.add_field(id: 'favicon_url', type: 'image', value: SiteSetting.favicon_url)
step.add_field(id: 'apple_touch_icon_url', type: 'image', value: SiteSetting.apple_touch_icon_url) step.add_field(id: 'apple_touch_icon_url', type: 'image', value: SiteSetting.apple_touch_icon_url)
step.on_update do |updater, fields| step.on_update do |updater|
updater.update_setting_field(:logo_url, fields, :logo_url) updater.apply_settings(:logo_url, :logo_small_url, :favicon_url, :apple_touch_icon_url)
updater.update_setting_field(:logo_small_url, fields, :logo_small_url)
updater.update_setting_field(:favicon_url, fields, :favicon_url)
updater.update_setting_field(:apple_touch_icon_url, fields, :apple_touch_icon_url)
end end
end end
DiscourseEvent.trigger(:build_wizard, @wizard)
@wizard.append_step('finished') @wizard.append_step('finished')
@wizard @wizard
end end
protected
def replace_company(updater, raw, field_name)
old_value = SiteSetting.send(field_name)
old_value = field_name if old_value.blank?
new_value = updater.fields[field_name.to_sym]
new_value = field_name if new_value.blank?
raw.gsub!(old_value, new_value)
end
end end
end end

View File

@ -2,16 +2,17 @@ class Wizard
class StepUpdater class StepUpdater
include ActiveModel::Model include ActiveModel::Model
attr_accessor :refresh_required attr_accessor :refresh_required, :fields
def initialize(current_user, step) def initialize(current_user, step, fields)
@current_user = current_user @current_user = current_user
@step = step @step = step
@refresh_required = false @refresh_required = false
@fields = fields
end end
def update(fields) def update
@step.updater.call(self, fields) if @step.updater.present? @step.updater.call(self) if @step.updater.present?
end end
def success? def success?
@ -27,10 +28,14 @@ class Wizard
SiteSetting.set_and_log(id, value, @current_user) if SiteSetting.send(id) != value SiteSetting.set_and_log(id, value, @current_user) if SiteSetting.send(id) != value
end end
def update_setting_field(id, fields, field_id) def apply_setting(id)
update_setting(id, fields[field_id]) update_setting(id, @fields[id])
rescue Discourse::InvalidParameters => e rescue Discourse::InvalidParameters => e
errors.add(field_id, e.message) errors.add(id, e.message)
end
def apply_settings(*ids)
ids.each {|id| apply_setting(id)}
end end
end end

View File

@ -8,23 +8,24 @@ describe Wizard::StepUpdater do
let(:wizard) { Wizard::Builder.new(user).build } let(:wizard) { Wizard::Builder.new(user).build }
context "locale" do context "locale" do
let(:updater) { wizard.create_updater('locale') }
it "does not require refresh when the language stays the same" do it "does not require refresh when the language stays the same" do
updater.update(default_locale: 'en') updater = wizard.create_updater('locale', default_locale: 'en')
updater.update
expect(updater.refresh_required?).to eq(false) expect(updater.refresh_required?).to eq(false)
end end
it "updates the locale and requires refresh when it does change" do it "updates the locale and requires refresh when it does change" do
updater.update(default_locale: 'ru') updater = wizard.create_updater('locale', default_locale: 'ru')
updater.update
expect(SiteSetting.default_locale).to eq('ru') expect(SiteSetting.default_locale).to eq('ru')
expect(updater.refresh_required?).to eq(true) expect(updater.refresh_required?).to eq(true)
end end
end end
it "updates the forum title step" do it "updates the forum title step" do
updater = wizard.create_updater('forum_title') updater = wizard.create_updater('forum_title', title: 'new forum title', site_description: 'neat place')
updater.update(title: 'new forum title', site_description: 'neat place') updater.update
expect(updater.success?).to eq(true) expect(updater.success?).to eq(true)
expect(SiteSetting.title).to eq("new forum title") expect(SiteSetting.title).to eq("new forum title")
@ -32,17 +33,17 @@ describe Wizard::StepUpdater do
end end
context "privacy settings" do context "privacy settings" do
let(:updater) { wizard.create_updater('privacy') }
it "updates to open correctly" do it "updates to open correctly" do
updater.update(privacy: 'open') updater = wizard.create_updater('privacy', privacy: 'open')
updater.update
expect(updater.success?).to eq(true) expect(updater.success?).to eq(true)
expect(SiteSetting.login_required?).to eq(false) expect(SiteSetting.login_required?).to eq(false)
expect(SiteSetting.invite_only?).to eq(false) expect(SiteSetting.invite_only?).to eq(false)
end end
it "updates to private correctly" do it "updates to private correctly" do
updater.update(privacy: 'restricted') updater = wizard.create_updater('privacy', privacy: 'restricted')
updater.update
expect(updater.success?).to eq(true) expect(updater.success?).to eq(true)
expect(SiteSetting.login_required?).to eq(true) expect(SiteSetting.login_required?).to eq(true)
expect(SiteSetting.invite_only?).to eq(true) expect(SiteSetting.invite_only?).to eq(true)
@ -50,13 +51,13 @@ describe Wizard::StepUpdater do
end end
context "contact step" do context "contact step" do
let(:updater) { wizard.create_updater('contact') }
it "updates the fields correctly" do it "updates the fields correctly" do
updater.update(contact_email: 'eviltrout@example.com', updater = wizard.create_updater('contact',
contact_url: 'http://example.com/custom-contact-url', contact_email: 'eviltrout@example.com',
site_contact_username: user.username) contact_url: 'http://example.com/custom-contact-url',
site_contact_username: user.username)
updater.update
expect(updater).to be_success expect(updater).to be_success
expect(SiteSetting.contact_email).to eq("eviltrout@example.com") expect(SiteSetting.contact_email).to eq("eviltrout@example.com")
expect(SiteSetting.contact_url).to eq("http://example.com/custom-contact-url") expect(SiteSetting.contact_url).to eq("http://example.com/custom-contact-url")
@ -64,33 +65,71 @@ describe Wizard::StepUpdater do
end end
it "doesn't update when there are errors" do it "doesn't update when there are errors" do
updater.update(contact_email: 'not-an-email', updater = wizard.create_updater('contact',
site_contact_username: 'not-a-username') contact_email: 'not-an-email',
site_contact_username: 'not-a-username')
updater.update
expect(updater).to_not be_success expect(updater).to_not be_success
expect(updater.errors).to be_present expect(updater.errors).to be_present
end end
end end
context "colors step" do context "corporate step" do
let(:updater) { wizard.create_updater('colors') }
it "updates the fields properly" do
p = Fabricate(:post, raw: 'company_domain - company_full_name - company_short_name template')
SiteSetting.tos_topic_id = p.topic_id
updater = wizard.create_updater('corporate',
company_short_name: 'ACME',
company_full_name: 'ACME, Inc.',
company_domain: 'acme.com')
updater.update
expect(updater).to be_success
expect(SiteSetting.company_short_name).to eq("ACME")
expect(SiteSetting.company_full_name).to eq("ACME, Inc.")
expect(SiteSetting.company_domain).to eq("acme.com")
# Should update the TOS topic
raw = Post.where(topic_id: SiteSetting.tos_topic_id, post_number: 1).pluck(:raw).first
expect(raw).to eq("acme.com - ACME, Inc. - ACME template")
# Can update the TOS topic again
updater = wizard.create_updater('corporate',
company_short_name: 'PPI',
company_full_name: 'Pied Piper Inc',
company_domain: 'piedpiper.com')
updater.update
raw = Post.where(topic_id: SiteSetting.tos_topic_id, post_number: 1).pluck(:raw).first
expect(raw).to eq("piedpiper.com - Pied Piper Inc - PPI template")
# Can update the TOS to nothing
updater = wizard.create_updater('corporate', {})
updater.update
raw = Post.where(topic_id: SiteSetting.tos_topic_id, post_number: 1).pluck(:raw).first
expect(raw).to eq("company_domain - company_full_name - company_short_name template")
end
end
context "colors step" do
context "with an existing color scheme" do context "with an existing color scheme" do
let!(:color_scheme) { Fabricate(:color_scheme, name: 'existing', via_wizard: true) } let!(:color_scheme) { Fabricate(:color_scheme, name: 'existing', via_wizard: true) }
it "updates the scheme" do it "updates the scheme" do
updater.update(theme_id: 'dark') updater = wizard.create_updater('colors', theme_id: 'dark')
updater.update
expect(updater.success?).to eq(true) expect(updater.success?).to eq(true)
color_scheme.reload color_scheme.reload
expect(color_scheme).to be_enabled expect(color_scheme).to be_enabled
end end
end end
context "without an existing scheme" do context "without an existing scheme" do
it "creates the scheme" do it "creates the scheme" do
updater.update(theme_id: 'dark') updater = wizard.create_updater('colors', theme_id: 'dark')
updater.update
expect(updater.success?).to eq(true) expect(updater.success?).to eq(true)
color_scheme = ColorScheme.where(via_wizard: true).first color_scheme = ColorScheme.where(via_wizard: true).first
@ -102,15 +141,14 @@ describe Wizard::StepUpdater do
end end
context "logos step" do context "logos step" do
let(:updater) { wizard.create_updater('logos') }
it "updates the fields correctly" do it "updates the fields correctly" do
updater.update( updater = wizard.create_updater('logos',
logo_url: '/uploads/logo.png', logo_url: '/uploads/logo.png',
logo_small_url: '/uploads/logo-small.png', logo_small_url: '/uploads/logo-small.png',
favicon_url: "/uploads/favicon.png", favicon_url: "/uploads/favicon.png",
apple_touch_icon_url: "/uploads/apple.png" apple_touch_icon_url: "/uploads/apple.png")
) updater.update
expect(updater).to be_success expect(updater).to be_success
expect(SiteSetting.logo_url).to eq('/uploads/logo.png') expect(SiteSetting.logo_url).to eq('/uploads/logo.png')

View File

@ -3,7 +3,7 @@ require 'wizard'
describe Wizard::Step do describe Wizard::Step do
let(:wizard) { Wizard.new } let(:wizard) { Wizard.new(Fabricate.build(:user)) }
let(:step) { wizard.create_step('test-step') } let(:step) { wizard.create_step('test-step') }
it "supports fields and options" do it "supports fields and options" do