canvas_sync 0.27.13 → 0.27.14

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.
Files changed (232) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/canvas_sync/api/v1/health_check_controller.rb +0 -0
  3. data/app/models/canvas_sync/job_log.rb +0 -0
  4. data/app/models/canvas_sync/sync_batch.rb +0 -0
  5. data/config/initializers/apartment.rb +0 -0
  6. data/config/routes.rb +0 -0
  7. data/db/migrate/20170915210836_create_canvas_sync_job_log.rb +0 -0
  8. data/db/migrate/20180725155729_add_job_id_to_canvas_sync_job_logs.rb +0 -0
  9. data/db/migrate/20190916154829_add_fork_count_to_canvas_sync_job_logs.rb +0 -0
  10. data/db/migrate/20201018210836_create_canvas_sync_sync_batches.rb +0 -0
  11. data/db/migrate/20201030210836_add_full_sync_to_canvas_sync_sync_batch.rb +0 -0
  12. data/lib/canvas_sync/api_syncable.rb +0 -0
  13. data/lib/canvas_sync/batch_processor.rb +0 -0
  14. data/lib/canvas_sync/class_callback_executor.rb +0 -0
  15. data/lib/canvas_sync/concerns/ability_helper.rb +43 -2
  16. data/lib/canvas_sync/concerns/account/ancestry.rb +0 -0
  17. data/lib/canvas_sync/concerns/account/base.rb +0 -0
  18. data/lib/canvas_sync/concerns/api_syncable.rb +0 -0
  19. data/lib/canvas_sync/concerns/canvas_id_as_primary.rb +0 -0
  20. data/lib/canvas_sync/concerns/jit_syncing.rb +0 -0
  21. data/lib/canvas_sync/concerns/legacy_columns.rb +0 -0
  22. data/lib/canvas_sync/concerns/role/base.rb +0 -0
  23. data/lib/canvas_sync/generators/install_generator.rb +0 -0
  24. data/lib/canvas_sync/generators/install_live_events_generator.rb +0 -0
  25. data/lib/canvas_sync/generators/templates/migrations/create_accounts.rb +0 -0
  26. data/lib/canvas_sync/generators/templates/migrations/create_admins.rb +0 -0
  27. data/lib/canvas_sync/generators/templates/migrations/create_assignment_groups.rb +0 -0
  28. data/lib/canvas_sync/generators/templates/migrations/create_assignments.rb +0 -0
  29. data/lib/canvas_sync/generators/templates/migrations/create_content_migrations.rb +0 -0
  30. data/lib/canvas_sync/generators/templates/migrations/create_context_module_items.rb +0 -0
  31. data/lib/canvas_sync/generators/templates/migrations/create_context_modules.rb +0 -0
  32. data/lib/canvas_sync/generators/templates/migrations/create_course_nicknames.rb +0 -0
  33. data/lib/canvas_sync/generators/templates/migrations/create_course_progresses.rb +0 -0
  34. data/lib/canvas_sync/generators/templates/migrations/create_grading_period_groups.rb +0 -0
  35. data/lib/canvas_sync/generators/templates/migrations/create_grading_periods.rb +0 -0
  36. data/lib/canvas_sync/generators/templates/migrations/create_group_memberships.rb +0 -0
  37. data/lib/canvas_sync/generators/templates/migrations/create_groups.rb +0 -0
  38. data/lib/canvas_sync/generators/templates/migrations/create_learning_outcome_results.rb +0 -0
  39. data/lib/canvas_sync/generators/templates/migrations/create_learning_outcomes.rb +0 -0
  40. data/lib/canvas_sync/generators/templates/migrations/create_pseudonyms.rb +0 -0
  41. data/lib/canvas_sync/generators/templates/migrations/create_rubric_assessments.rb +0 -0
  42. data/lib/canvas_sync/generators/templates/migrations/create_rubric_associations.rb +0 -0
  43. data/lib/canvas_sync/generators/templates/migrations/create_rubrics.rb +0 -0
  44. data/lib/canvas_sync/generators/templates/migrations/create_sections.rb +0 -0
  45. data/lib/canvas_sync/generators/templates/migrations/create_submissions.rb +0 -0
  46. data/lib/canvas_sync/generators/templates/migrations/create_terms.rb +0 -0
  47. data/lib/canvas_sync/generators/templates/migrations/create_user_observers.rb +0 -0
  48. data/lib/canvas_sync/generators/templates/migrations/create_users.rb +0 -0
  49. data/lib/canvas_sync/generators/templates/models/content_migration.rb +0 -0
  50. data/lib/canvas_sync/generators/templates/models/course_nickname.rb +0 -0
  51. data/lib/canvas_sync/generators/templates/models/rubric.rb +0 -0
  52. data/lib/canvas_sync/generators/templates/models/rubric_assessment.rb +0 -0
  53. data/lib/canvas_sync/generators/templates/models/rubric_association.rb +0 -0
  54. data/lib/canvas_sync/generators/templates/services/live_events/assignment_event.rb +0 -0
  55. data/lib/canvas_sync/generators/templates/services/live_events/assignment_group_event.rb +0 -0
  56. data/lib/canvas_sync/generators/templates/services/live_events/course_event.rb +0 -0
  57. data/lib/canvas_sync/generators/templates/services/live_events/course_section_event.rb +0 -0
  58. data/lib/canvas_sync/generators/templates/services/live_events/enrollment_event.rb +0 -0
  59. data/lib/canvas_sync/generators/templates/services/live_events/grade_event.rb +0 -0
  60. data/lib/canvas_sync/generators/templates/services/live_events/module_event.rb +0 -0
  61. data/lib/canvas_sync/generators/templates/services/live_events/module_item_event.rb +0 -0
  62. data/lib/canvas_sync/generators/templates/services/live_events/submission_event.rb +0 -0
  63. data/lib/canvas_sync/generators/templates/services/live_events/syllabus_event.rb +0 -0
  64. data/lib/canvas_sync/generators/templates/services/live_events/user_event.rb +0 -0
  65. data/lib/canvas_sync/importers/legacy_importer.rb +0 -0
  66. data/lib/canvas_sync/jobs/begin_sync_chain_job.rb +0 -0
  67. data/lib/canvas_sync/jobs/canvas_process_waiter.rb +0 -0
  68. data/lib/canvas_sync/jobs/sync_admins_job.rb +0 -0
  69. data/lib/canvas_sync/jobs/sync_assignment_groups_job.rb +0 -0
  70. data/lib/canvas_sync/jobs/sync_assignments_job.rb +0 -0
  71. data/lib/canvas_sync/jobs/sync_content_migrations_job.rb +0 -0
  72. data/lib/canvas_sync/jobs/sync_context_module_items_job.rb +0 -0
  73. data/lib/canvas_sync/jobs/sync_context_modules_job.rb +0 -0
  74. data/lib/canvas_sync/jobs/sync_rubrics_job.rb +0 -0
  75. data/lib/canvas_sync/jobs/sync_simple_table_job.rb +0 -0
  76. data/lib/canvas_sync/live_events/base_handler.rb +0 -0
  77. data/lib/canvas_sync/live_events.rb +0 -0
  78. data/lib/canvas_sync/misc_helper.rb +0 -0
  79. data/lib/canvas_sync/processors/normal_processor.rb +0 -0
  80. data/lib/canvas_sync/sidekiq_job.rb +0 -0
  81. data/lib/canvas_sync/version.rb +1 -1
  82. data/spec/canvas_sync/concerns/ability_helper_spec.rb +165 -0
  83. data/spec/canvas_sync/jobs/canvas_process_waiter_spec.rb +0 -0
  84. data/spec/canvas_sync/jobs/report_starter_spec.rb +0 -0
  85. data/spec/canvas_sync/jobs/sync_admins_job_spec.rb +0 -0
  86. data/spec/canvas_sync/jobs/sync_provisioning_report_job_spec.rb +0 -0
  87. data/spec/canvas_sync/jobs/sync_roles_job_spec.rb +0 -0
  88. data/spec/canvas_sync/jobs/sync_simple_table_job_spec.rb +0 -0
  89. data/spec/canvas_sync/jobs/sync_terms_job_spec.rb +0 -0
  90. data/spec/canvas_sync/live_events/live_event_sync_spec.rb +0 -0
  91. data/spec/canvas_sync/live_events/live_events_controller_spec.rb +0 -0
  92. data/spec/canvas_sync/misc_helper_spec.rb +0 -0
  93. data/spec/canvas_sync/models/accounts_spec.rb +0 -0
  94. data/spec/canvas_sync/models/admins_spec.rb +0 -0
  95. data/spec/canvas_sync/models/assignment_group_spec.rb +0 -0
  96. data/spec/canvas_sync/models/assignment_spec.rb +0 -0
  97. data/spec/canvas_sync/models/context_module_item_spec.rb +0 -0
  98. data/spec/canvas_sync/models/context_module_spec.rb +0 -0
  99. data/spec/canvas_sync/models/course_spec.rb +0 -0
  100. data/spec/canvas_sync/models/enrollment_spec.rb +0 -0
  101. data/spec/canvas_sync/models/group_membership_spec.rb +0 -0
  102. data/spec/canvas_sync/models/group_spec.rb +0 -0
  103. data/spec/canvas_sync/models/roles_spec.rb +0 -0
  104. data/spec/canvas_sync/models/section_spec.rb +0 -0
  105. data/spec/canvas_sync/models/submission_spec.rb +0 -0
  106. data/spec/canvas_sync/models/term_spec.rb +0 -0
  107. data/spec/canvas_sync/models/user_spec.rb +0 -0
  108. data/spec/canvas_sync/processors/assignment_groups_processor_spec.rb +0 -0
  109. data/spec/canvas_sync/processors/assignments_processor_spec.rb +0 -0
  110. data/spec/canvas_sync/processors/content_migrations_processor_spec.rb +0 -0
  111. data/spec/canvas_sync/processors/context_module_items_processor_spec.rb +0 -0
  112. data/spec/canvas_sync/processors/context_modules_processor_spec.rb +0 -0
  113. data/spec/canvas_sync/processors/course_completion_report_processor_spec.rb +0 -0
  114. data/spec/canvas_sync/processors/rubric_assessments_spec.rb +0 -0
  115. data/spec/canvas_sync/processors/rubric_associations_spec.rb +0 -0
  116. data/spec/canvas_sync/processors/rubrics_processor_spec.rb +0 -0
  117. data/spec/canvas_sync/processors/submissions_processor_spec.rb +0 -0
  118. data/spec/canvas_sync/services/module_event_spec.rb +0 -0
  119. data/spec/canvas_sync/services/module_item_event_spec.rb +0 -0
  120. data/spec/factories/admin_factory.rb +0 -0
  121. data/spec/factories/assignment_factory.rb +0 -0
  122. data/spec/factories/assignment_group_factory.rb +0 -0
  123. data/spec/factories/context_module_factory.rb +0 -0
  124. data/spec/factories/context_module_item_factory.rb +0 -0
  125. data/spec/factories/course_factory.rb +0 -0
  126. data/spec/factories/enrollment_factory.rb +0 -0
  127. data/spec/factories/group_factory.rb +0 -0
  128. data/spec/factories/group_membership_factory.rb +0 -0
  129. data/spec/factories/role_factory.rb +0 -0
  130. data/spec/factories/section_factory.rb +0 -0
  131. data/spec/factories/submission_factory.rb +0 -0
  132. data/spec/factories/term_factory.rb +0 -0
  133. data/spec/factories/user_factory.rb +0 -0
  134. data/spec/support/fixtures/canvas_responses/admins.json +0 -0
  135. data/spec/support/fixtures/canvas_responses/module.json +0 -0
  136. data/spec/support/fixtures/canvas_responses/module_item.json +0 -0
  137. data/spec/support/fixtures/canvas_responses/roles.json +0 -0
  138. data/spec/support/fixtures/canvas_responses/terms.json +0 -0
  139. data/spec/support/fixtures/reports/assignment_groups.csv +0 -0
  140. data/spec/support/fixtures/reports/assignments.csv +0 -0
  141. data/spec/support/fixtures/reports/content_migrations.csv +0 -0
  142. data/spec/support/fixtures/reports/context_module_items.csv +0 -0
  143. data/spec/support/fixtures/reports/context_modules.csv +0 -0
  144. data/spec/support/fixtures/reports/course_nicknames.csv +0 -0
  145. data/spec/support/fixtures/reports/course_progresses.csv +0 -0
  146. data/spec/support/fixtures/reports/course_progresses_conflict.csv +0 -0
  147. data/spec/support/fixtures/reports/grading_period_groups.csv +0 -0
  148. data/spec/support/fixtures/reports/grading_periods.csv +0 -0
  149. data/spec/support/fixtures/reports/group_memberships.csv +0 -0
  150. data/spec/support/fixtures/reports/groups.csv +0 -0
  151. data/spec/support/fixtures/reports/learning_outcome_results.csv +0 -0
  152. data/spec/support/fixtures/reports/learning_outcomes.csv +0 -0
  153. data/spec/support/fixtures/reports/provisioning_csv +0 -0
  154. data/spec/support/fixtures/reports/rubric_assessments.csv +0 -0
  155. data/spec/support/fixtures/reports/rubric_associations.csv +0 -0
  156. data/spec/support/fixtures/reports/rubrics.csv +0 -0
  157. data/spec/support/fixtures/reports/sections.csv +0 -0
  158. data/spec/support/fixtures/reports/submissions.csv +0 -0
  159. data/spec/support/fixtures/reports/user_observers.csv +0 -0
  160. data/spec/support/fixtures/reports/users.csv +0 -0
  161. data/spec/support/fixtures/reports/xlist.csv +0 -0
  162. metadata +3 -141
  163. data/spec/internal/app/models/account.rb +0 -35
  164. data/spec/internal/app/models/admin.rb +0 -35
  165. data/spec/internal/app/models/assignment.rb +0 -39
  166. data/spec/internal/app/models/assignment_group.rb +0 -31
  167. data/spec/internal/app/models/assignment_override.rb +0 -34
  168. data/spec/internal/app/models/content_migration.rb +0 -18
  169. data/spec/internal/app/models/context_module.rb +0 -69
  170. data/spec/internal/app/models/context_module_item.rb +0 -33
  171. data/spec/internal/app/models/course.rb +0 -57
  172. data/spec/internal/app/models/course_nickname.rb +0 -20
  173. data/spec/internal/app/models/course_progress.rb +0 -29
  174. data/spec/internal/app/models/enrollment.rb +0 -48
  175. data/spec/internal/app/models/grading_period.rb +0 -17
  176. data/spec/internal/app/models/grading_period_group.rb +0 -16
  177. data/spec/internal/app/models/group.rb +0 -28
  178. data/spec/internal/app/models/group_membership.rb +0 -26
  179. data/spec/internal/app/models/learning_outcome.rb +0 -30
  180. data/spec/internal/app/models/learning_outcome_result.rb +0 -54
  181. data/spec/internal/app/models/pseudonym.rb +0 -19
  182. data/spec/internal/app/models/role.rb +0 -27
  183. data/spec/internal/app/models/rubric.rb +0 -36
  184. data/spec/internal/app/models/rubric_assessment.rb +0 -23
  185. data/spec/internal/app/models/rubric_association.rb +0 -20
  186. data/spec/internal/app/models/score.rb +0 -18
  187. data/spec/internal/app/models/section.rb +0 -36
  188. data/spec/internal/app/models/submission.rb +0 -32
  189. data/spec/internal/app/models/term.rb +0 -46
  190. data/spec/internal/app/models/user.rb +0 -43
  191. data/spec/internal/app/models/user_observer.rb +0 -22
  192. data/spec/internal/app/services/live_events/assignment_event.rb +0 -43
  193. data/spec/internal/app/services/live_events/course_event.rb +0 -28
  194. data/spec/internal/app/services/live_events/course_section_event.rb +0 -28
  195. data/spec/internal/app/services/live_events/enrollment_event.rb +0 -30
  196. data/spec/internal/app/services/live_events/grade_event.rb +0 -36
  197. data/spec/internal/app/services/live_events/module_event.rb +0 -26
  198. data/spec/internal/app/services/live_events/module_item_event.rb +0 -25
  199. data/spec/internal/app/services/live_events/submission_event.rb +0 -28
  200. data/spec/internal/app/services/live_events/syllabus_event.rb +0 -31
  201. data/spec/internal/app/services/live_events/user_event.rb +0 -27
  202. data/spec/internal/db/migrate/20251029222307_create_users.rb +0 -26
  203. data/spec/internal/db/migrate/20251029222308_create_pseudonyms.rb +0 -24
  204. data/spec/internal/db/migrate/20251029222309_create_courses.rb +0 -30
  205. data/spec/internal/db/migrate/20251029222310_create_groups.rb +0 -29
  206. data/spec/internal/db/migrate/20251029222311_create_group_memberships.rb +0 -24
  207. data/spec/internal/db/migrate/20251029222312_create_accounts.rb +0 -23
  208. data/spec/internal/db/migrate/20251029222313_create_terms.rb +0 -24
  209. data/spec/internal/db/migrate/20251029222314_create_enrollments.rb +0 -31
  210. data/spec/internal/db/migrate/20251029222315_create_sections.rb +0 -27
  211. data/spec/internal/db/migrate/20251029222316_create_assignments.rb +0 -37
  212. data/spec/internal/db/migrate/20251029222317_create_submissions.rb +0 -32
  213. data/spec/internal/db/migrate/20251029222318_create_roles.rb +0 -24
  214. data/spec/internal/db/migrate/20251029222319_create_admins.rb +0 -26
  215. data/spec/internal/db/migrate/20251029222320_create_assignment_groups.rb +0 -28
  216. data/spec/internal/db/migrate/20251029222321_create_context_modules.rb +0 -28
  217. data/spec/internal/db/migrate/20251029222322_create_context_module_items.rb +0 -26
  218. data/spec/internal/db/migrate/20251029222324_create_grading_periods.rb +0 -28
  219. data/spec/internal/db/migrate/20251029222325_create_grading_period_groups.rb +0 -24
  220. data/spec/internal/db/migrate/20251029222326_create_content_migrations.rb +0 -30
  221. data/spec/internal/db/migrate/20251029222327_create_learning_outcomes.rb +0 -36
  222. data/spec/internal/db/migrate/20251029222328_create_learning_outcome_results.rb +0 -52
  223. data/spec/internal/db/migrate/20251029222330_create_rubrics.rb +0 -44
  224. data/spec/internal/db/migrate/20251029222331_create_rubric_associations.rb +0 -42
  225. data/spec/internal/db/migrate/20251029222332_create_rubric_assessments.rb +0 -37
  226. data/spec/internal/db/migrate/20251029222334_create_assignment_overrides.rb +0 -25
  227. data/spec/internal/db/migrate/20251029222335_create_scores.rb +0 -42
  228. data/spec/internal/db/migrate/20251029223411_create_user_observers.rb +0 -23
  229. data/spec/internal/db/migrate/20251029224009_create_course_nicknames.rb +0 -23
  230. data/spec/internal/db/migrate/20251029224010_create_course_progresses.rb +0 -26
  231. data/spec/support/fixtures/reports/provisioning_csv_unzipped/courses.csv +0 -3
  232. data/spec/support/fixtures/reports/provisioning_csv_unzipped/users.csv +0 -4
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canvas_sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.27.13
4
+ version: 0.27.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Instructure CustomDev
@@ -569,6 +569,7 @@ files:
569
569
  - lib/canvas_sync/version.rb
570
570
  - lib/tasks/canvas_sync_tasks.rake
571
571
  - spec/canvas_sync/canvas_sync_spec.rb
572
+ - spec/canvas_sync/concerns/ability_helper_spec.rb
572
573
  - spec/canvas_sync/concerns/deleted_scoping_spec.rb
573
574
  - spec/canvas_sync/concerns/legacy_columns_spec.rb
574
575
  - spec/canvas_sync/engine_spec.rb
@@ -636,79 +637,11 @@ files:
636
637
  - spec/factories/submission_factory.rb
637
638
  - spec/factories/term_factory.rb
638
639
  - spec/factories/user_factory.rb
639
- - spec/internal/app/models/account.rb
640
- - spec/internal/app/models/admin.rb
641
640
  - spec/internal/app/models/application_record.rb
642
- - spec/internal/app/models/assignment.rb
643
- - spec/internal/app/models/assignment_group.rb
644
- - spec/internal/app/models/assignment_override.rb
645
- - spec/internal/app/models/content_migration.rb
646
- - spec/internal/app/models/context_module.rb
647
- - spec/internal/app/models/context_module_item.rb
648
- - spec/internal/app/models/course.rb
649
- - spec/internal/app/models/course_nickname.rb
650
- - spec/internal/app/models/course_progress.rb
651
- - spec/internal/app/models/enrollment.rb
652
- - spec/internal/app/models/grading_period.rb
653
- - spec/internal/app/models/grading_period_group.rb
654
- - spec/internal/app/models/group.rb
655
- - spec/internal/app/models/group_membership.rb
656
- - spec/internal/app/models/learning_outcome.rb
657
- - spec/internal/app/models/learning_outcome_result.rb
658
- - spec/internal/app/models/pseudonym.rb
659
- - spec/internal/app/models/role.rb
660
- - spec/internal/app/models/rubric.rb
661
- - spec/internal/app/models/rubric_assessment.rb
662
- - spec/internal/app/models/rubric_association.rb
663
- - spec/internal/app/models/score.rb
664
- - spec/internal/app/models/section.rb
665
- - spec/internal/app/models/submission.rb
666
- - spec/internal/app/models/term.rb
667
- - spec/internal/app/models/user.rb
668
- - spec/internal/app/models/user_observer.rb
669
- - spec/internal/app/services/live_events/assignment_event.rb
670
- - spec/internal/app/services/live_events/course_event.rb
671
- - spec/internal/app/services/live_events/course_section_event.rb
672
- - spec/internal/app/services/live_events/enrollment_event.rb
673
- - spec/internal/app/services/live_events/grade_event.rb
674
- - spec/internal/app/services/live_events/module_event.rb
675
- - spec/internal/app/services/live_events/module_item_event.rb
676
- - spec/internal/app/services/live_events/submission_event.rb
677
- - spec/internal/app/services/live_events/syllabus_event.rb
678
- - spec/internal/app/services/live_events/user_event.rb
679
641
  - spec/internal/bin/rails
680
642
  - spec/internal/config/database.yml
681
643
  - spec/internal/config/routes.rb
682
644
  - spec/internal/config/storage.yml
683
- - spec/internal/db/migrate/20251029222307_create_users.rb
684
- - spec/internal/db/migrate/20251029222308_create_pseudonyms.rb
685
- - spec/internal/db/migrate/20251029222309_create_courses.rb
686
- - spec/internal/db/migrate/20251029222310_create_groups.rb
687
- - spec/internal/db/migrate/20251029222311_create_group_memberships.rb
688
- - spec/internal/db/migrate/20251029222312_create_accounts.rb
689
- - spec/internal/db/migrate/20251029222313_create_terms.rb
690
- - spec/internal/db/migrate/20251029222314_create_enrollments.rb
691
- - spec/internal/db/migrate/20251029222315_create_sections.rb
692
- - spec/internal/db/migrate/20251029222316_create_assignments.rb
693
- - spec/internal/db/migrate/20251029222317_create_submissions.rb
694
- - spec/internal/db/migrate/20251029222318_create_roles.rb
695
- - spec/internal/db/migrate/20251029222319_create_admins.rb
696
- - spec/internal/db/migrate/20251029222320_create_assignment_groups.rb
697
- - spec/internal/db/migrate/20251029222321_create_context_modules.rb
698
- - spec/internal/db/migrate/20251029222322_create_context_module_items.rb
699
- - spec/internal/db/migrate/20251029222324_create_grading_periods.rb
700
- - spec/internal/db/migrate/20251029222325_create_grading_period_groups.rb
701
- - spec/internal/db/migrate/20251029222326_create_content_migrations.rb
702
- - spec/internal/db/migrate/20251029222327_create_learning_outcomes.rb
703
- - spec/internal/db/migrate/20251029222328_create_learning_outcome_results.rb
704
- - spec/internal/db/migrate/20251029222330_create_rubrics.rb
705
- - spec/internal/db/migrate/20251029222331_create_rubric_associations.rb
706
- - spec/internal/db/migrate/20251029222332_create_rubric_assessments.rb
707
- - spec/internal/db/migrate/20251029222334_create_assignment_overrides.rb
708
- - spec/internal/db/migrate/20251029222335_create_scores.rb
709
- - spec/internal/db/migrate/20251029223411_create_user_observers.rb
710
- - spec/internal/db/migrate/20251029224009_create_course_nicknames.rb
711
- - spec/internal/db/migrate/20251029224010_create_course_progresses.rb
712
645
  - spec/internal/db/schema.rb
713
646
  - spec/spec_helper.rb
714
647
  - spec/support/fake_canvas.rb
@@ -737,8 +670,6 @@ files:
737
670
  - spec/support/fixtures/reports/learning_outcome_results.csv
738
671
  - spec/support/fixtures/reports/learning_outcomes.csv
739
672
  - spec/support/fixtures/reports/provisioning_csv
740
- - spec/support/fixtures/reports/provisioning_csv_unzipped/courses.csv
741
- - spec/support/fixtures/reports/provisioning_csv_unzipped/users.csv
742
673
  - spec/support/fixtures/reports/rubric_assessments.csv
743
674
  - spec/support/fixtures/reports/rubric_associations.csv
744
675
  - spec/support/fixtures/reports/rubrics.csv
@@ -770,6 +701,7 @@ specification_version: 4
770
701
  summary: Gem for generating Canvas models and migrations and syncing data from Canvas
771
702
  test_files:
772
703
  - spec/canvas_sync/canvas_sync_spec.rb
704
+ - spec/canvas_sync/concerns/ability_helper_spec.rb
773
705
  - spec/canvas_sync/concerns/deleted_scoping_spec.rb
774
706
  - spec/canvas_sync/concerns/legacy_columns_spec.rb
775
707
  - spec/canvas_sync/engine_spec.rb
@@ -837,79 +769,11 @@ test_files:
837
769
  - spec/factories/submission_factory.rb
838
770
  - spec/factories/term_factory.rb
839
771
  - spec/factories/user_factory.rb
840
- - spec/internal/app/models/account.rb
841
- - spec/internal/app/models/admin.rb
842
772
  - spec/internal/app/models/application_record.rb
843
- - spec/internal/app/models/assignment.rb
844
- - spec/internal/app/models/assignment_group.rb
845
- - spec/internal/app/models/assignment_override.rb
846
- - spec/internal/app/models/content_migration.rb
847
- - spec/internal/app/models/context_module.rb
848
- - spec/internal/app/models/context_module_item.rb
849
- - spec/internal/app/models/course.rb
850
- - spec/internal/app/models/course_nickname.rb
851
- - spec/internal/app/models/course_progress.rb
852
- - spec/internal/app/models/enrollment.rb
853
- - spec/internal/app/models/grading_period.rb
854
- - spec/internal/app/models/grading_period_group.rb
855
- - spec/internal/app/models/group.rb
856
- - spec/internal/app/models/group_membership.rb
857
- - spec/internal/app/models/learning_outcome.rb
858
- - spec/internal/app/models/learning_outcome_result.rb
859
- - spec/internal/app/models/pseudonym.rb
860
- - spec/internal/app/models/role.rb
861
- - spec/internal/app/models/rubric.rb
862
- - spec/internal/app/models/rubric_assessment.rb
863
- - spec/internal/app/models/rubric_association.rb
864
- - spec/internal/app/models/score.rb
865
- - spec/internal/app/models/section.rb
866
- - spec/internal/app/models/submission.rb
867
- - spec/internal/app/models/term.rb
868
- - spec/internal/app/models/user.rb
869
- - spec/internal/app/models/user_observer.rb
870
- - spec/internal/app/services/live_events/assignment_event.rb
871
- - spec/internal/app/services/live_events/course_event.rb
872
- - spec/internal/app/services/live_events/course_section_event.rb
873
- - spec/internal/app/services/live_events/enrollment_event.rb
874
- - spec/internal/app/services/live_events/grade_event.rb
875
- - spec/internal/app/services/live_events/module_event.rb
876
- - spec/internal/app/services/live_events/module_item_event.rb
877
- - spec/internal/app/services/live_events/submission_event.rb
878
- - spec/internal/app/services/live_events/syllabus_event.rb
879
- - spec/internal/app/services/live_events/user_event.rb
880
773
  - spec/internal/bin/rails
881
774
  - spec/internal/config/database.yml
882
775
  - spec/internal/config/routes.rb
883
776
  - spec/internal/config/storage.yml
884
- - spec/internal/db/migrate/20251029222307_create_users.rb
885
- - spec/internal/db/migrate/20251029222308_create_pseudonyms.rb
886
- - spec/internal/db/migrate/20251029222309_create_courses.rb
887
- - spec/internal/db/migrate/20251029222310_create_groups.rb
888
- - spec/internal/db/migrate/20251029222311_create_group_memberships.rb
889
- - spec/internal/db/migrate/20251029222312_create_accounts.rb
890
- - spec/internal/db/migrate/20251029222313_create_terms.rb
891
- - spec/internal/db/migrate/20251029222314_create_enrollments.rb
892
- - spec/internal/db/migrate/20251029222315_create_sections.rb
893
- - spec/internal/db/migrate/20251029222316_create_assignments.rb
894
- - spec/internal/db/migrate/20251029222317_create_submissions.rb
895
- - spec/internal/db/migrate/20251029222318_create_roles.rb
896
- - spec/internal/db/migrate/20251029222319_create_admins.rb
897
- - spec/internal/db/migrate/20251029222320_create_assignment_groups.rb
898
- - spec/internal/db/migrate/20251029222321_create_context_modules.rb
899
- - spec/internal/db/migrate/20251029222322_create_context_module_items.rb
900
- - spec/internal/db/migrate/20251029222324_create_grading_periods.rb
901
- - spec/internal/db/migrate/20251029222325_create_grading_period_groups.rb
902
- - spec/internal/db/migrate/20251029222326_create_content_migrations.rb
903
- - spec/internal/db/migrate/20251029222327_create_learning_outcomes.rb
904
- - spec/internal/db/migrate/20251029222328_create_learning_outcome_results.rb
905
- - spec/internal/db/migrate/20251029222330_create_rubrics.rb
906
- - spec/internal/db/migrate/20251029222331_create_rubric_associations.rb
907
- - spec/internal/db/migrate/20251029222332_create_rubric_assessments.rb
908
- - spec/internal/db/migrate/20251029222334_create_assignment_overrides.rb
909
- - spec/internal/db/migrate/20251029222335_create_scores.rb
910
- - spec/internal/db/migrate/20251029223411_create_user_observers.rb
911
- - spec/internal/db/migrate/20251029224009_create_course_nicknames.rb
912
- - spec/internal/db/migrate/20251029224010_create_course_progresses.rb
913
777
  - spec/internal/db/schema.rb
914
778
  - spec/spec_helper.rb
915
779
  - spec/support/fake_canvas.rb
@@ -938,8 +802,6 @@ test_files:
938
802
  - spec/support/fixtures/reports/learning_outcome_results.csv
939
803
  - spec/support/fixtures/reports/learning_outcomes.csv
940
804
  - spec/support/fixtures/reports/provisioning_csv
941
- - spec/support/fixtures/reports/provisioning_csv_unzipped/courses.csv
942
- - spec/support/fixtures/reports/provisioning_csv_unzipped/users.csv
943
805
  - spec/support/fixtures/reports/rubric_assessments.csv
944
806
  - spec/support/fixtures/reports/rubric_associations.csv
945
807
  - spec/support/fixtures/reports/rubrics.csv
@@ -1,35 +0,0 @@
1
- # #
2
- # AUTO GENERATED MODEL
3
- # This model was auto generated by the CanvasSync Gem.
4
- # You can customize it as needed, but make sure you test
5
- # any changes you make to the auto generated methods.
6
- #
7
-
8
-
9
- class Account < ApplicationRecord
10
- include CanvasSync::Record
11
- include CanvasSync::Concerns::ApiSyncable
12
- # include CanvasSync::Concerns::Account::Ancestry # Add support for the ancestry Gem
13
- # include CanvasSync::Concerns::LiveEventSync
14
- # include CanvasSync::Concerns::DeletedScoping
15
-
16
- canvas_sync_features :defaults
17
-
18
- validates :canvas_id, uniqueness: true, presence: true
19
-
20
- has_many :admins, primary_key: :canvas_id, foreign_key: :canvas_account_id
21
- belongs_to :canvas_parent, class_name: 'Account', optional: true,
22
- primary_key: :canvas_id, foreign_key: :canvas_parent_account_id
23
- has_many :sub_accounts, class_name: 'Account',
24
- primary_key: :canvas_id, foreign_key: :canvas_parent_account_id
25
- has_many :groups, primary_key: :canvas_id, foreign_key: :canvas_account_id
26
-
27
- scope :active, -> { where.not(workflow_state: 'deleted') }
28
- # scope :should_canvas_sync, -> { active } # Optional - uses .active if not given
29
-
30
- api_syncable({
31
- name: :name,
32
- workflow_state: :workflow_state,
33
- canvas_parent_account_id: :parent_account_id,
34
- }, -> (api) { api.account(canvas_id) })
35
- end
@@ -1,35 +0,0 @@
1
- # #
2
- # AUTO GENERATED MODEL
3
- # This model was auto generated by the CanvasSync Gem.
4
- # You can customize it as needed, but make sure you test
5
- # any changes you make to the auto generated methods.
6
- #
7
-
8
-
9
- class Admin < ApplicationRecord
10
- include CanvasSync::Record
11
- include CanvasSync::Concerns::ApiSyncable
12
- # include CanvasSync::Concerns::DeletedScoping
13
-
14
- canvas_sync_features :defaults
15
-
16
- validates :canvas_id, uniqueness: true, presence: true
17
- belongs_to :account, primary_key: :canvas_id, foreign_key: :canvas_account_id, optional: true
18
- belongs_to :user, primary_key: :canvas_id, foreign_key: :canvas_user_id, optional: true
19
- belongs_to :role, primary_key: :canvas_id, foreign_key: :canvas_role_id, optional: true
20
-
21
- api_syncable({
22
- canvas_id: :id,
23
- role_name: :role,
24
- canvas_role_id: :role_id,
25
- canvas_user_id: ->(r) { r['user']['id'] },
26
- # NOTICE: The :account_id field is added by CanvasSync - it is not included in the Canvas API response
27
- canvas_account_id: :account_id,
28
- workflow_state: :workflow_state,
29
- }, -> (api) {
30
- admins = api.account_admins(canvas_account_id).all_pages!
31
- admin_data = admins.find{|admin| admin['id'] == canvas_id }
32
- raise Footrest::HttpError::NotFound unless admin_data.present?
33
- admin_data
34
- })
35
- end
@@ -1,39 +0,0 @@
1
- # #
2
- # AUTO GENERATED MODEL
3
- # This model was auto generated by the CanvasSync Gem.
4
- # You can customize it as needed, but make sure you test
5
- # any changes you make to the auto generated methods.
6
- #
7
-
8
-
9
- class Assignment < ApplicationRecord
10
- include CanvasSync::Record
11
- include CanvasSync::Concerns::ApiSyncable
12
- # include CanvasSync::Concerns::LiveEventSync
13
- # include CanvasSync::Concerns::DeletedScoping
14
-
15
- canvas_sync_features :defaults
16
-
17
- validates :canvas_id, uniqueness: true, presence: true
18
- belongs_to :context, polymorphic: true, optional: true, primary_key: :canvas_id, foreign_key: :canvas_context_id, foreign_type: :canvas_context_type
19
- belongs_to :assignment_group, optional: true, primary_key: :canvas_id, foreign_key: :canvas_assignment_group_id
20
- has_many :submissions, primary_key: :canvas_id, foreign_key: :canvas_assignment_id
21
-
22
- has_many :context_module_items, as: :content, primary_key: :canvas_id, foreign_key: :canvas_content_id, foreign_type: :canvas_content_type, dependent: :destroy
23
- has_many :context_modules, through: :context_module_items
24
-
25
- api_syncable({
26
- title: :name,
27
- description: :description,
28
- due_at: :due_at,
29
- unlock_at: :unlock_at,
30
- lock_at: :lock_at,
31
- points_possible: :points_possible,
32
- grading_type: :grading_type,
33
- submission_types: lambda { |p| p["submission_types"].join(",") },
34
- canvas_context_id: :course_id,
35
- canvas_context_type: lambda { |_p| "Course" },
36
- canvas_assignment_group_id: :assignment_group_id,
37
- canvas_grading_standard_id: :grading_standard_id,
38
- }, -> (api) { api.assignment(canvas_context_id, canvas_id) })
39
- end
@@ -1,31 +0,0 @@
1
- # #
2
- # AUTO GENERATED MODEL
3
- # This model was auto generated by the CanvasSync Gem.
4
- # You can customize it as needed, but make sure you test
5
- # any changes you make to the auto generated methods.
6
- #
7
-
8
-
9
- class AssignmentGroup < ApplicationRecord
10
- include CanvasSync::Record
11
- include CanvasSync::Concerns::ApiSyncable
12
- # include CanvasSync::Concerns::LiveEventSync
13
- # include CanvasSync::Concerns::DeletedScoping
14
-
15
- canvas_sync_features :defaults
16
-
17
- validates :canvas_id, uniqueness: true, presence: true
18
- belongs_to :course, primary_key: :canvas_id, foreign_key: :canvas_course_id, optional: true
19
- has_many :assignments, primary_key: :canvas_id, foreign_key: :canvas_assignment_group_id
20
-
21
- serialize :rules
22
-
23
- api_syncable({
24
- canvas_id: :id,
25
- name: :name,
26
- position: :position,
27
- rules: :rules,
28
- group_weight: :group_weight,
29
- workflow_state: ->(p) { 'available' },
30
- }, -> (api) { api.assignment_group(canvas_course_id, canvas_id) })
31
- end
@@ -1,34 +0,0 @@
1
- # #
2
- # AUTO GENERATED MODEL
3
- # This model was auto generated by the CanvasSync Gem.
4
- # You can customize it as needed, but make sure you test
5
- # any changes you make to the auto generated methods.
6
- #
7
-
8
-
9
- class AssignmentOverride < ApplicationRecord
10
- include CanvasSync::Record
11
- include CanvasSync::Concerns::ApiSyncable
12
-
13
- canvas_sync_features :defaults
14
-
15
- validates :canvas_id, uniqueness: true, presence: true
16
- belongs_to :assignment, primary_key: :canvas_id, foreign_key: :canvas_assignment_id, optional: true
17
- belongs_to :course, primary_key: :canvas_id, foreign_key: :canvas_course_id, optional: true
18
-
19
- api_syncable({
20
- canvas_id: :id,
21
- canvas_assignment_id: :assignment_id,
22
- title: :title,
23
- workflow_state: :workflow_state,
24
- due_at: :due_at,
25
- all_day: :all_day,
26
- all_day_date: :all_day_date,
27
- unlock_at: :unlock_at,
28
- lock_at: :lock_at,
29
- student_ids: ->(r) { JSON.parse(r[:student_ids]) if r[:student_ids].present? },
30
- canvas_group_id: :group_id,
31
- canvas_section_id: :course_section_id,
32
- canvas_course_id: -> (r) { r.dig(:assignment, :course_id) }
33
- }, -> (api) { api.assignment_override(canvas_assignment_id, canvas_id) })
34
- end
@@ -1,18 +0,0 @@
1
- # #
2
- # AUTO GENERATED MODEL
3
- # This model was auto generated by the CanvasSync Gem.
4
- # You can customize it as needed, but make sure you test
5
- # any changes you make to the auto generated methods.
6
- #
7
-
8
-
9
- class ContentMigration < ApplicationRecord
10
- include CanvasSync::Record
11
- include CanvasSync::Concerns::ApiSyncable
12
-
13
- canvas_sync_features :defaults
14
-
15
- validates :canvas_id, uniqueness: true, presence: true
16
- belongs_to :context, polymorphic: true, optional: true, primary_key: :canvas_id, foreign_key: :canvas_context_id, foreign_type: :canvas_context_type
17
-
18
- end
@@ -1,69 +0,0 @@
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
- # A ContextModule is the same as a Canvas Module. They're called ContextModules for 2 reasons:
10
- # 1 - Module is a reserved word in Rails and you can't call a model a Module
11
- # 2 - Canvas calls them ContextModules
12
- class ContextModule < ApplicationRecord
13
- include CanvasSync::Record
14
- include CanvasSync::Concerns::ApiSyncable
15
- # include CanvasSync::Concerns::DeletedScoping
16
-
17
- # include CanvasSync::Concerns::LiveEventSync
18
- # live_events_config event_prefix: :module
19
- # def process_live_event(event_type, payload, metadata)
20
- # self.canvas_context_id = payload['context_id']
21
- # self.canvas_context_type = payload['context_type']
22
- # super
23
- # end
24
-
25
- canvas_sync_features :defaults
26
-
27
- belongs_to :context, polymorphic: true, optional: true, primary_key: :canvas_id, foreign_key: :canvas_context_id, foreign_type: :canvas_context_type
28
- has_many :context_module_items, primary_key: :canvas_id, foreign_key: :canvas_context_module_id
29
- has_many :assignments, through: :context_module_items
30
-
31
- serialize :completion_requirements
32
- serialize :prerequisites
33
-
34
- api_syncable({
35
- canvas_id: :id,
36
- canvas_context_id: :context_id,
37
- canvas_context_type: :context_type,
38
- position: :position,
39
- name: :name,
40
- workflow_state: :workflow_state,
41
- unlock_at: :unlock_at,
42
- completion_requirements: :completion_requirements,
43
- prerequisites: :prerequisites,
44
- requirement_count: :requirement_count
45
- }, lambda { |api|
46
- course_modules = api.course_modules(canvas_context_id, { include: ['items'] }) # avoids having 2 API calls for modules as we reuse this data
47
- context_module = course_modules&.detect { |course_module| course_module['id'] == canvas_id }
48
-
49
- if context_module.nil? # no context_module here means it is deleted in Canvas
50
- self.workflow_state = :deleted
51
- return self
52
- end
53
-
54
- # The ContextModule model in Canvas has the 'completion_requirements' and 'prerequisites' fields that are not returned directly from the API
55
- # We need to compute them here based on data that we receive from course_modules in the API
56
- context_module['prerequisites'] = course_modules.map do |course_module|
57
- next unless context_module['prerequisite_module_ids']&.include?(course_module['id'])
58
-
59
- {
60
- id: course_module['id'],
61
- name: course_module['name'],
62
- type: 'context_module'
63
- }.with_indifferent_access
64
- end.compact
65
-
66
- context_module['completion_requirements'] = context_module['items']&.map { |item| item['completion_requirement'] }&.compact
67
- context_module
68
- })
69
- end
@@ -1,33 +0,0 @@
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 ContextModuleItem < ApplicationRecord
10
- include CanvasSync::Record
11
- include CanvasSync::Concerns::ApiSyncable
12
- # include CanvasSync::Concerns::LiveEventSync
13
- # include CanvasSync::Concerns::DeletedScoping
14
-
15
- canvas_sync_features :defaults
16
-
17
- belongs_to :context_module, primary_key: :canvas_id, foreign_key: :canvas_context_module_id, optional: true
18
- belongs_to :content, polymorphic: true, optional: true, primary_key: :canvas_id, foreign_key: :canvas_content_id, foreign_type: :canvas_content_type
19
- belongs_to :assignment, foreign_key: :canvas_assignment_id, primary_key: :canvas_id
20
-
21
- api_syncable({
22
- canvas_id: :id,
23
- canvas_context_module_id: :module_id,
24
- position: :position,
25
- canvas_content_type: :type,
26
- canvas_content_id: :content_id,
27
- canvas_assignment_id: :assignment_id
28
- }, lambda { |api|
29
- module_item = api.module_item(context_module.context.canvas_id, context_module.canvas_id, canvas_id)
30
- module_item['assignment_id'] = api.assignment(context_module.context.canvas_id, module_item['content_id'])['id'] if module_item['type'] == 'Assignment'
31
- module_item
32
- })
33
- end
@@ -1,57 +0,0 @@
1
- # #
2
- # AUTO GENERATED MODEL
3
- # This model was auto generated by the CanvasSync Gem.
4
- # You can customize it as needed, but make sure you test
5
- # any changes you make to the auto generated methods.
6
- #
7
-
8
-
9
- class Course < ApplicationRecord
10
- include CanvasSync::Record
11
- include CanvasSync::Concerns::ApiSyncable
12
- # include CanvasSync::Concerns::DeletedScoping
13
-
14
- canvas_sync_features :defaults
15
-
16
- # include CanvasSync::Concerns::LiveEventSync
17
- # after_process_live_event do
18
- # if account.nil?
19
- # acc = Account.new(canvas_id: canvas_account_id)
20
- # acc.sync_from_api
21
- # end
22
- # end
23
-
24
- validates :canvas_id, uniqueness: true, presence: true
25
- belongs_to :term, foreign_key: :canvas_term_id, primary_key: :canvas_id, optional: true
26
- has_many :enrollments, primary_key: :canvas_id, foreign_key: :canvas_course_id
27
- has_many :sections, primary_key: :canvas_id, foreign_key: :canvas_course_id
28
- has_many :assignments, as: :context, primary_key: :canvas_id, foreign_key: :canvas_context_id, foreign_type: :canvas_context_type
29
- has_many :submissions, primary_key: :canvas_id, foreign_key: :canvas_course_id
30
- has_many :assignment_groups, primary_key: :canvas_id, foreign_key: :canvas_course_id
31
- has_many :groups, primary_key: :canvas_id, foreign_key: :canvas_course_id
32
- has_many :rubrics, as: :context, primary_key: :canvas_id, foreign_key: :canvas_context_id, foreign_type: :canvas_context_type
33
-
34
- api_syncable({
35
- sis_id: :sis_course_id,
36
- course_code: :course_code,
37
- name: :name,
38
- workflow_state: :workflow_state,
39
- canvas_term_id: :enrollment_term_id,
40
- canvas_account_id: :account_id,
41
- start_at: :start_at,
42
- end_at: :end_at,
43
- # If opting in the public_description, make sure to also add the 'include' array in the api call
44
- # public_description: :public_description,
45
- }, -> (api) { api.course(canvas_id) })
46
- # }, -> (api) { api.course(canvas_id, { include: ['public_description'] }) })
47
-
48
- scope :active, -> { where(workflow_state: 'active') }
49
-
50
- scope :current, -> {
51
- base_query = all.joins(:term)
52
- base_query
53
- .where("#{current_table_name}.start_at <= ? OR #{current_table_name}.start_at IS NULL", DateTime.now)
54
- .where("#{current_table_name}.end_at >= ? OR #{current_table_name}.end_at IS NULL", DateTime.now)
55
- .or(base_query.merge(Term.current))
56
- }
57
- end
@@ -1,20 +0,0 @@
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 CourseNickname < ApplicationRecord
12
- include CanvasSync::Record
13
- include CanvasSync::Concerns::ApiSyncable
14
-
15
- canvas_sync_features :defaults
16
- self.primary_key = [:canvas_user_id, :canvas_course_id] unless column_names.include?("id")
17
-
18
- belongs_to :user, primary_key: :canvas_id, foreign_key: :canvas_user_id, optional: true
19
- belongs_to :course, primary_key: :canvas_id, foreign_key: :canvas_course_id, optional: true
20
- end
@@ -1,29 +0,0 @@
1
- # #
2
- # AUTO GENERATED MODEL
3
- # This model was auto generated by the CanvasSync Gem.
4
- # You can customize it as needed, but make sure you test
5
- # any changes you make to the auto generated methods.
6
- #
7
-
8
-
9
- # CourseProgress is not a Canvas model. It is a table built from the Custom Report
10
- class CourseProgress < ApplicationRecord
11
- include CanvasSync::Record
12
- include CanvasSync::Concerns::ApiSyncable
13
-
14
- canvas_sync_features :defaults
15
- self.primary_key = [:canvas_user_id, :canvas_course_id] unless column_names.include?("id")
16
-
17
- belongs_to :user, primary_key: :canvas_id, foreign_key: :canvas_user_id, optional: true
18
- belongs_to :course, primary_key: :canvas_id, foreign_key: :canvas_course_id, optional: true
19
-
20
- validates_presence_of :canvas_user_id, :canvas_course_id
21
- validates_uniqueness_of :canvas_user_id, scope: :canvas_course_id
22
-
23
- api_syncable({
24
- requirement_count: :requirement_count,
25
- requirement_completed_count: :requirement_completed_count,
26
- # provisioning report has completion_date instead of completed_at in the API
27
- completion_date: :completed_at
28
- }, -> (api) { api.course_progress(canvas_course_id, canvas_user_id) })
29
- end