Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Get levels in last lesson of CSP 20-21 units (except unit 8) by absolute position #39035

Merged
merged 7 commits into from
Feb 22, 2021
14 changes: 13 additions & 1 deletion dashboard/app/controllers/script_levels_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,19 @@ def self.get_script_level(script, params)
if params[:chapter]
script.get_script_level_by_chapter(params[:chapter])
elsif params[:stage_position]
script.get_script_level_by_relative_position_and_puzzle_position(params[:stage_position], params[:id], false)
if ['csp1-2020', 'csp2-2020', 'csp3-2020', 'csp4-2020', 'csp5-2020', 'csp6-2020', 'csp7-2020', 'csp9-2020', 'csp10-2020'].include? script.name
if script.name == 'csp1-2020'
if script.lessons.last.absolute_position - 1 == params[:stage_position].to_i
script.get_script_level_by_absolute_position_and_puzzle_position(script.lessons.last.absolute_position, params[:id])
end
else
if script.lessons.last.absolute_position == params[:stage_position].to_i
script.get_script_level_by_absolute_position_and_puzzle_position(script.lessons.last.absolute_position, params[:id])
end
end
else
script.get_script_level_by_relative_position_and_puzzle_position(params[:stage_position], params[:id], false)
end
elsif params[:lockable_stage_position]
script.get_script_level_by_relative_position_and_puzzle_position(params[:lockable_stage_position], params[:id], true)
else
Expand Down
16 changes: 15 additions & 1 deletion dashboard/app/helpers/levels_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,21 @@ module LevelsHelper
include AzureTextToSpeech

def build_script_level_path(script_level, params = {})
if script_level.script.name == Script::HOC_NAME
if (['csp1-2020', 'csp2-2020', 'csp3-2020', 'csp4-2020', 'csp5-2020', 'csp6-2020', 'csp7-2020', 'csp9-2020', 'csp10-2020'].include? script_level.script.name) && (script_level.script.lessons.last.id == script_level.lesson.id)
if script_level.script.name == 'csp1-2020'
if params[:puzzle_page]
"/s/#{script_level.script.name}/stage/#{script_level.lesson.absolute_position - 1}/puzzle/#{script_level.position}/page/#{params[:puzzle_page]}"
else
"/s/#{script_level.script.name}/stage/#{script_level.lesson.absolute_position - 1}/puzzle/#{script_level.position}"
end
else
if params[:puzzle_page]
"/s/#{script_level.script.name}/stage/#{script_level.lesson.absolute_position}/puzzle/#{script_level.position}/page/#{params[:puzzle_page]}"
else
"/s/#{script_level.script.name}/stage/#{script_level.lesson.absolute_position}/puzzle/#{script_level.position}"
end
end
elsif script_level.script.name == Script::HOC_NAME
hoc_chapter_path(script_level.chapter, params)
elsif script_level.script.name == Script::FLAPPY_NAME
flappy_chapter_path(script_level.chapter, params)
Expand Down
10 changes: 10 additions & 0 deletions dashboard/app/models/script.rb
Original file line number Diff line number Diff line change
Expand Up @@ -827,6 +827,16 @@ def self.beta?(name)
name == Script::EDIT_CODE_NAME || ScriptConstants.script_in_category?(:csf2_draft, name)
end

def get_script_level_by_absolute_position_and_puzzle_position(absolute_position, puzzle_position)
script_levels.find do |sl|
# make sure we are checking the native properties of the script level
# first, so we only have to load lesson if it's actually necessary.
sl.position == puzzle_position.to_i &&
!sl.bonus &&
sl.lesson.absolute_position == absolute_position.to_i
end
end

def get_script_level_by_id(script_level_id)
script_levels.find(id: script_level_id.to_i)
end
Expand Down
48 changes: 48 additions & 0 deletions dashboard/test/integration/scripts_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
require 'test_helper'

class ScriptsTest < ActionDispatch::IntegrationTest
include LevelsHelper # for build_script_level_path

setup do
Rails.application.config.stubs(:levelbuilder_mode).returns true

# stub writes so that we dont actually make updates to filesystem
File.stubs(:write)

@teacher = create :authorized_teacher
end

test 'authorized teacher viewing csp1-2020' do
sign_in @teacher

@script = create :script, name: 'csp1-2020'
@lesson_group = create :lesson_group, script: @script
@lockable_stage = create(:lesson, script: @script, name: 'Assessment Day', lockable: true, lesson_group: @lesson_group, has_lesson_plan: false, absolute_position: 14)
@level_group = create(:level_group, :with_sublevels, name: 'assessment 1')
@lockable_level_group_sl = create(:script_level, script: @script, lesson: @lockable_stage, levels: [@level_group], assessment: true)

get build_script_level_path(@lockable_level_group_sl)
follow_redirect!
assert_response :success
assert_select '.level-group', 1
assert_select "#locked-stage", 1
assert_select "#locked-stage[data-hidden]", 1
end

test 'authorized teacher viewing csp2-2020' do
sign_in @teacher

@script = create :script, name: 'csp2-2020'
@lesson_group = create :lesson_group, script: @script
@lockable_stage = create(:lesson, script: @script, name: 'Assessment Day', lockable: true, lesson_group: @lesson_group, has_lesson_plan: false, absolute_position: 9)
@level_group = create(:level_group, :with_sublevels, name: 'assessment 1')
@lockable_level_group_sl = create(:script_level, script: @script, lesson: @lockable_stage, levels: [@level_group], assessment: true)

get build_script_level_path(@lockable_level_group_sl)
follow_redirect!
assert_response :success
assert_select '.level-group', 1
assert_select "#locked-stage", 1
assert_select "#locked-stage[data-hidden]", 1
end
end