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
16 changes: 14 additions & 2 deletions dashboard/app/controllers/script_levels_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,21 @@ 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 (['csp2-2020', 'csp3-2020', 'csp4-2020', 'csp5-2020', 'csp6-2020', 'csp7-2020', 'csp9-2020', 'csp10-2020'].include? script.name) && 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])
elsif script.name == 'csp1-2020' && 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])
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)
if (['csp2-2020', 'csp3-2020', 'csp4-2020', 'csp5-2020', 'csp6-2020', 'csp7-2020', 'csp9-2020', 'csp10-2020'].include? script.name) && 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])
elsif script.name == 'csp1-2020' && 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])
else
script.get_script_level_by_relative_position_and_puzzle_position(params[:lockable_stage_position], params[:id], true)
end
else
script.get_script_level_by_id(params[:id])
end
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
70 changes: 70 additions & 0 deletions dashboard/test/controllers/script_levels_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,76 @@ class ScriptLevelsControllerTest < ActionController::TestCase
AzureTextToSpeech.unstub(:get_voices)
end

test 'should show script level for csp1-2020 lockable lesson with lesson plan' do
@unit = create :script, name: 'csp1-2020'
@lesson_group = create :lesson_group, script: @unit
@lockable_lesson = create(:lesson, script: @unit, name: 'Assessment Day', lockable: true, lesson_group: @lesson_group, has_lesson_plan: false, absolute_position: 15, relative_position: 2)
@external = create(:external, name: 'markdown level')
@external_sl = create(:script_level, script: @unit, lesson: @lockable_lesson, levels: [@external])
@level_group = create(:level_group, :with_sublevels, name: 'assessment 1')
@lockable_level_group_sl = create(:script_level, script: @unit, lesson: @lockable_lesson, levels: [@level_group], assessment: true)

get :show, params: {
script_id: @unit.name,
stage_position: @lockable_lesson.absolute_position - 1,
id: @external_sl.position
}

assert_redirected_to '/s/csp1-2020/lockable/2/puzzle/1'

get :show, params: {
script_id: @unit.name,
stage_position: @lockable_lesson.absolute_position - 1,
id: @lockable_level_group_sl.position
}

assert_redirected_to '/s/csp1-2020/lockable/2/puzzle/2/page/1'

get :show, params: {
script_id: @unit.name,
stage_position: @lockable_lesson.absolute_position - 1,
id: @lockable_level_group_sl.position,
puzzle_page: 1
}

assert_redirected_to '/s/csp1-2020/lockable/2/puzzle/2/page/1'
end

test 'should show script level for csp2-2020 lockable lesson with lesson plan' do
@unit = create :script, name: 'csp2-2020'
@lesson_group = create :lesson_group, script: @unit
@lockable_lesson = create(:lesson, script: @unit, name: 'Assessment Day', lockable: true, lesson_group: @lesson_group, has_lesson_plan: false, absolute_position: 9, relative_position: 1)
@external = create(:external, name: 'markdown level')
@external_sl = create(:script_level, script: @unit, lesson: @lockable_lesson, levels: [@external])
@level_group = create(:level_group, :with_sublevels, name: 'assessment 1')
@lockable_level_group_sl = create(:script_level, script: @unit, lesson: @lockable_lesson, levels: [@level_group], assessment: true)

get :show, params: {
script_id: @unit.name,
stage_position: @lockable_lesson.absolute_position,
id: @external_sl.position
}

assert_redirected_to '/s/csp2-2020/lockable/1/puzzle/1'

get :show, params: {
script_id: @unit.name,
stage_position: @lockable_lesson.absolute_position,
id: @lockable_level_group_sl.position
}

assert_redirected_to '/s/csp2-2020/lockable/1/puzzle/2/page/1'

get :show, params: {
script_id: @unit.name,
stage_position: @lockable_lesson.absolute_position,
id: @lockable_level_group_sl.position,
puzzle_page: 1
}

assert_redirected_to '/s/csp2-2020/lockable/1/puzzle/2/page/1'
end

test 'should show script level for twenty hour' do
get_show_script_level_page(@script_level)
assert_response :success
Expand Down