canvas_sync 0.20.0 → 0.20.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/canvas_sync/concerns/ability_helper.rb +1 -0
- data/lib/canvas_sync/generators/templates/migrations/create_learning_outcome_results.rb +46 -0
- data/lib/canvas_sync/generators/templates/models/learning_outcome_result.rb +48 -0
- data/lib/canvas_sync/importers/bulk_importer.rb +17 -8
- data/lib/canvas_sync/processors/model_mappings.yml +73 -0
- data/lib/canvas_sync/processors/provisioning_report_processor.rb +4 -0
- data/lib/canvas_sync/record.rb +1 -0
- data/lib/canvas_sync/version.rb +1 -1
- data/lib/canvas_sync.rb +2 -1
- data/spec/canvas_sync/processors/provisioning_report_processor_spec.rb +12 -0
- data/spec/dummy/app/models/learning_outcome_result.rb +54 -0
- data/spec/dummy/db/migrate/20240523101010_create_learning_outcome_results.rb +52 -0
- data/spec/dummy/db/schema.rb +41 -1
- data/spec/support/fixtures/reports/learning_outcome_results.csv +3 -0
- metadata +10 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 43303b8631013b7ccf949d391e027e98fb8c18abfbd36f22cddedc8ee2bfda7d
         | 
| 4 | 
            +
              data.tar.gz: 35ded010f078affa8a164f7168c313318e90c9c1415afbc1c049a059912204d5
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 214cf249fbadc69713bd7a29159874fc64891e886438f72a43f02c08d2f45b46f8d52fd7c3916d12fe260d94f669df42a1f9c46f69c8c56915760fd73878ff14
         | 
| 7 | 
            +
              data.tar.gz: b8c1b5b0038f12a676704e8b957894441f9566dfcfa1a91132436520aa12b0d86590a57f5d74fccc27f769fc82b1530ad908e88693d2213b7888ad739e07a087
         | 
| @@ -0,0 +1,46 @@ | |
| 1 | 
            +
            # <%= autogenerated_migration_warning %>
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class CreateLearningOutcomeResults < ActiveRecord::Migration[5.1]
         | 
| 4 | 
            +
              def change
         | 
| 5 | 
            +
                create_table :learning_outcome_results do |t|
         | 
| 6 | 
            +
                  t.bigint :canvas_id, null: false
         | 
| 7 | 
            +
                  t.bigint :canvas_context_id
         | 
| 8 | 
            +
                  t.string :canvas_context_type
         | 
| 9 | 
            +
                  t.bigint :canvas_association_id
         | 
| 10 | 
            +
                  t.string :canvas_association_type
         | 
| 11 | 
            +
                  t.bigint :canvas_content_tag_id
         | 
| 12 | 
            +
                  t.bigint :canvas_learning_outcome_id
         | 
| 13 | 
            +
                  t.bigint :canvas_user_id
         | 
| 14 | 
            +
                  t.boolean :mastery
         | 
| 15 | 
            +
                  t.boolean :original_mastery
         | 
| 16 | 
            +
                  t.bigint :canvas_artifact_id
         | 
| 17 | 
            +
                  t.string :canvas_artifact_type
         | 
| 18 | 
            +
                  t.datetime :assessed_at
         | 
| 19 | 
            +
                  t.string :title
         | 
| 20 | 
            +
                  t.float :percent
         | 
| 21 | 
            +
                  t.bigint :canvas_associated_asset_id
         | 
| 22 | 
            +
                  t.string :canvas_associated_asset_type
         | 
| 23 | 
            +
                  t.integer :attempt
         | 
| 24 | 
            +
                  t.float :score
         | 
| 25 | 
            +
                  t.float :possible
         | 
| 26 | 
            +
                  t.float :original_score
         | 
| 27 | 
            +
                  t.float :original_possible
         | 
| 28 | 
            +
                  t.string :workflow_state
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  t.timestamps
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                add_index :learning_outcome_results, :canvas_id, unique: true
         | 
| 34 | 
            +
                add_index :learning_outcome_results, %i[
         | 
| 35 | 
            +
                  canvas_user_id
         | 
| 36 | 
            +
                  canvas_content_tag_id
         | 
| 37 | 
            +
                  canvas_association_id
         | 
| 38 | 
            +
                  canvas_association_type
         | 
| 39 | 
            +
                  canvas_associated_asset_id
         | 
| 40 | 
            +
                  canvas_associated_asset_type
         | 
| 41 | 
            +
                ], unique: true, name: :index_learning_outcome_results_association
         | 
| 42 | 
            +
                add_index :learning_outcome_results, :canvas_content_tag_id
         | 
| 43 | 
            +
                add_index :learning_outcome_results, :canvas_learning_outcome_id
         | 
| 44 | 
            +
                add_index :learning_outcome_results, %i[canvas_artifact_id canvas_artifact_type], name: :index_learning_outcome_results_on_canvas_arid_and_artype
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
            end
         | 
| @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # # <%= autogenerated_model_warning %>
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class LearningOutcomeResult < ActiveRecord::Base
         | 
| 6 | 
            +
              include CanvasSync::Record
         | 
| 7 | 
            +
              include CanvasSync::Concerns::ApiSyncable
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              belongs_to :user, primary_key: :canvas_id, foreign_key: :canvas_user_id, optional: true
         | 
| 10 | 
            +
              belongs_to :learning_outcome, primary_key: :canvas_id, foreign_key: :canvas_learning_outcome_id, optional: true
         | 
| 11 | 
            +
              belongs_to :alignment, class_name: "ContentTag", primary_key: :canvas_id, foreign_key: :canvas_content_tag_id, optional: true
         | 
| 12 | 
            +
              belongs_to :association_object,
         | 
| 13 | 
            +
                         polymorphic: [:rubric_association, :assignment],
         | 
| 14 | 
            +
                         foreign_key: :association_id,
         | 
| 15 | 
            +
                         foreign_type: :association_type,
         | 
| 16 | 
            +
                         optional: true
         | 
| 17 | 
            +
              belongs_to :artifact,
         | 
| 18 | 
            +
                        polymorphic: [:rubric_assessment, :submission],
         | 
| 19 | 
            +
                        primary_key: :canvas_artifact_id,
         | 
| 20 | 
            +
                        foreign_key: :canvas_artifact_id,
         | 
| 21 | 
            +
                        foreign_type: :canvas_artifact_type,
         | 
| 22 | 
            +
                        optional: true
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              belongs_to :context, polymorphic: [:course], primary_key: :canvas_id, foreign_key: :canvas_context_id, foreign_type: :canvas_context_type, optional: true
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              # Not yet implemented in CanvasSync
         | 
| 27 | 
            +
              # belongs_to :associated_asset,
         | 
| 28 | 
            +
              #           polymorphic:
         | 
| 29 | 
            +
              #                 [:assessment_question,
         | 
| 30 | 
            +
              #                  :assignment,
         | 
| 31 | 
            +
              #                  { quiz: "Quizzes::Quiz", assessment: "LiveAssessments::Assessment" }],
         | 
| 32 | 
            +
              #           polymorphic_prefix: true
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              # Not yet implemented in CanvasSync
         | 
| 35 | 
            +
              # has_many :learning_outcome_question_results, dependent: :destroy
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              api_syncable({
         | 
| 38 | 
            +
                canvas_id: :id,
         | 
| 39 | 
            +
                canvas_content_tag_id: :links&.[]("alignment"),
         | 
| 40 | 
            +
                canvas_learning_outcome_id: :links&.[]("learning_outcome"),
         | 
| 41 | 
            +
                canvas_user_id: :links&.[]("user"),
         | 
| 42 | 
            +
                score: :score,
         | 
| 43 | 
            +
                assessed_at: :submitted_or_assessed_at,
         | 
| 44 | 
            +
                percent: :percent
         | 
| 45 | 
            +
              }, ->(api) {
         | 
| 46 | 
            +
                api.get("/api/v1/courses/#{self.canvas_context_id}/#{self.canvas_id}")&.find { |item| item[:id] == self.canvas_id }
         | 
| 47 | 
            +
              })
         | 
| 48 | 
            +
            end
         | 
| @@ -102,15 +102,24 @@ module CanvasSync | |
| 102 102 | 
             
                    options = { validate: false, on_duplicate_key_update: update_conditions }.merge(import_args)
         | 
| 103 103 | 
             
                    options.delete(:on_duplicate_key_update) if options.key?(:on_duplicate_key_ignore)
         | 
| 104 104 |  | 
| 105 | 
            -
                    result =  | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 108 | 
            -
                       | 
| 109 | 
            -
                       | 
| 105 | 
            +
                    result = nil
         | 
| 106 | 
            +
                    callback_env = {
         | 
| 107 | 
            +
                      batch: rows,
         | 
| 108 | 
            +
                      import_result: nil,
         | 
| 109 | 
            +
                      import_options: options,
         | 
| 110 110 | 
             
                    }
         | 
| 111 | 
            -
                     | 
| 112 | 
            -
             | 
| 113 | 
            -
                       | 
| 111 | 
            +
                    ClassCallbackExecutor.run_if_defined(klass, :sync_batch_import, env: callback_env) do
         | 
| 112 | 
            +
                      result = klass.import(columns, rows, options)
         | 
| 113 | 
            +
                      callback_env[:import_result] = result
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                      global_updates = {
         | 
| 116 | 
            +
                        canvas_synced_at: DateTime.now,
         | 
| 117 | 
            +
                        canvas_sync_batch_id: JobBatches::Batch.current_context[:sync_batch_id],
         | 
| 118 | 
            +
                      }
         | 
| 119 | 
            +
                      global_updates.slice!(*klass.column_names.map(&:to_sym))
         | 
| 120 | 
            +
                      if global_updates.present? && result.ids.present?
         | 
| 121 | 
            +
                        klass.where(id: result.ids).update_all(global_updates)
         | 
| 122 | 
            +
                      end
         | 
| 114 123 | 
             
                    end
         | 
| 115 124 |  | 
| 116 125 | 
             
                    result
         | 
| @@ -569,6 +569,79 @@ learning_outcomes: | |
| 569 569 | 
             
                  database_column_name: short_description
         | 
| 570 570 | 
             
                  type: text
         | 
| 571 571 |  | 
| 572 | 
            +
            learning_outcome_results:
         | 
| 573 | 
            +
              conflict_target: id
         | 
| 574 | 
            +
              report_columns:
         | 
| 575 | 
            +
                id:
         | 
| 576 | 
            +
                  database_column_name: canvas_id
         | 
| 577 | 
            +
                  type: integer
         | 
| 578 | 
            +
                context_id:
         | 
| 579 | 
            +
                  database_column_name: canvas_context_id
         | 
| 580 | 
            +
                  type: integer
         | 
| 581 | 
            +
                context_type:
         | 
| 582 | 
            +
                  database_column_name: canvas_context_type
         | 
| 583 | 
            +
                  type: string
         | 
| 584 | 
            +
                association_id:
         | 
| 585 | 
            +
                  database_column_name: canvas_association_id
         | 
| 586 | 
            +
                  type: integer
         | 
| 587 | 
            +
                association_type:
         | 
| 588 | 
            +
                  database_column_name: canvas_association_type
         | 
| 589 | 
            +
                  type: string
         | 
| 590 | 
            +
                content_tag_id:
         | 
| 591 | 
            +
                  database_column_name: canvas_content_tag_id
         | 
| 592 | 
            +
                  type: integer
         | 
| 593 | 
            +
                learning_outcome_id:
         | 
| 594 | 
            +
                  database_column_name: canvas_learning_outcome_id
         | 
| 595 | 
            +
                  type: integer
         | 
| 596 | 
            +
                user_id:
         | 
| 597 | 
            +
                  database_column_name: canvas_user_id
         | 
| 598 | 
            +
                  type: integer
         | 
| 599 | 
            +
                mastery:
         | 
| 600 | 
            +
                  database_column_name: mastery
         | 
| 601 | 
            +
                  type: boolean
         | 
| 602 | 
            +
                original_mastery:
         | 
| 603 | 
            +
                  database_column_name: original_mastery
         | 
| 604 | 
            +
                  type: boolean
         | 
| 605 | 
            +
                artifact_id:
         | 
| 606 | 
            +
                  database_column_name: canvas_artifact_id
         | 
| 607 | 
            +
                  type: integer
         | 
| 608 | 
            +
                artifact_type:
         | 
| 609 | 
            +
                  database_column_name: canvas_artifact_type
         | 
| 610 | 
            +
                  type: string
         | 
| 611 | 
            +
                assessed_at:
         | 
| 612 | 
            +
                  database_column_name: assessed_at
         | 
| 613 | 
            +
                  type: datetime
         | 
| 614 | 
            +
                title:
         | 
| 615 | 
            +
                  database_column_name: title
         | 
| 616 | 
            +
                  type: string
         | 
| 617 | 
            +
                percent:
         | 
| 618 | 
            +
                  database_column_name: percent
         | 
| 619 | 
            +
                  type: float
         | 
| 620 | 
            +
                associated_asset_id:
         | 
| 621 | 
            +
                  database_column_name: canvas_associated_asset_id
         | 
| 622 | 
            +
                  type: integer
         | 
| 623 | 
            +
                associated_asset_type:
         | 
| 624 | 
            +
                  database_column_name: canvas_associated_asset_type
         | 
| 625 | 
            +
                  type: string
         | 
| 626 | 
            +
                attempt:
         | 
| 627 | 
            +
                  database_column_name: attempt
         | 
| 628 | 
            +
                  type: integer
         | 
| 629 | 
            +
                score:
         | 
| 630 | 
            +
                  database_column_name: score
         | 
| 631 | 
            +
                  type: float
         | 
| 632 | 
            +
                possible:
         | 
| 633 | 
            +
                  database_column_name: possible
         | 
| 634 | 
            +
                  type: float
         | 
| 635 | 
            +
                original_score:
         | 
| 636 | 
            +
                  database_column_name: original_score
         | 
| 637 | 
            +
                  type: float
         | 
| 638 | 
            +
                original_possible:
         | 
| 639 | 
            +
                  database_column_name: original_possible
         | 
| 640 | 
            +
                  type: float
         | 
| 641 | 
            +
                workflow_state:
         | 
| 642 | 
            +
                  database_column_name: workflow_state
         | 
| 643 | 
            +
                  type: string
         | 
| 644 | 
            +
             | 
| 572 645 | 
             
            course_nicknames:
         | 
| 573 646 | 
             
              conflict_target:
         | 
| 574 647 | 
             
                - canvas_user_id
         | 
| @@ -124,6 +124,10 @@ module CanvasSync | |
| 124 124 | 
             
                    end
         | 
| 125 125 | 
             
                  end
         | 
| 126 126 |  | 
| 127 | 
            +
                  def bulk_process_learning_outcome_results(report_file_path)
         | 
| 128 | 
            +
                    do_bulk_import(report_file_path, LearningOutcomeResult, options: @options)
         | 
| 129 | 
            +
                  end
         | 
| 130 | 
            +
             | 
| 127 131 | 
             
                  def bulk_process_course_nicknames(report_file_path)
         | 
| 128 132 | 
             
                    exists = []
         | 
| 129 133 | 
             
                    do_bulk_import(report_file_path, CourseNickname, options: @options) do |row|
         | 
    
        data/lib/canvas_sync/record.rb
    CHANGED
    
    
    
        data/lib/canvas_sync/version.rb
    CHANGED
    
    
    
        data/lib/canvas_sync.rb
    CHANGED
    
    | @@ -46,6 +46,7 @@ module CanvasSync | |
| 46 46 | 
             
                grading_period_groups
         | 
| 47 47 | 
             
                content_migrations
         | 
| 48 48 | 
             
                learning_outcomes
         | 
| 49 | 
            +
                learning_outcome_results
         | 
| 49 50 | 
             
                course_nicknames
         | 
| 50 51 | 
             
                rubrics
         | 
| 51 52 | 
             
                rubric_associations
         | 
| @@ -214,7 +215,7 @@ module CanvasSync | |
| 214 215 | 
             
                  end
         | 
| 215 216 |  | 
| 216 217 | 
             
                  current_chain.insert(
         | 
| 217 | 
            -
                    generate_provisioning_jobs(models, options)
         | 
| 218 | 
            +
                    generate_provisioning_jobs(models - ['terms'], options)
         | 
| 218 219 | 
             
                  )
         | 
| 219 220 |  | 
| 220 221 | 
             
                  # Skip syncing terms if not required
         | 
| @@ -131,6 +131,18 @@ RSpec.describe CanvasSync::Processors::ProvisioningReportProcessor do | |
| 131 131 | 
             
                  }.to change { LearningOutcome.count }.by(2)
         | 
| 132 132 | 
             
                end
         | 
| 133 133 |  | 
| 134 | 
            +
                it 'processes learning_outcome_results' do
         | 
| 135 | 
            +
                  expect {
         | 
| 136 | 
            +
                    subject.process('spec/support/fixtures/reports/learning_outcome_results.csv', { models: ['learning_outcome_results'] }, 1)
         | 
| 137 | 
            +
                  }.to change { LearningOutcomeResult.count }.by(2)
         | 
| 138 | 
            +
             | 
| 139 | 
            +
                  columns = LearningOutcomeResult.attribute_names - ['id', 'created_at', 'updated_at']
         | 
| 140 | 
            +
                  expect(LearningOutcomeResult.all.pluck(columns.join(','))).to eq([
         | 
| 141 | 
            +
                    [1, 1, 'Course', 1, 'RubricAssociation', 1, 1, 1, true, true, 1, 'RubricAssessment', '2012-01-01T00:00:00Z', 'Learning Outcome Result 1', 1.0, 1, 'LearningOutcomeGroup', 1, 5.0, 5.0, 5.0, 5.0, 'active'],
         | 
| 142 | 
            +
                    [2, 2, 'Course', 2, 'RubricAssociation', 2, 2, 2, true, true, 2, 'RubricAssessment', '2013-01-01T00:00:00Z', 'Learning Outcome Result 2', 2.0, 2, 'LearningOutcomeGroup', 1, 10.0, 10.0, 10.0, 10.0, 'active']
         | 
| 143 | 
            +
                  ])
         | 
| 144 | 
            +
                end
         | 
| 145 | 
            +
             | 
| 134 146 | 
             
                it 'processes course_nicknames' do
         | 
| 135 147 | 
             
                  CourseNickname.create(canvas_user_preference_value_id: 42, canvas_course_id: 42, canvas_user_id: 42, nickname: 'test')
         | 
| 136 148 | 
             
                  expect(CourseNickname.all.pluck(:canvas_user_preference_value_id)).to include(42)
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # # #
         | 
| 4 | 
            +
            # AUTO GENERATED MIGRATION
         | 
| 5 | 
            +
            # This migration was auto generated by the CanvasSync Gem.
         | 
| 6 | 
            +
            # You can add new columns to this table, but removing or
         | 
| 7 | 
            +
            # re-naming ones created here may break Canvas Syncing.
         | 
| 8 | 
            +
            #
         | 
| 9 | 
            +
             | 
| 10 | 
            +
             | 
| 11 | 
            +
            class LearningOutcomeResult < ActiveRecord::Base
         | 
| 12 | 
            +
              include CanvasSync::Record
         | 
| 13 | 
            +
              include CanvasSync::Concerns::ApiSyncable
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              belongs_to :user, primary_key: :canvas_id, foreign_key: :canvas_user_id, optional: true
         | 
| 16 | 
            +
              belongs_to :learning_outcome, primary_key: :canvas_id, foreign_key: :canvas_learning_outcome_id, optional: true
         | 
| 17 | 
            +
              belongs_to :alignment, class_name: "ContentTag", primary_key: :canvas_id, foreign_key: :canvas_content_tag_id, optional: true
         | 
| 18 | 
            +
              belongs_to :association_object,
         | 
| 19 | 
            +
                         polymorphic: [:rubric_association, :assignment],
         | 
| 20 | 
            +
                         foreign_key: :association_id,
         | 
| 21 | 
            +
                         foreign_type: :association_type,
         | 
| 22 | 
            +
                         optional: true
         | 
| 23 | 
            +
              belongs_to :artifact,
         | 
| 24 | 
            +
                        polymorphic: [:rubric_assessment, :submission],
         | 
| 25 | 
            +
                        primary_key: :canvas_artifact_id,
         | 
| 26 | 
            +
                        foreign_key: :canvas_artifact_id,
         | 
| 27 | 
            +
                        foreign_type: :canvas_artifact_type,
         | 
| 28 | 
            +
                        optional: true
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              belongs_to :context, polymorphic: [:course], primary_key: :canvas_id, foreign_key: :canvas_context_id, foreign_type: :canvas_context_type, optional: true
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              # Not yet implemented in CanvasSync
         | 
| 33 | 
            +
              # belongs_to :associated_asset,
         | 
| 34 | 
            +
              #           polymorphic:
         | 
| 35 | 
            +
              #                 [:assessment_question,
         | 
| 36 | 
            +
              #                  :assignment,
         | 
| 37 | 
            +
              #                  { quiz: "Quizzes::Quiz", assessment: "LiveAssessments::Assessment" }],
         | 
| 38 | 
            +
              #           polymorphic_prefix: true
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              # Not yet implemented in CanvasSync
         | 
| 41 | 
            +
              # has_many :learning_outcome_question_results, dependent: :destroy
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              api_syncable({
         | 
| 44 | 
            +
                canvas_id: :id,
         | 
| 45 | 
            +
                canvas_content_tag_id: :links&.[]("alignment"),
         | 
| 46 | 
            +
                canvas_learning_outcome_id: :links&.[]("learning_outcome"),
         | 
| 47 | 
            +
                canvas_user_id: :links&.[]("user"),
         | 
| 48 | 
            +
                score: :score,
         | 
| 49 | 
            +
                assessed_at: :submitted_or_assessed_at,
         | 
| 50 | 
            +
                percent: :percent
         | 
| 51 | 
            +
              }, ->(api) {
         | 
| 52 | 
            +
                api.get("/api/v1/courses/#{self.canvas_context_id}/#{self.canvas_id}")&.find { |item| item[:id] == self.canvas_id }
         | 
| 53 | 
            +
              })
         | 
| 54 | 
            +
            end
         | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            # #
         | 
| 2 | 
            +
            # AUTO GENERATED MIGRATION
         | 
| 3 | 
            +
            # This migration was auto generated by the CanvasSync Gem.
         | 
| 4 | 
            +
            # You can add new columns to this table, but removing or
         | 
| 5 | 
            +
            # re-naming ones created here may break Canvas Syncing.
         | 
| 6 | 
            +
            #
         | 
| 7 | 
            +
             | 
| 8 | 
            +
             | 
| 9 | 
            +
            class CreateLearningOutcomeResults < ActiveRecord::Migration[5.1]
         | 
| 10 | 
            +
              def change
         | 
| 11 | 
            +
                create_table :learning_outcome_results do |t|
         | 
| 12 | 
            +
                  t.bigint :canvas_id, null: false
         | 
| 13 | 
            +
                  t.bigint :canvas_context_id
         | 
| 14 | 
            +
                  t.string :canvas_context_type
         | 
| 15 | 
            +
                  t.bigint :canvas_association_id
         | 
| 16 | 
            +
                  t.string :canvas_association_type
         | 
| 17 | 
            +
                  t.bigint :canvas_content_tag_id
         | 
| 18 | 
            +
                  t.bigint :canvas_learning_outcome_id
         | 
| 19 | 
            +
                  t.bigint :canvas_user_id
         | 
| 20 | 
            +
                  t.boolean :mastery
         | 
| 21 | 
            +
                  t.boolean :original_mastery
         | 
| 22 | 
            +
                  t.bigint :canvas_artifact_id
         | 
| 23 | 
            +
                  t.string :canvas_artifact_type
         | 
| 24 | 
            +
                  t.datetime :assessed_at
         | 
| 25 | 
            +
                  t.string :title
         | 
| 26 | 
            +
                  t.float :percent
         | 
| 27 | 
            +
                  t.bigint :canvas_associated_asset_id
         | 
| 28 | 
            +
                  t.string :canvas_associated_asset_type
         | 
| 29 | 
            +
                  t.integer :attempt
         | 
| 30 | 
            +
                  t.float :score
         | 
| 31 | 
            +
                  t.float :possible
         | 
| 32 | 
            +
                  t.float :original_score
         | 
| 33 | 
            +
                  t.float :original_possible
         | 
| 34 | 
            +
                  t.string :workflow_state
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  t.timestamps
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                add_index :learning_outcome_results, :canvas_id, unique: true
         | 
| 40 | 
            +
                add_index :learning_outcome_results, %i[
         | 
| 41 | 
            +
                  canvas_user_id
         | 
| 42 | 
            +
                  canvas_content_tag_id
         | 
| 43 | 
            +
                  canvas_association_id
         | 
| 44 | 
            +
                  canvas_association_type
         | 
| 45 | 
            +
                  canvas_associated_asset_id
         | 
| 46 | 
            +
                  canvas_associated_asset_type
         | 
| 47 | 
            +
                ], unique: true, name: :index_learning_outcome_results_association
         | 
| 48 | 
            +
                add_index :learning_outcome_results, :canvas_content_tag_id
         | 
| 49 | 
            +
                add_index :learning_outcome_results, :canvas_learning_outcome_id
         | 
| 50 | 
            +
                add_index :learning_outcome_results, %i[canvas_artifact_id canvas_artifact_type], name: :index_learning_outcome_results_on_canvas_arid_and_artype
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
            end
         | 
    
        data/spec/dummy/db/schema.rb
    CHANGED
    
    | @@ -10,7 +10,7 @@ | |
| 10 10 | 
             
            #
         | 
| 11 11 | 
             
            # It's strongly recommended that you check this file into your version control system.
         | 
| 12 12 |  | 
| 13 | 
            -
            ActiveRecord::Schema.define(version:  | 
| 13 | 
            +
            ActiveRecord::Schema.define(version: 2024_05_23_101010) do
         | 
| 14 14 |  | 
| 15 15 | 
             
              # These are extensions that must be enabled in order to support this database
         | 
| 16 16 | 
             
              enable_extension "plpgsql"
         | 
| @@ -282,6 +282,46 @@ ActiveRecord::Schema.define(version: 2024_05_10_101100) do | |
| 282 282 | 
             
                t.index ["canvas_id"], name: "index_learning_outcomes_on_canvas_id", unique: true
         | 
| 283 283 | 
             
              end
         | 
| 284 284 |  | 
| 285 | 
            +
              create_table "learning_outcome_results", force: :cascade do |t|
         | 
| 286 | 
            +
                t.bigint "canvas_id",  null: false
         | 
| 287 | 
            +
                t.bigint "canvas_context_id"
         | 
| 288 | 
            +
                t.string "canvas_context_type"
         | 
| 289 | 
            +
                t.bigint "canvas_association_id"
         | 
| 290 | 
            +
                t.string "canvas_association_type"
         | 
| 291 | 
            +
                t.bigint "canvas_content_tag_id"
         | 
| 292 | 
            +
                t.bigint "canvas_learning_outcome_id"
         | 
| 293 | 
            +
                t.bigint "canvas_user_id"
         | 
| 294 | 
            +
                t.boolean "mastery"
         | 
| 295 | 
            +
                t.boolean "original_mastery"
         | 
| 296 | 
            +
                t.bigint "canvas_artifact_id"
         | 
| 297 | 
            +
                t.string "canvas_artifact_type"
         | 
| 298 | 
            +
                t.datetime "assessed_at"
         | 
| 299 | 
            +
                t.string "title"
         | 
| 300 | 
            +
                t.float "percent"
         | 
| 301 | 
            +
                t.bigint "canvas_associated_asset_id"
         | 
| 302 | 
            +
                t.string "canvas_associated_asset_type"
         | 
| 303 | 
            +
                t.integer "attempt"
         | 
| 304 | 
            +
                t.float "score"
         | 
| 305 | 
            +
                t.float "possible"
         | 
| 306 | 
            +
                t.float "original_score"
         | 
| 307 | 
            +
                t.float "original_possible"
         | 
| 308 | 
            +
                t.string "workflow_state"
         | 
| 309 | 
            +
                t.datetime "created_at", null: false
         | 
| 310 | 
            +
                t.datetime "updated_at", null: false
         | 
| 311 | 
            +
                t.index "canvas_id", unique: true
         | 
| 312 | 
            +
                t.index [
         | 
| 313 | 
            +
                  "canvas_user_id",
         | 
| 314 | 
            +
                  "canvas_content_tag_id",
         | 
| 315 | 
            +
                  "canvas_association_id",
         | 
| 316 | 
            +
                  "canvas_association_type",
         | 
| 317 | 
            +
                  "canvas_associated_asset_id",
         | 
| 318 | 
            +
                  "canvas_associated_asset_type"
         | 
| 319 | 
            +
                ], unique: true, name: 'index_learning_outcome_results_association'
         | 
| 320 | 
            +
                t.index "canvas_content_tag_id"
         | 
| 321 | 
            +
                t.index "canvas_learning_outcome_id"
         | 
| 322 | 
            +
                t.index ["canvas_artifact_id", "canvas_artifact_type"], name: "index_learning_outcome_results_on_canvas_arid_and_artype"
         | 
| 323 | 
            +
              end
         | 
| 324 | 
            +
             | 
| 285 325 | 
             
              create_table "pseudonyms", force: :cascade do |t|
         | 
| 286 326 | 
             
                t.bigint "canvas_id", null: false
         | 
| 287 327 | 
             
                t.bigint "canvas_user_id"
         | 
| @@ -0,0 +1,3 @@ | |
| 1 | 
            +
            id,context_id,context_type,association_id,association_type,content_tag_id,learning_outcome_id,user_id,mastery,original_mastery,artifact_id,artifact_type,assessed_at,title,percent,associated_asset_id,associated_asset_type,attempt,score,possible,original_score,original_possible,workflow_state
         | 
| 2 | 
            +
            1,1,Course,1,RubricAssociation,1,1,1,true,true,1,RubricAssessment,2012-01-01T00:00:00Z,Learning Outcome Result 1,1.0,1,LearningOutcomeGroup,1,5.0,5.0,5.0,5.0,active
         | 
| 3 | 
            +
            2,2,Course,2,RubricAssociation,2,2,2,true,true,2,RubricAssessment,2013-01-01T00:00:00Z,Learning Outcome Result 2,2.0,2,LearningOutcomeGroup,1,10.0,10.0,10.0,10.0,active
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: canvas_sync
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.20. | 
| 4 | 
            +
              version: 0.20.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Instructure CustomDev
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024-05- | 
| 11 | 
            +
            date: 2024-05-30 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rails
         | 
| @@ -437,6 +437,7 @@ files: | |
| 437 437 | 
             
            - lib/canvas_sync/generators/templates/migrations/create_grading_periods.rb
         | 
| 438 438 | 
             
            - lib/canvas_sync/generators/templates/migrations/create_group_memberships.rb
         | 
| 439 439 | 
             
            - lib/canvas_sync/generators/templates/migrations/create_groups.rb
         | 
| 440 | 
            +
            - lib/canvas_sync/generators/templates/migrations/create_learning_outcome_results.rb
         | 
| 440 441 | 
             
            - lib/canvas_sync/generators/templates/migrations/create_learning_outcomes.rb
         | 
| 441 442 | 
             
            - lib/canvas_sync/generators/templates/migrations/create_pseudonyms.rb
         | 
| 442 443 | 
             
            - lib/canvas_sync/generators/templates/migrations/create_roles.rb
         | 
| @@ -463,6 +464,7 @@ files: | |
| 463 464 | 
             
            - lib/canvas_sync/generators/templates/models/group.rb
         | 
| 464 465 | 
             
            - lib/canvas_sync/generators/templates/models/group_membership.rb
         | 
| 465 466 | 
             
            - lib/canvas_sync/generators/templates/models/learning_outcome.rb
         | 
| 467 | 
            +
            - lib/canvas_sync/generators/templates/models/learning_outcome_result.rb
         | 
| 466 468 | 
             
            - lib/canvas_sync/generators/templates/models/pseudonym.rb
         | 
| 467 469 | 
             
            - lib/canvas_sync/generators/templates/models/role.rb
         | 
| 468 470 | 
             
            - lib/canvas_sync/generators/templates/models/rubric.rb
         | 
| @@ -621,6 +623,7 @@ files: | |
| 621 623 | 
             
            - spec/dummy/app/models/group.rb
         | 
| 622 624 | 
             
            - spec/dummy/app/models/group_membership.rb
         | 
| 623 625 | 
             
            - spec/dummy/app/models/learning_outcome.rb
         | 
| 626 | 
            +
            - spec/dummy/app/models/learning_outcome_result.rb
         | 
| 624 627 | 
             
            - spec/dummy/app/models/pseudonym.rb
         | 
| 625 628 | 
             
            - spec/dummy/app/models/role.rb
         | 
| 626 629 | 
             
            - spec/dummy/app/models/rubric.rb
         | 
| @@ -698,6 +701,7 @@ files: | |
| 698 701 | 
             
            - spec/dummy/db/migrate/20240509105100_create_rubrics.rb
         | 
| 699 702 | 
             
            - spec/dummy/db/migrate/20240510094100_create_rubric_associations.rb
         | 
| 700 703 | 
             
            - spec/dummy/db/migrate/20240510101100_create_rubric_assessments.rb
         | 
| 704 | 
            +
            - spec/dummy/db/migrate/20240523101010_create_learning_outcome_results.rb
         | 
| 701 705 | 
             
            - spec/dummy/db/schema.rb
         | 
| 702 706 | 
             
            - spec/factories/account_factory.rb
         | 
| 703 707 | 
             
            - spec/factories/admin_factory.rb
         | 
| @@ -749,6 +753,7 @@ files: | |
| 749 753 | 
             
            - spec/support/fixtures/reports/grading_periods.csv
         | 
| 750 754 | 
             
            - spec/support/fixtures/reports/group_memberships.csv
         | 
| 751 755 | 
             
            - spec/support/fixtures/reports/groups.csv
         | 
| 756 | 
            +
            - spec/support/fixtures/reports/learning_outcome_results.csv
         | 
| 752 757 | 
             
            - spec/support/fixtures/reports/learning_outcomes.csv
         | 
| 753 758 | 
             
            - spec/support/fixtures/reports/provisioning_csv
         | 
| 754 759 | 
             
            - spec/support/fixtures/reports/provisioning_csv_unzipped/courses.csv
         | 
| @@ -866,6 +871,7 @@ test_files: | |
| 866 871 | 
             
            - spec/support/fixtures/reports/group_memberships.csv
         | 
| 867 872 | 
             
            - spec/support/fixtures/reports/rubric_assessments.csv
         | 
| 868 873 | 
             
            - spec/support/fixtures/reports/enrollments.csv
         | 
| 874 | 
            +
            - spec/support/fixtures/reports/learning_outcome_results.csv
         | 
| 869 875 | 
             
            - spec/support/fixtures/reports/course_nicknames.csv
         | 
| 870 876 | 
             
            - spec/support/fixtures/reports/provisioning_csv
         | 
| 871 877 | 
             
            - spec/support/fixtures/reports/grading_periods.csv
         | 
| @@ -896,6 +902,7 @@ test_files: | |
| 896 902 | 
             
            - spec/dummy/db/migrate/20190927204545_create_roles.rb
         | 
| 897 903 | 
             
            - spec/dummy/db/migrate/20190702203622_create_accounts.rb
         | 
| 898 904 | 
             
            - spec/dummy/db/migrate/20190702203626_create_assignments.rb
         | 
| 905 | 
            +
            - spec/dummy/db/migrate/20240523101010_create_learning_outcome_results.rb
         | 
| 899 906 | 
             
            - spec/dummy/db/migrate/20200415171620_create_groups.rb
         | 
| 900 907 | 
             
            - spec/dummy/db/migrate/20190927204546_create_admins.rb
         | 
| 901 908 | 
             
            - spec/dummy/db/migrate/20190702203625_create_sections.rb
         | 
| @@ -946,6 +953,7 @@ test_files: | |
| 946 953 | 
             
            - spec/dummy/app/models/admin.rb
         | 
| 947 954 | 
             
            - spec/dummy/app/models/rubric_assessment.rb
         | 
| 948 955 | 
             
            - spec/dummy/app/models/learning_outcome.rb
         | 
| 956 | 
            +
            - spec/dummy/app/models/learning_outcome_result.rb
         | 
| 949 957 | 
             
            - spec/dummy/app/models/grading_period.rb
         | 
| 950 958 | 
             
            - spec/dummy/app/models/context_module.rb
         | 
| 951 959 | 
             
            - spec/dummy/app/models/context_module_item.rb
         |