canvas_sync 0.10.2 → 0.10.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 +5 -5
- data/lib/canvas_sync/generators/install_live_events_generator.rb +5 -1
- data/lib/canvas_sync/generators/templates/migrations/create_accounts.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_admins.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_assignment_groups.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_assignments.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_context_module_items.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_context_modules.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_courses.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_enrollments.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_roles.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_sections.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_submissions.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_terms.rb +1 -1
- data/lib/canvas_sync/generators/templates/migrations/create_users.rb +1 -1
- data/lib/canvas_sync/generators/templates/models/account.rb +1 -1
- data/lib/canvas_sync/generators/templates/models/admin.rb +1 -1
- data/lib/canvas_sync/generators/templates/models/assignment.rb +1 -1
- data/lib/canvas_sync/generators/templates/models/assignment_group.rb +1 -1
- data/lib/canvas_sync/generators/templates/models/context_module.rb +8 -1
- data/lib/canvas_sync/generators/templates/models/context_module_item.rb +8 -1
- data/lib/canvas_sync/generators/templates/models/course.rb +1 -1
- data/lib/canvas_sync/generators/templates/models/enrollment.rb +1 -1
- data/lib/canvas_sync/generators/templates/models/role.rb +1 -1
- data/lib/canvas_sync/generators/templates/models/section.rb +2 -1
- data/lib/canvas_sync/generators/templates/models/submission.rb +1 -1
- data/lib/canvas_sync/generators/templates/models/term.rb +1 -1
- data/lib/canvas_sync/generators/templates/models/user.rb +1 -1
- data/lib/canvas_sync/generators/templates/services/live_events/assignment_event.rb +33 -0
- data/lib/canvas_sync/generators/templates/services/live_events/assignment_group_event.rb +24 -0
- data/lib/canvas_sync/generators/templates/services/live_events/base_event.rb +22 -0
- data/lib/canvas_sync/generators/templates/services/live_events/course_event.rb +20 -0
- data/lib/canvas_sync/generators/templates/services/live_events/course_section_event.rb +18 -0
- data/lib/canvas_sync/generators/templates/services/live_events/enrollment_event.rb +20 -0
- data/lib/canvas_sync/generators/templates/services/live_events/grade_event.rb +26 -0
- data/lib/canvas_sync/generators/templates/services/live_events/module_event.rb +16 -0
- data/lib/canvas_sync/generators/templates/services/live_events/module_item_event.rb +15 -0
- data/lib/canvas_sync/generators/templates/services/live_events/submission_event.rb +18 -0
- data/lib/canvas_sync/generators/templates/services/live_events/syllabus_event.rb +21 -0
- data/lib/canvas_sync/generators/templates/services/live_events/user_event.rb +19 -0
- data/lib/canvas_sync/version.rb +1 -1
- data/spec/canvas_sync/services/module_event_spec.rb +2 -2
- data/spec/canvas_sync/services/module_item_event_spec.rb +2 -2
- data/spec/dummy/app/models/account.rb +1 -1
- data/spec/dummy/app/models/admin.rb +1 -1
- data/spec/dummy/app/models/assignment.rb +1 -1
- data/spec/dummy/app/models/assignment_group.rb +3 -2
- data/spec/dummy/app/models/context_module.rb +8 -1
- data/spec/dummy/app/models/context_module_item.rb +8 -1
- data/spec/dummy/app/models/course.rb +1 -1
- data/spec/dummy/app/models/enrollment.rb +1 -1
- data/spec/dummy/app/models/role.rb +1 -1
- data/spec/dummy/app/models/section.rb +2 -1
- data/spec/dummy/app/models/submission.rb +1 -1
- data/spec/dummy/app/models/term.rb +1 -1
- data/spec/dummy/app/models/user.rb +1 -1
- data/spec/dummy/app/services/live_events/assignment_event.rb +19 -36
- data/spec/dummy/app/services/live_events/base_event.rb +26 -0
- data/spec/dummy/app/services/live_events/course_event.rb +15 -27
- data/spec/dummy/app/services/live_events/course_section_event.rb +13 -39
- data/spec/dummy/app/services/live_events/enrollment_event.rb +17 -48
- data/spec/dummy/app/services/live_events/grade_event.rb +9 -34
- data/spec/dummy/app/services/live_events/module_event.rb +10 -29
- data/spec/dummy/app/services/live_events/module_item_event.rb +10 -28
- data/spec/dummy/app/services/live_events/submission_event.rb +12 -42
- data/spec/dummy/app/services/live_events/syllabus_event.rb +11 -20
- data/spec/dummy/app/services/live_events/user_event.rb +14 -25
- data/spec/dummy/db/migrate/{20190603215718_create_users.rb → 20190702203620_create_users.rb} +1 -1
- data/spec/dummy/db/migrate/{20190603220011_create_courses.rb → 20190702203621_create_courses.rb} +1 -1
- data/spec/dummy/db/migrate/{20190604193942_create_accounts.rb → 20190702203622_create_accounts.rb} +1 -1
- data/spec/dummy/db/migrate/{20190603215721_create_terms.rb → 20190702203623_create_terms.rb} +1 -1
- data/spec/dummy/db/migrate/{20190603220013_create_enrollments.rb → 20190702203624_create_enrollments.rb} +1 -1
- data/spec/dummy/db/migrate/{20190603215722_create_sections.rb → 20190702203625_create_sections.rb} +1 -1
- data/spec/dummy/db/migrate/{20190603192310_create_assignments.rb → 20190702203626_create_assignments.rb} +1 -1
- data/spec/dummy/db/migrate/{20190521003447_create_submissions.rb → 20190702203627_create_submissions.rb} +1 -1
- data/spec/dummy/db/migrate/{20190606161037_create_roles.rb → 20190702203628_create_roles.rb} +1 -1
- data/spec/dummy/db/migrate/{20190521003449_create_admins.rb → 20190702203629_create_admins.rb} +1 -1
- data/spec/dummy/db/migrate/{20190521003450_create_assignment_groups.rb → 20190702203630_create_assignment_groups.rb} +1 -1
- data/spec/dummy/db/migrate/{20190521003451_create_context_modules.rb → 20190702203631_create_context_modules.rb} +1 -1
- data/spec/dummy/db/migrate/{20190603193502_create_context_module_items.rb → 20190702203632_create_context_module_items.rb} +1 -1
- data/spec/dummy/db/schema.rb +1 -1
- metadata +41 -67
- data/lib/canvas_sync/generators/templates/services/live_events/assignment/assignment_created_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/assignment/assignment_event.rb +0 -54
- data/lib/canvas_sync/generators/templates/services/live_events/assignment/assignment_updated_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/course/course_created_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/course/course_event.rb +0 -36
- data/lib/canvas_sync/generators/templates/services/live_events/course/course_updated_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/course_section/course_section_created_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/course_section/course_section_event.rb +0 -48
- data/lib/canvas_sync/generators/templates/services/live_events/course_section/course_section_updated_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/enrollment/enrollment_created_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/enrollment/enrollment_event.rb +0 -55
- data/lib/canvas_sync/generators/templates/services/live_events/enrollment/enrollment_updated_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/grade/grade_changed_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/grade/grade_event.rb +0 -55
- data/lib/canvas_sync/generators/templates/services/live_events/module/module_created_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/module/module_event.rb +0 -39
- data/lib/canvas_sync/generators/templates/services/live_events/module/module_updated_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/module_item/module_item_created_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/module_item/module_item_event.rb +0 -37
- data/lib/canvas_sync/generators/templates/services/live_events/module_item/module_item_updated_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/submission/submission_created_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/submission/submission_event.rb +0 -52
- data/lib/canvas_sync/generators/templates/services/live_events/submission/submission_updated_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/syllabus/syllabus_event.rb +0 -34
- data/lib/canvas_sync/generators/templates/services/live_events/syllabus/syllabus_updated_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/user/user_created_event.rb +0 -6
- data/lib/canvas_sync/generators/templates/services/live_events/user/user_event.rb +0 -34
- data/lib/canvas_sync/generators/templates/services/live_events/user/user_updated_event.rb +0 -6
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +0 -1248
- data/spec/dummy/log/test.log +0 -43258
- data/spec/support/fixtures/reports/provisioning_csv_unzipped/courses.csv +0 -3
- data/spec/support/fixtures/reports/provisioning_csv_unzipped/users.csv +0 -4
|
@@ -4,51 +4,25 @@
|
|
|
4
4
|
# You can customize it as needed, but make sure you test
|
|
5
5
|
# any changes you make to the auto generated methods.
|
|
6
6
|
#
|
|
7
|
+
# LiveEvent message formats can be found at https://canvas.instructure.com/doc/api/file.live_events.html
|
|
8
|
+
# In the general case, LiveEvent message content should not be trusted - it is highly possible that events may
|
|
9
|
+
# arrive out of order. Most of the CanvasSync LiveEvent templates solve this by always fetching the object from the API.
|
|
10
|
+
#
|
|
7
11
|
|
|
8
12
|
|
|
9
13
|
module LiveEvents
|
|
10
14
|
class CourseSectionEvent < LiveEvents::BaseEvent
|
|
11
|
-
# The following is provided in the live events call:
|
|
12
|
-
# {
|
|
13
|
-
# course_section_id: section.id,
|
|
14
|
-
# sis_id: section.sis_id,
|
|
15
|
-
# sis_batch_id: section.sis_batch_id,
|
|
16
|
-
# course_id: section.course_id,
|
|
17
|
-
# root_account_id: section.root_account_id,
|
|
18
|
-
# enrollment_term_id: section.enrollment_term_id,
|
|
19
|
-
# name: section.name,
|
|
20
|
-
# default_section: section.default_section,
|
|
21
|
-
# accepting_enrollments: section.accepting_enrollments,
|
|
22
|
-
# can_manually_enroll: section.can_manually_enroll,
|
|
23
|
-
# start_at: section.start_at,
|
|
24
|
-
# end_at: section.end_at,
|
|
25
|
-
# workflow_state: section.workflow_state,
|
|
26
|
-
# restrict_enrollments_to_section_dates: section.restrict_enrollments_to_section_dates,
|
|
27
|
-
# nonxlist_course_id: section.nonxlist_course_id,
|
|
28
|
-
# stuck_sis_fields: section.stuck_sis_fields,
|
|
29
|
-
# integration_id: section.integration_id
|
|
30
|
-
# }
|
|
31
15
|
|
|
32
|
-
def
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
workflow_state: payload[:workflow_state],
|
|
39
|
-
start_at: payload[:start_at],
|
|
40
|
-
end_at: payload[:end_at],
|
|
41
|
-
canvas_nonxlist_course_id: payload[:nonxlist_course_id],
|
|
42
|
-
}
|
|
43
|
-
create_or_update(attrs)
|
|
16
|
+
def process
|
|
17
|
+
section = Section.where(canvas_id: local_canvas_id(payload[:course_section_id])).first_or_initialize
|
|
18
|
+
section.sync_from_api
|
|
19
|
+
# A section change could constitute a crosslisting change, which means
|
|
20
|
+
# we need to make sure all our enrollments are pointing to the correct course
|
|
21
|
+
section.enrollments.update_all(canvas_course_id: section.canvas_course_id)
|
|
44
22
|
end
|
|
45
23
|
|
|
46
|
-
private
|
|
47
|
-
|
|
48
|
-
def create_or_update(attrs)
|
|
49
|
-
section = Section.where(canvas_section_id: attrs[:canvas_section_id]).first_or_initialize
|
|
50
|
-
section.assign_attributes(attrs)
|
|
51
|
-
section.save!
|
|
52
|
-
end
|
|
53
24
|
end
|
|
25
|
+
|
|
26
|
+
class CourseSectionCreatedEvent < LiveEvents::CourseSectionEvent; end
|
|
27
|
+
class CourseSectionUpdatedEvent < LiveEvents::CourseSectionEvent; end
|
|
54
28
|
end
|
|
@@ -4,58 +4,27 @@
|
|
|
4
4
|
# You can customize it as needed, but make sure you test
|
|
5
5
|
# any changes you make to the auto generated methods.
|
|
6
6
|
#
|
|
7
|
+
# LiveEvent message formats can be found at https://canvas.instructure.com/doc/api/file.live_events.html
|
|
8
|
+
# In the general case, LiveEvent message content should not be trusted - it is highly possible that events may
|
|
9
|
+
# arrive out of order. Most of the CanvasSync LiveEvent templates solve this by always fetching the object from the API.
|
|
10
|
+
#
|
|
7
11
|
|
|
8
12
|
|
|
9
13
|
module LiveEvents
|
|
10
14
|
class EnrollmentEvent < LiveEvents::BaseEvent
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# limit_privileges_to_course_section: enrollment.limit_privileges_to_course_section,
|
|
22
|
-
# course_section_id: enrollment.global_course_section_id,
|
|
23
|
-
# workflow_state: enrollment.workflow_state
|
|
24
|
-
# }
|
|
25
|
-
|
|
26
|
-
def perform(payload)
|
|
27
|
-
super
|
|
28
|
-
return if course.nil? || section.nil? || user.nil?
|
|
29
|
-
attrs = {
|
|
30
|
-
canvas_enrollment_id: local_canvas_id(payload[:enrollment_id]),
|
|
31
|
-
canvas_course_id: course.try(:id),
|
|
32
|
-
canvas_user_id: user.try(:id),
|
|
33
|
-
role: payload[:type],
|
|
34
|
-
canvas_section_id: section.try(:id),
|
|
35
|
-
status: payload[:workflow_state],
|
|
36
|
-
}
|
|
37
|
-
create_or_update(attrs)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
private
|
|
41
|
-
|
|
42
|
-
def create_or_update(attrs)
|
|
43
|
-
enrollment = Enrollment.where(canvas_enrollment_id: attrs[:canvas_enrollment_id]).first_or_initialize
|
|
44
|
-
enrollment.assign_attributes(attrs)
|
|
45
|
-
enrollment.save!
|
|
46
|
-
enrollment
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def course
|
|
50
|
-
@course ||= Course.find_by(canvas_course_id: local_canvas_id(payload[:course_id]))
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def section
|
|
54
|
-
@section ||= Section.find_by(canvas_section_id: local_canvas_id(payload[:section_id]))
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def user
|
|
58
|
-
@user ||= User.find_by(canvas_user_id: local_canvas_id(payload[:user_id]))
|
|
15
|
+
attr_accessor :enrollment
|
|
16
|
+
|
|
17
|
+
def process()
|
|
18
|
+
@enrollment = Enrollment.where(canvas_id: local_canvas_id(payload[:enrollment_id])).first_or_initialize
|
|
19
|
+
enrollment.canvas_course_id = local_canvas_id(payload[:course_id])
|
|
20
|
+
enrollment.sync_from_api
|
|
21
|
+
if enrollment.user.nil?
|
|
22
|
+
u = User.new(canvas_id: enrollment.canvas_user_id)
|
|
23
|
+
u.sync_from_api
|
|
24
|
+
end
|
|
59
25
|
end
|
|
60
26
|
end
|
|
27
|
+
|
|
28
|
+
class EnrollmentCreatedEvent < LiveEvents::EnrollmentEvent; end
|
|
29
|
+
class EnrollmentUpdatedEvent < LiveEvents::EnrollmentEvent; end
|
|
61
30
|
end
|
|
@@ -4,48 +4,21 @@
|
|
|
4
4
|
# You can customize it as needed, but make sure you test
|
|
5
5
|
# any changes you make to the auto generated methods.
|
|
6
6
|
#
|
|
7
|
+
# LiveEvent message formats can be found at https://canvas.instructure.com/doc/api/file.live_events.html
|
|
8
|
+
# In the general case, LiveEvent message content should not be trusted - it is highly possible that events may
|
|
9
|
+
# arrive out of order. Most of the CanvasSync LiveEvent templates solve this by always fetching the object from the API.
|
|
10
|
+
#
|
|
7
11
|
|
|
8
12
|
|
|
9
13
|
module LiveEvents
|
|
10
14
|
class GradeEvent < LiveEvents::BaseEvent
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
# assignment_id: submission.global_assignment_id,
|
|
15
|
-
# grade: submission.grade,
|
|
16
|
-
# old_grade: old_submission.try(:grade),
|
|
17
|
-
# score: submission.score,
|
|
18
|
-
# old_score: old_submission.try(:score),
|
|
19
|
-
# points_possible: submission.assignment.points_possible,
|
|
20
|
-
# old_points_possible: old_assignment.points_possible,
|
|
21
|
-
# grader_id: grader_id,
|
|
22
|
-
# student_id: submission.global_user_id,
|
|
23
|
-
# user_id: submission.global_user_id,
|
|
24
|
-
# grading_complete: submission.graded?,
|
|
25
|
-
# muted: submission.muted_assignment?
|
|
26
|
-
# }
|
|
27
|
-
|
|
28
|
-
def perform(event_payload)
|
|
29
|
-
super
|
|
30
|
-
attrs = {
|
|
31
|
-
submission_id: submission.try(:id),
|
|
32
|
-
assignment_id: assignment.try(:id),
|
|
33
|
-
score: payload[:score],
|
|
34
|
-
points_possible: payload[:points_possible],
|
|
35
|
-
grader_id: payload[:grader_id],
|
|
36
|
-
user_id: user.try(:id),
|
|
37
|
-
grading_complete: payload[:grading_complete],
|
|
38
|
-
muted: payload[:muted],
|
|
39
|
-
}
|
|
40
|
-
create_or_update(attrs)
|
|
15
|
+
|
|
16
|
+
def process
|
|
17
|
+
raise "process must be implemented in your subclass"
|
|
41
18
|
end
|
|
42
19
|
|
|
43
20
|
private
|
|
44
21
|
|
|
45
|
-
def create_or_update(attrs)
|
|
46
|
-
# TODO: add your code here
|
|
47
|
-
end
|
|
48
|
-
|
|
49
22
|
def submission
|
|
50
23
|
Submission.find_by(canvas_submission_id: local_canvas_id(payload[:submission_id]))
|
|
51
24
|
end
|
|
@@ -58,4 +31,6 @@ module LiveEvents
|
|
|
58
31
|
User.find_by(canvas_user_id: local_canvas_id(payload[:user_id]))
|
|
59
32
|
end
|
|
60
33
|
end
|
|
34
|
+
|
|
35
|
+
class GradeChangedEvent < LiveEvents::GradeEvent; end
|
|
61
36
|
end
|
|
@@ -4,42 +4,23 @@
|
|
|
4
4
|
# You can customize it as needed, but make sure you test
|
|
5
5
|
# any changes you make to the auto generated methods.
|
|
6
6
|
#
|
|
7
|
+
# LiveEvent message formats can be found at https://canvas.instructure.com/doc/api/file.live_events.html
|
|
8
|
+
# In the general case, LiveEvent message content should not be trusted - it is highly possible that events may
|
|
9
|
+
# arrive out of order. Most of the CanvasSync LiveEvent templates solve this by always fetching the object from the API.
|
|
10
|
+
#
|
|
7
11
|
|
|
8
12
|
|
|
9
13
|
module LiveEvents
|
|
10
14
|
class ModuleEvent < LiveEvents::BaseEvent
|
|
11
|
-
# The following is provided in the live events call:
|
|
12
|
-
# {
|
|
13
|
-
# module_id,
|
|
14
|
-
# context_id,
|
|
15
|
-
# context_type,
|
|
16
|
-
# name,
|
|
17
|
-
# position,
|
|
18
|
-
# workflow_state,
|
|
19
|
-
# }
|
|
20
|
-
|
|
21
|
-
def perform(_event_payload)
|
|
22
|
-
super
|
|
23
|
-
create_or_update_from_api(payload)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
15
|
|
|
28
|
-
def
|
|
16
|
+
def process
|
|
29
17
|
return unless payload["context_type"] == "Course"
|
|
30
18
|
context_module = ContextModule.find_or_initialize_by(canvas_id: payload["module_id"])
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
context_module.assign_attributes(
|
|
34
|
-
canvas_context_id: payload["context_id"],
|
|
35
|
-
canvas_context_type: payload["context_type"],
|
|
36
|
-
position: api_params["position"],
|
|
37
|
-
name: api_params["name"],
|
|
38
|
-
workflow_state: payload["workflow_state"],
|
|
39
|
-
unlock_at: api_params["unlock_at"],
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
context_module.save! if context_module.changed?
|
|
19
|
+
context_module.sync_from_api
|
|
43
20
|
end
|
|
21
|
+
|
|
44
22
|
end
|
|
23
|
+
|
|
24
|
+
class ModuleCreatedEvent < LiveEvents::ModuleEvent; end
|
|
25
|
+
class ModuleUpdatedEvent < LiveEvents::ModuleEvent; end
|
|
45
26
|
end
|
|
@@ -4,40 +4,22 @@
|
|
|
4
4
|
# You can customize it as needed, but make sure you test
|
|
5
5
|
# any changes you make to the auto generated methods.
|
|
6
6
|
#
|
|
7
|
+
# LiveEvent message formats can be found at https://canvas.instructure.com/doc/api/file.live_events.html
|
|
8
|
+
# In the general case, LiveEvent message content should not be trusted - it is highly possible that events may
|
|
9
|
+
# arrive out of order. Most of the CanvasSync LiveEvent templates solve this by always fetching the object from the API.
|
|
10
|
+
#
|
|
7
11
|
|
|
8
12
|
|
|
9
13
|
module LiveEvents
|
|
10
14
|
class ModuleItemEvent < LiveEvents::BaseEvent
|
|
11
|
-
# The following is provided in the live events call:
|
|
12
|
-
# {
|
|
13
|
-
# module_item_id,
|
|
14
|
-
# module_id,
|
|
15
|
-
# context_id,
|
|
16
|
-
# context_type,
|
|
17
|
-
# position,
|
|
18
|
-
# workflow_state,
|
|
19
|
-
# }
|
|
20
|
-
|
|
21
|
-
def perform(_event_payload)
|
|
22
|
-
super
|
|
23
|
-
create_or_update_from_api(payload)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
15
|
|
|
28
|
-
def
|
|
16
|
+
def process
|
|
29
17
|
context_module_item = ContextModuleItem.find_or_initialize_by(canvas_id: payload["module_item_id"])
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
context_module_item.assign_attributes(
|
|
33
|
-
canvas_context_module_id: payload["module_id"],
|
|
34
|
-
position: payload["position"],
|
|
35
|
-
workflow_state: payload["workflow_state"],
|
|
36
|
-
canvas_content_id: api_params["content_id"],
|
|
37
|
-
canvas_content_type: api_params["type"],
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
context_module_item.save! if context_module_item.changed?
|
|
18
|
+
context_module_item.sync_from_api
|
|
41
19
|
end
|
|
20
|
+
|
|
42
21
|
end
|
|
22
|
+
|
|
23
|
+
class ModuleItemCreatedEvent < LiveEvents::ModuleItemEvent; end
|
|
24
|
+
class ModuleItemUpdatedEvent < LiveEvents::ModuleItemEvent; end
|
|
43
25
|
end
|
|
@@ -4,55 +4,25 @@
|
|
|
4
4
|
# You can customize it as needed, but make sure you test
|
|
5
5
|
# any changes you make to the auto generated methods.
|
|
6
6
|
#
|
|
7
|
+
# LiveEvent message formats can be found at https://canvas.instructure.com/doc/api/file.live_events.html
|
|
8
|
+
# In the general case, LiveEvent message content should not be trusted - it is highly possible that events may
|
|
9
|
+
# arrive out of order. Most of the CanvasSync LiveEvent templates solve this by always fetching the object from the API.
|
|
10
|
+
#
|
|
7
11
|
|
|
8
12
|
|
|
9
13
|
module LiveEvents
|
|
10
14
|
class SubmissionEvent < LiveEvents::BaseEvent
|
|
11
|
-
# The following is provided in the live events call:
|
|
12
|
-
# {
|
|
13
|
-
# submission_id: submission.global_id,
|
|
14
|
-
# assignment_id: submission.global_assignment_id,
|
|
15
|
-
# user_id: submission.global_user_id,
|
|
16
|
-
# submitted_at: submission.submitted_at,
|
|
17
|
-
# graded_at: submission.graded_at,
|
|
18
|
-
# updated_at: submission.updated_at,
|
|
19
|
-
# score: submission.score,
|
|
20
|
-
# grade: submission.grade,
|
|
21
|
-
# submission_type: submission.submission_type,
|
|
22
|
-
# body: LiveEvents.truncate(submission.body),
|
|
23
|
-
# url: submission.url,
|
|
24
|
-
# attempt: submission.attempt
|
|
25
|
-
# }
|
|
26
15
|
|
|
27
|
-
def
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
canvas_user_id: user.try(:id),
|
|
34
|
-
submitted_at: payload[:submitted_at],
|
|
35
|
-
graded_at: payload[:graded_at],
|
|
36
|
-
score: payload[:score],
|
|
37
|
-
}
|
|
38
|
-
create_or_update(attrs)
|
|
16
|
+
def process
|
|
17
|
+
submission = Submission.where(canvas_id: local_canvas_id(payload["submission_id"])).first_or_initialize
|
|
18
|
+
submission.canvas_assignment_id = local_canvas_id(payload["assignment_id"])
|
|
19
|
+
submission.canvas_user_id = local_canvas_id(payload["user_id"])
|
|
20
|
+
submission.canvas_course_id = submission.assignment.context.canvas_id
|
|
21
|
+
submission.sync_from_api
|
|
39
22
|
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
private
|
|
43
23
|
|
|
44
|
-
def create_or_update(attrs)
|
|
45
|
-
submission = Submission.where(canvas_submission_id: attrs[:canvas_submission_id]).first_or_initialize
|
|
46
|
-
submission.assign_attributes(attrs)
|
|
47
|
-
submission.save!
|
|
48
|
-
submission
|
|
49
24
|
end
|
|
50
25
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def user
|
|
56
|
-
@user ||= User.find_by(canvas_user_id: local_canvas_id(payload[:user_id]))
|
|
57
|
-
end
|
|
26
|
+
class SubmissionCreatedEvent < LiveEvents::SubmissionEvent; end
|
|
27
|
+
class SubmissionUpdatedEvent < LiveEvents::SubmissionEvent; end
|
|
58
28
|
end
|
|
@@ -4,37 +4,28 @@
|
|
|
4
4
|
# You can customize it as needed, but make sure you test
|
|
5
5
|
# any changes you make to the auto generated methods.
|
|
6
6
|
#
|
|
7
|
+
# LiveEvent message formats can be found at https://canvas.instructure.com/doc/api/file.live_events.html
|
|
8
|
+
# In the general case, LiveEvent message content should not be trusted - it is highly possible that events may
|
|
9
|
+
# arrive out of order. Most of the CanvasSync LiveEvent templates solve this by always fetching the object from the API.
|
|
10
|
+
#
|
|
7
11
|
|
|
8
12
|
|
|
9
13
|
module LiveEvents
|
|
10
14
|
class SyllabusEvent < LiveEvents::BaseEvent
|
|
11
|
-
# The following is provided in the live events call:
|
|
12
|
-
# {
|
|
13
|
-
# course_id: course.global_id,
|
|
14
|
-
# syllabus_body: LiveEvents.truncate(course.syllabus_body),
|
|
15
|
-
# old_syllabus_body: LiveEvents.truncate(old_syllabus_body)
|
|
16
|
-
# }
|
|
17
|
-
#
|
|
18
15
|
|
|
19
|
-
def
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
create_or_update(attrs)
|
|
16
|
+
def process
|
|
17
|
+
# syllabus = Syllabus.where(course_id: attrs[:course_id]).first_or_initialize
|
|
18
|
+
# syllabus.body = attrs[:syllabus_body] # Syllabus Body can get truncated by live events
|
|
19
|
+
# syllabus.save!
|
|
20
|
+
raise "process must be implemented in your subclass"
|
|
26
21
|
end
|
|
27
22
|
|
|
28
23
|
private
|
|
29
24
|
|
|
30
|
-
def create_or_update(attrs)
|
|
31
|
-
syllabus = Syllabus.where(course_id: attrs[:course_id]).first_or_initialize
|
|
32
|
-
syllabus.body = attrs[:syllabus_body] # Syllabus Body can get truncated by live events
|
|
33
|
-
syllabus.save!
|
|
34
|
-
end
|
|
35
|
-
|
|
36
25
|
def course
|
|
37
26
|
Course.find_by(canvas_course_id: local_canvas_id(payload[:course_id]))
|
|
38
27
|
end
|
|
39
28
|
end
|
|
29
|
+
|
|
30
|
+
class SyllabusUpdatedEvent < LiveEvents::SyllabusEvent; end
|
|
40
31
|
end
|
|
@@ -4,37 +4,26 @@
|
|
|
4
4
|
# You can customize it as needed, but make sure you test
|
|
5
5
|
# any changes you make to the auto generated methods.
|
|
6
6
|
#
|
|
7
|
+
# LiveEvent message formats can be found at https://canvas.instructure.com/doc/api/file.live_events.html
|
|
8
|
+
# In the general case, LiveEvent message content should not be trusted - it is highly possible that events may
|
|
9
|
+
# arrive out of order. Most of the CanvasSync LiveEvent templates solve this by always fetching the object from the API.
|
|
10
|
+
#
|
|
7
11
|
|
|
8
12
|
|
|
9
13
|
module LiveEvents
|
|
10
14
|
class UserEvent < LiveEvents::BaseEvent
|
|
11
|
-
# The following is provided in the live events call:
|
|
12
|
-
# {
|
|
13
|
-
# user_id: user.global_id,
|
|
14
|
-
# uuid: user.uuid,
|
|
15
|
-
# name: user.name,
|
|
16
|
-
# short_name: user.short_name,
|
|
17
|
-
# workflow_state: user.workflow_state,
|
|
18
|
-
# created_at: user.created_at,
|
|
19
|
-
# updated_at: user.updated_at
|
|
20
|
-
# }
|
|
21
15
|
|
|
22
|
-
def
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
create_or_update(attrs)
|
|
16
|
+
def process
|
|
17
|
+
canvas_user_id = local_canvas_id(payload[:user_id])
|
|
18
|
+
user = User.where(canvas_id: canvas_user_id).first_or_initialize
|
|
19
|
+
user.sync_from_api
|
|
20
|
+
rescue Footrest::HttpError::Unauthorized => e
|
|
21
|
+
# This can happen when a new user is created, but hasn't setup a login on Canvas yet.
|
|
22
|
+
Rails.logger.info("Failed to fetch user #{canvas_user_id}: #{e.backtrace}")
|
|
30
23
|
end
|
|
31
24
|
|
|
32
|
-
private
|
|
33
|
-
|
|
34
|
-
def create_or_update(attrs)
|
|
35
|
-
user = User.where(canvas_user_id: attrs[:canvas_user_id]).first_or_initialize
|
|
36
|
-
user.assign_attributes(attrs)
|
|
37
|
-
user.save!
|
|
38
|
-
end
|
|
39
25
|
end
|
|
26
|
+
|
|
27
|
+
class UserCreatedEvent < LiveEvents::UserEvent; end
|
|
28
|
+
class UserUpdatedEvent < LiveEvents::UserEvent; end
|
|
40
29
|
end
|