mirror of
https://github.com/codeninjasllc/discourse.git
synced 2024-11-27 09:36:19 -05:00
Company Name Step which updates the TOS
This commit is contained in:
parent
28b6c300a0
commit
35b767f6af
8 changed files with 160 additions and 61 deletions
|
@ -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' }
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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_email: 'eviltrout@example.com',
|
||||||
contact_url: 'http://example.com/custom-contact-url',
|
contact_url: 'http://example.com/custom-contact-url',
|
||||||
site_contact_username: user.username)
|
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',
|
||||||
|
contact_email: 'not-an-email',
|
||||||
site_contact_username: 'not-a-username')
|
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')
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue