canvas_sync 0.10.0 → 0.10.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: efb7341f8d1643d211f53ffde7c7fbaf9c7e0b89359d83ffa12e293f8e977863
4
- data.tar.gz: 4919a841fc27a2b85cb0049f03a18a46f27d1c5928345eaf2dd3460fba764f06
3
+ metadata.gz: 50ea86e0116f11f92019daae4edd22aa3a402355e1d910947e391a0f3b6ac000
4
+ data.tar.gz: 5712f275605f93eefc0f0ab5f1711b31e20dbc29d9a5e2b56d39853745610a49
5
5
  SHA512:
6
- metadata.gz: ae1217a2ab3c9f5168cd759372ac0d306e906bf185a3f6684c208443f9611ce494d7cd8d6ccd732e11425ddf3711c5886fb43b7caa881d1d9064ab10e6d85c9c
7
- data.tar.gz: 619b4f60710761a1381074d1d058fb49e6b09f79264b7ed57f97143f2bcab468fb0e1eb0571591aaedd7b9536b5318acc7463a01a3732014b974fc33457c5dc0
6
+ metadata.gz: f914d9934b0b7c7c31fc3e3188d9884a07aeb104a4b89b9815f2455ada59bf74f6f43b3eb8fdc3fbd994dcca48166fd108dc45ae415f8715197ac96f33b3a2df
7
+ data.tar.gz: b56ddedc9b422d64bf319f2f425cb209b1889fbfd4a5992eb403ab1901efd2b3aaeaa7463c3ca9b4d32924e6b44fc0b8479084c6462796ea547a8d6e5fd516b9
@@ -1,7 +1,26 @@
1
1
  module CanvasSync::ApiSyncable
2
2
  extend ActiveSupport::Concern
3
+ NON_EXISTANT_ERRORS = [Faraday::Error::ResourceNotFound, Footrest::HttpError::NotFound]
3
4
 
4
5
  class_methods do
6
+ def find_or_fetch(canvas_id, save: false, retries: 1)
7
+ inst = find_by(canvas_id: canvas_id)
8
+ return inst if inst.present?
9
+ inst = new(canvas_id: canvas_id)
10
+ api_response = inst.request_from_api(retries: retries)
11
+ inst.update_from_api_params(api_response)
12
+ inst.save! if save
13
+ inst
14
+ rescue *NON_EXISTANT_ERRORS
15
+ nil
16
+ end
17
+
18
+ def find_or_fetch!(*args)
19
+ inst = find_or_fetch(*args)
20
+ raise ActiveRecord::RecordNotFound unless inst.present?
21
+ inst
22
+ end
23
+
5
24
  def api_sync_options=(opts)
6
25
  @api_sync_options = opts
7
26
  end
@@ -42,7 +61,7 @@ module CanvasSync::ApiSyncable
42
61
  api_response = request_from_api(retries: retries)
43
62
  update_from_api_params!(api_response)
44
63
  api_response
45
- rescue Faraday::Error::ResourceNotFound, Footrest::HttpError::NotFound => e
64
+ rescue *NON_EXISTANT_ERRORS
46
65
  api_mark_deleted
47
66
  save! if changed?
48
67
  nil
@@ -7,11 +7,13 @@ class CreateRoles < ActiveRecord::Migration[5.1]
7
7
  t.string :label, null: false
8
8
  t.string :base_role_type, null: false
9
9
  t.json :account
10
+ t.integer :canvas_account_id
10
11
  t.string :workflow_state, null: false
11
12
  t.json :permissions
12
13
 
13
14
  t.timestamps
14
15
  end
15
16
  add_index :roles, :canvas_id, unique: true
17
+ add_index :roles, :canvas_account_id
16
18
  end
17
19
  end
@@ -1,20 +1,26 @@
1
1
  <%= autogenerated_model_warning %>
2
2
 
3
3
  class Admin < ApplicationRecord
4
+ include CanvasSync::ApiSyncable
5
+
4
6
  validates :canvas_id, uniqueness: true, presence: true
5
7
  belongs_to :user, primary_key: :canvas_id, foreign_key: :canvas_user_id, optional: true
6
8
  belongs_to :role, primary_key: :canvas_id, foreign_key: :canvas_role_id, optional: true
7
9
 
8
- def self.create_or_update(admin_params)
9
- admin = Admin.find_or_initialize_by(canvas_id: admin_params['id'])
10
+ api_syncable({
11
+ canvas_id: :id,
12
+ role_name: :role,
13
+ canvas_role_id: :role_id,
14
+ user_data: :user,
15
+ canvas_user_id: ->(r) { r['user']['id'] },
16
+ workflow_state: :workflow_state,
17
+ }, -> (api) {
18
+ admins = api.account_admins('self').all_pages!
19
+ admin_data = admins.find{|admin| admin['id'] == canvas_id }
20
+ raise Footrest::HttpError::NotFound unless admin_data.present?
21
+ admin_data
22
+ })
10
23
 
11
- admin.assign_attributes(role_name: admin_params['role'],
12
- canvas_role_id: admin_params['role_id'],
13
- user_data: admin_params['user'],
14
- canvas_user_id: admin_params['user']['id'],
15
- workflow_state: admin_params['workflow_state'])
24
+ def self.create_or_update(params); find_or_initialize_by(canvas_id: params['id']).update_from_api_params!(params); end
16
25
 
17
- admin.save! if admin.changed?
18
- admin
19
- end
20
26
  end
@@ -15,5 +15,6 @@ class AssignmentGroup < ApplicationRecord
15
15
  position: :position,
16
16
  rules: :rules,
17
17
  group_weight: :group_weight,
18
- }, -> (api) { api.assignment(course_id, canvas_id) })
18
+ workflow_state: ->(p) { 'available' },
19
+ }, -> (api) { api.assignment_group(canvas_course_id, canvas_id) })
19
20
  end
@@ -1,19 +1,21 @@
1
1
  <%= autogenerated_model_warning %>
2
2
 
3
3
  class Role < ApplicationRecord
4
+ include CanvasSync::ApiSyncable
5
+
4
6
  validates :canvas_id, uniqueness: true, presence: true
5
7
  has_many :admins, foreign_key: :canvas_role_id, primary_key: :canvas_id
6
8
 
7
- def self.create_or_update(role_params)
8
- role = Role.find_or_initialize_by(canvas_id: role_params['id'])
9
+ api_syncable({
10
+ canvas_id: :id,
11
+ label: :label,
12
+ base_role_type: :base_role_type,
13
+ account: :account,
14
+ canvas_account_id: ->(r) { r.dig('account', 'id') },
15
+ permissions: :permissions,
16
+ workflow_state: :workflow_state,
17
+ }, -> (api) { api.get("/api/v1/accounts/#{canvas_account_id}/roles/#{canvas_id}") })
9
18
 
10
- role.assign_attributes(label: role_params['label'],
11
- base_role_type: role_params['base_role_type'],
12
- account: role_params['account'],
13
- permissions: role_params['permissions'],
14
- workflow_state: role_params['workflow_state'])
19
+ def self.create_or_update(params); find_or_initialize_by(canvas_id: params['id']).update_from_api_params!(params); end
15
20
 
16
- role.save! if role.changed?
17
- role
18
- end
19
21
  end
@@ -1,9 +1,28 @@
1
1
  <%= autogenerated_model_warning %>
2
2
 
3
3
  class Term < ApplicationRecord
4
+ include CanvasSync::ApiSyncable
5
+
4
6
  validates :canvas_id, uniqueness: true, presence: true
5
7
  has_many :courses, foreign_key: :canvas_term_id, primary_key: :canvas_id
6
8
 
9
+ api_syncable({
10
+ canvas_id: :id,
11
+ name: :name,
12
+ sis_id: :sis_term_id,
13
+ start_at: :start_at,
14
+ end_at: :end_at,
15
+ workflow_state: :workflow_state,
16
+ grading_period_group_id: :grading_period_group_id,
17
+ }, -> (api) {
18
+ terms = api.terms('self').all_pages!
19
+ term_data = terms.find{|term| term['id'] == canvas_id }
20
+ raise Footrest::HttpError::NotFound unless term_data.present?
21
+ term_data
22
+ })
23
+
24
+ def self.create_or_update(params); find_or_initialize_by(canvas_id: params['id']).update_from_api_params!(params); end
25
+
7
26
  # This is a sample scope created by the CanvasSync gem; feel
8
27
  # free to customize it for your tool's requirements.
9
28
  scope :active, -> {
@@ -12,18 +31,4 @@ class Term < ApplicationRecord
12
31
  .where("end_at >= ? OR end_at IS NULL", 15.days.ago)
13
32
  }
14
33
 
15
- def self.create_or_update(term_params)
16
- term = Term.find_or_initialize_by(canvas_id: term_params['id'])
17
-
18
- term.assign_attributes(name: term_params['name'],
19
- start_at: term_params['start_at'],
20
- end_at: term_params['end_at'],
21
- workflow_state: term_params['workflow_state'],
22
- grading_period_group_id: term_params['grading_period_group_id'],
23
- sis_id: term_params['sis_term_id'])
24
-
25
- term.save! if term.changed?
26
- term
27
- end
28
-
29
34
  end
@@ -1,3 +1,3 @@
1
1
  module CanvasSync
2
- VERSION = "0.10.0".freeze
2
+ VERSION = "0.10.2".freeze
3
3
  end
@@ -7,20 +7,26 @@
7
7
 
8
8
 
9
9
  class Admin < ApplicationRecord
10
+ include CanvasSync::ApiSyncable
11
+
10
12
  validates :canvas_id, uniqueness: true, presence: true
11
13
  belongs_to :user, primary_key: :canvas_id, foreign_key: :canvas_user_id, optional: true
12
14
  belongs_to :role, primary_key: :canvas_id, foreign_key: :canvas_role_id, optional: true
13
15
 
14
- def self.create_or_update(admin_params)
15
- admin = Admin.find_or_initialize_by(canvas_id: admin_params['id'])
16
+ api_syncable({
17
+ canvas_id: :id,
18
+ role_name: :role,
19
+ canvas_role_id: :role_id,
20
+ user_data: :user,
21
+ canvas_user_id: ->(r) { r['user']['id'] },
22
+ workflow_state: :workflow_state,
23
+ }, -> (api) {
24
+ admins = api.account_admins('self').all_pages!
25
+ admin_data = admins.find{|admin| admin['id'] == canvas_id }
26
+ raise Footrest::HttpError::NotFound unless admin_data.present?
27
+ admin_data
28
+ })
16
29
 
17
- admin.assign_attributes(role_name: admin_params['role'],
18
- canvas_role_id: admin_params['role_id'],
19
- user_data: admin_params['user'],
20
- canvas_user_id: admin_params['user']['id'],
21
- workflow_state: admin_params['workflow_state'])
30
+ def self.create_or_update(params); find_or_initialize_by(canvas_id: params['id']).update_from_api_params!(params); end
22
31
 
23
- admin.save! if admin.changed?
24
- admin
25
- end
26
32
  end
@@ -7,19 +7,21 @@
7
7
 
8
8
 
9
9
  class Role < ApplicationRecord
10
+ include CanvasSync::ApiSyncable
11
+
10
12
  validates :canvas_id, uniqueness: true, presence: true
11
13
  has_many :admins, foreign_key: :canvas_role_id, primary_key: :canvas_id
12
14
 
13
- def self.create_or_update(role_params)
14
- role = Role.find_or_initialize_by(canvas_id: role_params['id'])
15
+ api_syncable({
16
+ canvas_id: :id,
17
+ label: :label,
18
+ base_role_type: :base_role_type,
19
+ account: :account,
20
+ canvas_account_id: ->(r) { r.dig('account', 'id') },
21
+ permissions: :permissions,
22
+ workflow_state: :workflow_state,
23
+ }, -> (api) { api.get("/api/v1/accounts/#{canvas_account_id}/roles/#{canvas_id}") })
15
24
 
16
- role.assign_attributes(label: role_params['label'],
17
- base_role_type: role_params['base_role_type'],
18
- account: role_params['account'],
19
- permissions: role_params['permissions'],
20
- workflow_state: role_params['workflow_state'])
25
+ def self.create_or_update(params); find_or_initialize_by(canvas_id: params['id']).update_from_api_params!(params); end
21
26
 
22
- role.save! if role.changed?
23
- role
24
- end
25
27
  end
@@ -7,9 +7,28 @@
7
7
 
8
8
 
9
9
  class Term < ApplicationRecord
10
+ include CanvasSync::ApiSyncable
11
+
10
12
  validates :canvas_id, uniqueness: true, presence: true
11
13
  has_many :courses, foreign_key: :canvas_term_id, primary_key: :canvas_id
12
14
 
15
+ api_syncable({
16
+ canvas_id: :id,
17
+ name: :name,
18
+ sis_id: :sis_term_id,
19
+ start_at: :start_at,
20
+ end_at: :end_at,
21
+ workflow_state: :workflow_state,
22
+ grading_period_group_id: :grading_period_group_id,
23
+ }, -> (api) {
24
+ terms = api.terms('self').all_pages!
25
+ term_data = terms.find{|term| term['id'] == canvas_id }
26
+ raise Footrest::HttpError::NotFound unless term_data.present?
27
+ term_data
28
+ })
29
+
30
+ def self.create_or_update(params); find_or_initialize_by(canvas_id: params['id']).update_from_api_params!(params); end
31
+
13
32
  # This is a sample scope created by the CanvasSync gem; feel
14
33
  # free to customize it for your tool's requirements.
15
34
  scope :active, -> {
@@ -18,18 +37,4 @@ class Term < ApplicationRecord
18
37
  .where("end_at >= ? OR end_at IS NULL", 15.days.ago)
19
38
  }
20
39
 
21
- def self.create_or_update(term_params)
22
- term = Term.find_or_initialize_by(canvas_id: term_params['id'])
23
-
24
- term.assign_attributes(name: term_params['name'],
25
- start_at: term_params['start_at'],
26
- end_at: term_params['end_at'],
27
- workflow_state: term_params['workflow_state'],
28
- grading_period_group_id: term_params['grading_period_group_id'],
29
- sis_id: term_params['sis_term_id'])
30
-
31
- term.save! if term.changed?
32
- term
33
- end
34
-
35
40
  end
@@ -13,11 +13,13 @@ class CreateRoles < ActiveRecord::Migration[5.1]
13
13
  t.string :label, null: false
14
14
  t.string :base_role_type, null: false
15
15
  t.json :account
16
+ t.integer :canvas_account_id
16
17
  t.string :workflow_state, null: false
17
18
  t.json :permissions
18
19
 
19
20
  t.timestamps
20
21
  end
21
22
  add_index :roles, :canvas_id, unique: true
23
+ add_index :roles, :canvas_account_id
22
24
  end
23
25
  end
@@ -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: 20190604193942) do
13
+ ActiveRecord::Schema.define(version: 20190606161037) do
14
14
 
15
15
  # These are extensions that must be enabled in order to support this database
16
16
  enable_extension "plpgsql"
@@ -162,10 +162,12 @@ ActiveRecord::Schema.define(version: 20190604193942) do
162
162
  t.string "label", null: false
163
163
  t.string "base_role_type", null: false
164
164
  t.json "account"
165
+ t.integer "canvas_account_id"
165
166
  t.string "workflow_state", null: false
166
167
  t.json "permissions"
167
168
  t.datetime "created_at", null: false
168
169
  t.datetime "updated_at", null: false
170
+ t.index ["canvas_account_id"], name: "index_roles_on_canvas_account_id"
169
171
  t.index ["canvas_id"], name: "index_roles_on_canvas_id", unique: true
170
172
  end
171
173
 
@@ -1,50 +1,50 @@
1
1
  [
2
- {
3
- "id": 2,
4
- "role": "AccountAdmin",
5
- "role_id": 1,
6
- "user": {
7
- "id": 1,
8
- "name": "mvalentine@instructure.com",
9
- "sortable_name": "mvalentine@instructure.com",
10
- "short_name": "mvalentine@instructure.com",
11
- "sis_user_id": null,
12
- "integration_id": null,
13
- "sis_import_id": null,
14
- "login_id": "mvalentine@instructure.com"
15
- },
16
- "workflow_state": "active"
17
- },
18
- {
19
- "id": 3,
20
- "role": "Custom Account Role",
21
- "role_id": 11,
22
- "user": {
23
- "id": 11,
24
- "name": "Test Account User",
25
- "sortable_name": "User, Test Account",
26
- "short_name": "Test Account User",
27
- "sis_user_id": null,
28
- "integration_id": null,
29
- "sis_import_id": null,
30
- "login_id": "testaccountuser@example.com"
31
- },
32
- "workflow_state": "active"
33
- },
34
- {
35
- "id": 4,
36
- "role": "Test",
37
- "role_id": 10,
38
- "user": {
39
- "id": 11,
40
- "name": "Test Account User",
41
- "sortable_name": "User, Test Account",
42
- "short_name": "Test Account User",
43
- "sis_user_id": null,
44
- "integration_id": null,
45
- "sis_import_id": null,
46
- "login_id": "testaccountuser@example.com"
47
- },
48
- "workflow_state": "active"
49
- }
50
- ]
2
+ {
3
+ "id": 2,
4
+ "role": "AccountAdmin",
5
+ "role_id": 1,
6
+ "user": {
7
+ "id": 1,
8
+ "name": "mvalentine@instructure.com",
9
+ "sortable_name": "mvalentine@instructure.com",
10
+ "short_name": "mvalentine@instructure.com",
11
+ "sis_user_id": null,
12
+ "integration_id": null,
13
+ "sis_import_id": null,
14
+ "login_id": "mvalentine@instructure.com"
15
+ },
16
+ "workflow_state": "active"
17
+ },
18
+ {
19
+ "id": 3,
20
+ "role": "Custom Account Role",
21
+ "role_id": 11,
22
+ "user": {
23
+ "id": 11,
24
+ "name": "Test Account User",
25
+ "sortable_name": "User, Test Account",
26
+ "short_name": "Test Account User",
27
+ "sis_user_id": null,
28
+ "integration_id": null,
29
+ "sis_import_id": null,
30
+ "login_id": "testaccountuser@example.com"
31
+ },
32
+ "workflow_state": "active"
33
+ },
34
+ {
35
+ "id": 4,
36
+ "role": "Test",
37
+ "role_id": 10,
38
+ "user": {
39
+ "id": 11,
40
+ "name": "Test Account User",
41
+ "sortable_name": "User, Test Account",
42
+ "short_name": "Test Account User",
43
+ "sis_user_id": null,
44
+ "integration_id": null,
45
+ "sis_import_id": null,
46
+ "login_id": "testaccountuser@example.com"
47
+ },
48
+ "workflow_state": "active"
49
+ }
50
+ ]