discourse/lib/wizard.rb

97 lines
2.1 KiB
Ruby
Raw Normal View History

2016-08-26 01:14:56 +08:00
require_dependency 'wizard/step'
require_dependency 'wizard/field'
require_dependency 'wizard/step_updater'
2016-08-26 01:14:56 +08:00
class Wizard
attr_reader :steps, :user
2016-08-26 01:14:56 +08:00
def initialize(user)
2016-08-26 01:14:56 +08:00
@steps = []
@user = user
@first_step = nil
2016-08-26 01:14:56 +08:00
end
2016-09-08 06:04:01 +08:00
def create_step(step_name)
Step.new(step_name)
2016-08-26 01:14:56 +08:00
end
def append_step(step)
2016-09-08 06:04:01 +08:00
step = create_step(step) if step.is_a?(String)
yield step if block_given?
2016-08-26 01:14:56 +08:00
last_step = @steps.last
@steps << step
# If it's the first step
if @steps.size == 1
@first_step = step
2016-08-26 01:14:56 +08:00
step.index = 0
elsif last_step.present?
last_step.next = step
step.previous = last_step
step.index = last_step.index + 1
end
end
def steps_with_fields
2016-10-14 17:09:55 +08:00
@steps_with_fields ||= @steps.select(&:has_fields?)
end
def start
completed = UserHistory.where(
action: UserHistory.actions[:wizard_step],
context: steps_with_fields.map(&:id)
).uniq.pluck(:context)
# First uncompleted step
steps_with_fields.each do |s|
return s unless completed.include?(s.id)
end
@first_step
end
def create_updater(step_id, fields)
2016-10-14 17:09:55 +08:00
step = @steps.find { |s| s.id == step_id.dasherize }
Wizard::StepUpdater.new(@user, step, fields)
2016-08-26 01:14:56 +08:00
end
def completed?
completed_steps?(steps_with_fields.map(&:id))
end
def completed_steps?(steps)
steps = [steps].flatten.uniq
completed = UserHistory.where(
action: UserHistory.actions[:wizard_step],
context: steps
).distinct.order(:context).pluck(:context)
steps.sort == completed
end
def requires_completion?
return false unless SiteSetting.wizard_enabled?
2016-10-14 17:09:55 +08:00
first_admin = User.where(admin: true)
.where.not(id: Discourse.system_user.id)
.where.not(auth_token_updated_at: nil)
.order(:auth_token_updated_at)
if @user.present? && first_admin.first == @user && (Topic.count < 15)
!Wizard::Builder.new(@user).build.completed?
else
false
end
end
def self.user_requires_completion?(user)
self.new(user).requires_completion?
end
2016-08-26 01:14:56 +08:00
end