fix datafixup to work outside of a transaction

fixes CNVS-7780

test plan:
- specs pass, and running the job manually works

Change-Id: Ib34dd01c08b88e47110548af71c364e7274abeed
Reviewed-on: https://gerrit.instructure.com/23797
Reviewed-by: Rob Orton <rob@instructure.com>
Tested-by: Jenkins <jenkins@instructure.com>
Product-Review: Brian Palmer <brianp@instructure.com>
QA-Review: Brian Palmer <brianp@instructure.com>
QA-Review: Amber Taniuchi <amber@instructure.com>
This commit is contained in:
Simon Williams 2013-08-27 13:18:26 -06:00
parent f5694b8305
commit 6dba1f3701
2 changed files with 97 additions and 38 deletions

View File

@ -1,70 +1,124 @@
module DataFixup::FixOutOfSyncOutcomeAlignments
def self.run
# Active alignments to deleted rubrics
ContentTag.joins("
INNER JOIN rubrics r
ON content_tags.content_id = r.id
AND content_tags.content_type = 'Rubric'
").where("
if Rails.version < '3.0'
scope = ContentTag.scoped(joins:
"INNER JOIN rubrics r
ON content_tags.content_id = r.id
AND content_tags.content_type = 'Rubric'
", select: "content_tags.*")
else
scope = ContentTag.joins("
INNER JOIN rubrics r
ON content_tags.content_id = r.id
AND content_tags.content_type = 'Rubric'
").select("content_tags.*")
end
scope = scope.where("
content_tags.tag_type = 'learning_outcome'
AND content_tags.workflow_state = 'active'
AND r.workflow_state = 'deleted'
").find_each do |ct|
")
scope.find_each do |ct|
ct.destroy
end
# Active alignments to rubrics that should no longer be aligned
ContentTag.joins("
INNER JOIN rubrics r
ON content_tags.content_id = r.id
AND content_tags.content_type = 'Rubric'
").where("
if Rails.version < '3.0'
scope = ContentTag.scoped(joins:
"INNER JOIN rubrics r
ON content_tags.content_id = r.id
AND content_tags.content_type = 'Rubric'
", select: "content_tags.*")
else
scope = ContentTag.joins("
INNER JOIN rubrics r
ON content_tags.content_id = r.id
AND content_tags.content_type = 'Rubric'
").select("content_tags.*")
end
scope = scope.where("
content_tags.tag_type = 'learning_outcome'
AND content_tags.workflow_state = 'active'
AND r.workflow_state = 'active'
AND NOT r.data LIKE '%:learning_outcome_id: ' || content_tags.learning_outcome_id || '%'
").find_each do |ct|
")
scope.find_each do |ct|
ct.destroy
end
# Active alignments to assignments without rubrics
ContentTag.joins("
INNER JOIN assignments a
ON content_tags.content_id = a.id
AND content_tags.content_type = 'Assignment'
LEFT OUTER JOIN rubric_associations ra
ON ra.association_id = a.id
AND ra.association_type = 'Assignment'
").where("
if Rails.version < '3.0'
scope = ContentTag.scoped(joins:
"INNER JOIN assignments a
ON content_tags.content_id = a.id
AND content_tags.content_type = 'Assignment'
LEFT OUTER JOIN rubric_associations ra
ON ra.association_id = a.id
AND ra.association_type = 'Assignment'
", select: "content_tags.*")
else
scope = ContentTag.joins("
INNER JOIN assignments a
ON content_tags.content_id = a.id
AND content_tags.content_type = 'Assignment'
LEFT OUTER JOIN rubric_associations ra
ON ra.association_id = a.id
AND ra.association_type = 'Assignment'
").select("content_tags.*")
end
scope = scope.where("
content_tags.tag_type = 'learning_outcome'
AND content_tags.workflow_state = 'active'
AND ra.id IS NULL
").find_each do |ct|
")
scope.find_each do |ct|
ct.destroy
end
# Active alignments to assignments with rubrics
# that don't have a matching alignment
ContentTag.joins("
INNER JOIN assignments a
ON content_tags.content_id = a.id
AND content_tags.content_type = 'Assignment'
INNER JOIN rubric_associations ra
ON ra.association_id = a.id
AND ra.association_type = 'Assignment'
INNER JOIN rubrics r
ON ra.rubric_id = r.id
LEFT OUTER JOIN content_tags ct2
ON ct2.content_id = r.id
AND ct2.content_type = 'Rubric'
AND ct2.tag_type = 'learning_outcome'
AND ct2.workflow_state = 'active'
AND ct2.learning_outcome_id = content_tags.learning_outcome_id
").where("
if Rails.version < '3.0'
scope = ContentTag.scoped(joins:
"INNER JOIN assignments a
ON content_tags.content_id = a.id
AND content_tags.content_type = 'Assignment'
INNER JOIN rubric_associations ra
ON ra.association_id = a.id
AND ra.association_type = 'Assignment'
INNER JOIN rubrics r
ON ra.rubric_id = r.id
LEFT OUTER JOIN content_tags ct2
ON ct2.content_id = r.id
AND ct2.content_type = 'Rubric'
AND ct2.tag_type = 'learning_outcome'
AND ct2.workflow_state = 'active'
AND ct2.learning_outcome_id = content_tags.learning_outcome_id
", select: "content_tags.*")
else
scope = ContentTag.joins("
INNER JOIN assignments a
ON content_tags.content_id = a.id
AND content_tags.content_type = 'Assignment'
INNER JOIN rubric_associations ra
ON ra.association_id = a.id
AND ra.association_type = 'Assignment'
INNER JOIN rubrics r
ON ra.rubric_id = r.id
LEFT OUTER JOIN content_tags ct2
ON ct2.content_id = r.id
AND ct2.content_type = 'Rubric'
AND ct2.tag_type = 'learning_outcome'
AND ct2.workflow_state = 'active'
AND ct2.learning_outcome_id = content_tags.learning_outcome_id
").select("content_tags.*")
end
scope = scope.where("
content_tags.tag_type = 'learning_outcome'
AND content_tags.workflow_state = 'active'
AND ct2.id IS NULL
").find_each do |ct|
")
scope.find_each do |ct|
ct.destroy
end
end

View File

@ -19,6 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
describe DataFixup::FixOutOfSyncOutcomeAlignments do
self.use_transactional_fixtures = false
before do
course_with_teacher_logged_in(:active_all => true)
@ -81,4 +82,8 @@ describe DataFixup::FixOutOfSyncOutcomeAlignments do
DataFixup::FixOutOfSyncOutcomeAlignments.run
align.reload.should be_deleted
end
after(:all) do
truncate_all_tables
end
end