Keep rich content as-is during classic to new quiz migration

NQ can render and edit content made in Classic.
Simplest way to move CQ rich content to NQ is to
not touch rich content wwhen content stays in course.

closes QUIZ-11030
flag=new_quizzes_migrate_without_content_rewrite

test plan:
- create CQ
- add 1 question
- add rich content: images, videos, links, docs
- click on kebab, click Migrate
- wait, until migration is done
- check the NQ and validate that content is unchanged

2
- export CQ from the course export content menu
- check zip, html fields should contain palceholders

3
- do a course copy
- ContentExport.last
- find the download url
- unzip file and check that placeholders are in content
- check target course and verify links are replaced

4
- do a copy to with the CQ
- go to target course
- check that links are replaced

5
- create a blueprint course
- create a CQ with content
- create a new course
- sync bp into new course
- ensure CQ has updated links

Change-Id: I6ea48e78c2fd1e30c45b7639ba243b3f0d29e039
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/315752
Reviewed-by: Luis Oliveira <luis.oliveira@instructure.com>
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
Reviewed-by: Viktor Szpisják <viktor.szpisjak@instructure.com>
QA-Review: Ferenc Marcsó <ferenc.marcso@instructure.com>
Product-Review: Tamas Balogh <tamas.balogh@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
This commit is contained in:
Rajmund Csehil 2023-04-12 11:36:34 +02:00
parent 8e6da0d0f2
commit 3b1ceec840
10 changed files with 172 additions and 2 deletions

View File

@ -56,4 +56,8 @@ module NewQuizzesFeaturesHelper
def new_quizzes_bank_migrations_enabled?(context = @context)
context.feature_enabled?(:quizzes_next) && context.root_account.feature_enabled?(:new_quizzes_migration) && Account.site_admin.feature_enabled?(:new_quizzes_bank_migrations)
end
def disable_content_rewriting?(context = @context)
context.feature_enabled?(:quizzes_next) && Account.site_admin.feature_enabled?(:new_quizzes_migrate_without_content_rewrite)
end
end

View File

@ -322,6 +322,10 @@ class ContentExport < ActiveRecord::Base
end
end
def disable_content_rewriting?
quizzes_next? && NewQuizzesFeaturesHelper.disable_content_rewriting?(context)
end
def export_quizzes2
mark_exporting
begin

View File

@ -83,3 +83,11 @@ new_quizzes_exports:
display_name: New Quizzes Export Support
description: Support exporting New Quizzes in QTI format
applies_to: SiteAdmin
new_quizzes_migrate_without_content_rewrite:
state: hidden
display_name: New Quizzes Migrate Without Content Rewrite
description: Migrating a single classic quiz will leave HTML rich content fields as-is.
applies_to: SiteAdmin
environments:
development:
state: allowed_on

View File

@ -24,7 +24,7 @@ module CC
ZIP_DIR = "zip_dir"
attr_accessor :course, :user, :export_dir, :manifest, :zip_file, :for_course_copy, :for_master_migration
attr_accessor :course, :user, :export_dir, :manifest, :zip_file, :for_course_copy, :for_master_migration, :disable_content_rewriting
delegate :add_error, :add_item_to_export, to: :@content_export, allow_nil: true
@ -33,6 +33,7 @@ module CC
@course = opts[:course] || @content_export.context
raise "CCExporter supports only Courses" unless @course.is_a?(Course) # a Course is a Course, of course, of course
@disable_content_rewriting = @content_export&.disable_content_rewriting?
@user = opts[:user] || @content_export.user
@export_dir = nil
@manifest = nil

View File

@ -217,6 +217,7 @@ module CC
@for_epub_export = opts[:for_epub_export]
@key_generator = opts[:key_generator] || CC::CCHelper
@referenced_files = {}
@disable_content_rewriting = !!opts[:disable_content_rewriting] || false
@rewriter.set_handler("file_contents") do |match|
if match.url =~ %r{/media_objects/(\d_\w+)}
@ -337,6 +338,8 @@ module CC
end
def html_content(html)
return html if @disable_content_rewriting
html = @rewriter.translate_content(html)
return html if html.blank? || @for_course_copy

View File

@ -35,7 +35,8 @@ module CC
@exporter.user,
key_generator: @exporter,
track_referenced_files: true,
media_object_flavor: Setting.get("exporter_media_object_flavor", nil).presence)
media_object_flavor: Setting.get("exporter_media_object_flavor", nil).presence,
disable_content_rewriting: @exporter.disable_content_rewriting)
end
def export_dir

View File

@ -205,4 +205,50 @@ describe NewQuizzesFeaturesHelper do
expect(new_quizzes_by_default?).to be false
end
end
describe "#disable_content_rewriting?" do
def flag_state(value)
Account.site_admin.set_feature_flag!(:new_quizzes_migrate_without_content_rewrite, value)
end
context "quizzes_next is true" do
before do
allow(@context).to receive(:feature_enabled?).with(:quizzes_next).and_return(true)
end
context "flag is off" do
it "returns false" do
flag_state Feature::STATE_OFF
expect(NewQuizzesFeaturesHelper.disable_content_rewriting?(@context)).to be false
end
end
context "flag is on" do
it "returns true" do
flag_state Feature::STATE_ON
expect(NewQuizzesFeaturesHelper.disable_content_rewriting?(@context)).to be true
end
end
end
context "quizzes_next is false" do
before do
allow(@context).to receive(:feature_enabled?).with(:quizzes_next).and_return(false)
end
context "flag is off" do
it "returns false" do
flag_state Feature::STATE_OFF
expect(NewQuizzesFeaturesHelper.disable_content_rewriting?(@context)).to be false
end
end
context "flag is on" do
it "returns false" do
flag_state Feature::STATE_ON
expect(NewQuizzesFeaturesHelper.disable_content_rewriting?(@context)).to be false
end
end
end
end
end

View File

@ -1092,4 +1092,27 @@ describe "Common Cartridge exporting" do
end
end
end
describe "#disable_content_rewriting" do
subject { cc_exporter.disable_content_rewriting }
let(:content_export) { ContentExport.new(context: course_model) }
let(:cc_exporter) { CC::CCExporter.new(content_export) }
context "ContentExport disable_content_rewriting is true" do
before do
allow(content_export).to receive(:disable_content_rewriting?).and_return true
end
it { is_expected.to be true }
end
context "ContentExport disable_content_rewriting is false" do
before do
allow(content_export).to receive(:disable_content_rewriting?).and_return false
end
it { is_expected.to be false }
end
end
end

View File

@ -319,5 +319,35 @@ describe CC::CCHelper do
HTML
end.not_to raise_error
end
context "disable_content_rewriting is truthy" do
let(:html) { "<p><a href=\"/courses/#{@course.id}/files\">Files tab</a></p>" }
it "skips html rewrite" do
@exporter = CC::CCHelper::HtmlContentExporter.new(@course, @user, disable_content_rewriting: true)
expect(@exporter.html_content(html)).to eq(html)
@exporter = CC::CCHelper::HtmlContentExporter.new(@course, @user, disable_content_rewriting: "false")
expect(@exporter.html_content(html)).to eq(html)
@exporter = CC::CCHelper::HtmlContentExporter.new(@course, @user, disable_content_rewriting: "true")
expect(@exporter.html_content(html)).to eq(html)
@exporter = CC::CCHelper::HtmlContentExporter.new(@course, @user, disable_content_rewriting: 5)
expect(@exporter.html_content(html)).to eq(html)
end
end
context "disable_content_rewriting is false or unset" do
let(:html) { "<p><a href=\"/courses/#{@course.id}/files\">Files tab</a></p>" }
it "does html rewrite" do
@exporter = CC::CCHelper::HtmlContentExporter.new(@course, @user, disable_content_rewriting: false)
expect(@exporter.html_content(html)).to not_eq(html)
@exporter = CC::CCHelper::HtmlContentExporter.new(@course, @user)
expect(@exporter.html_content(html)).to not_eq(html)
end
end
end
end

View File

@ -403,4 +403,54 @@ describe ContentExport do
export.create_key(a)
end
end
describe "#disable_content_rewriting?" do
subject { content_export.disable_content_rewriting? }
def create_content_export(opts = {})
course = course_model
allow(course).to receive(:feature_enabled?).with(:quizzes_next).and_return(true)
ContentExport.new({ context: course }.merge(opts))
end
context "quizzes_next export" do
let(:content_export) { create_content_export(export_type: ContentExport::QUIZZES2, settings: { quizzes2: {} }) }
context "content rewrite is enabled" do
before do
allow(NewQuizzesFeaturesHelper).to receive(:disable_content_rewriting?).and_return false
end
it { is_expected.to be false }
end
context "content rewrite is disabled" do
before do
allow(NewQuizzesFeaturesHelper).to receive(:disable_content_rewriting?).and_return true
end
it { is_expected.to be true }
end
end
context "non-quizzes_next export" do
let(:content_export) { create_content_export(export_type: ContentExport::COURSE_COPY) }
context "content rewrite is enabled" do
before do
allow(NewQuizzesFeaturesHelper).to receive(:disable_content_rewriting?).and_return false
end
it { is_expected.to be false }
end
context "content rewrite is disabled" do
before do
allow(NewQuizzesFeaturesHelper).to receive(:disable_content_rewriting?).and_return true
end
it { is_expected.to be false }
end
end
end
end