panda_pal 5.4.0.beta1 → 5.4.0.beta6

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: 46890814bf0be5add6c0db17248c08bbc756bd7bdbdd4eb1ef52a23494bfcf1f
4
- data.tar.gz: a76de9599bd0ca52b4488814e2d5d03bffde6bb94c1614f3e45e886bd001d55a
3
+ metadata.gz: 2ad739feb20cd4db69778441ccc21256211d3a8715b1ea82921a9786ed1d6f44
4
+ data.tar.gz: 6d0e6927cd23b2a56336a0a9e3dbfda787cb59415c13d1fc4eb316e1c87c400c
5
5
  SHA512:
6
- metadata.gz: 7d8640b016ca32a5d1c9d57f4abb7380e2d41f0035f138b2e6fb61155a0e6dec93be6601bdf607303606b5a8d0f3901dafa04424e09f66a942952980c3c2959d
7
- data.tar.gz: 6ae5fbd00abad5e6387ad87226f533c8a1c73561865341d16f821c71eadff43e685643387f8d0745606b3d688965dd9a22d12b060aef735385d662b90cafa692
6
+ metadata.gz: 9389b4e09c6fb0c270c7cb1c641bbe4cdc010b9084b51519100dfdf9cd4c103e36a8f0d86819d6619e2dc27f42afa52d214c7936c75c120ce6c994ca30ce1e21
7
+ data.tar.gz: 4fe4207ca646e48c6d13dfe7b259d306066b812b3a1502fb866f0501cffcb43dc4e935c8cd3ad198980d16582125441e5eb11c94601d6a3f3cad12e60c900c5e
@@ -0,0 +1,3 @@
1
+ // link_tree ../images/panda_pal
2
+ //= link_directory ../javascripts/panda_pal .js
3
+ //= link_directory ../stylesheets/panda_pal .css
@@ -1,3 +1,6 @@
1
+ require_relative './organization_concerns/settings_validation'
2
+ require_relative './organization_concerns/task_scheduling'
3
+
1
4
  module PandaPal
2
5
  module OrganizationConcerns; end
3
6
 
@@ -1,4 +1,17 @@
1
- return unless defined?(Sidekiq.schedule)
1
+ unless defined?(Sidekiq.schedule)
2
+ module PandaPal
3
+ module OrganizationConcerns
4
+ module TaskScheduling
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ raise "The PandaPal TaskScheduling requires Sidekiq-scheduler to be installed"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ return
14
+ end
2
15
 
3
16
  require_relative 'settings_validation'
4
17
 
@@ -0,0 +1,85 @@
1
+ module PandaPal
2
+ module AbilityMixin
3
+ extend ActiveSupport::Concern
4
+
5
+ class_methods do
6
+ def self.role_permissions(labels)
7
+ roles = find_roles_by_label(labels)
8
+
9
+ if Rails.env.test? && roles.count == 0 && (labels || []).include?('Administrator')
10
+ return Hash.new(true)
11
+ end
12
+
13
+ final = {}
14
+ roles.find_each do |role|
15
+ role.permissions.each do |perm_name, perm|
16
+ final[perm_name] = false if final[perm_name].nil?
17
+ final[perm_name] = true if perm['enabled'] == true
18
+ end
19
+ end
20
+ final
21
+ end
22
+
23
+ def self.find_roles_by_label(labels)
24
+ raise "PandaPal AbilityMixin's support for Roles and Permissions requires that Roles be synced by CanvasSync" unless defined?(Role)
25
+
26
+ built_ins = []
27
+ labels = labels.split(',') if labels.is_a?(String)
28
+ custom_labels = Array(labels).reject do |l|
29
+ if role_is_default?(l)
30
+ built_ins << l
31
+ elsif l == 'Account Admin'
32
+ built_ins << 'AccountMembership'
33
+ else
34
+ next
35
+ end
36
+ true
37
+ end
38
+ Role.where(workflow_state: 'built_in', base_role_type: built_ins)
39
+ .or(Role.where.not(workflow_state: 'built_in').where(label: custom_labels))
40
+ end
41
+
42
+ def self.role_is_default?(role)
43
+ %w[TeacherEnrollment TaEnrollment StudentEnrollment DesignerEnrollment ObserverEnrollment].include? role
44
+ end
45
+ end
46
+
47
+ def is_lti_launch?
48
+ @controller.current_session.present?
49
+ end
50
+
51
+ def panda_pal_session
52
+ @panda_pal_session ||= @controller.current_session&.data || {}
53
+ end
54
+
55
+ def rails_session
56
+ @rails_session ||= @controller.session
57
+ end
58
+
59
+ def launch_params
60
+ @launch_params ||= panda_pal_session[:launch_params] || {}
61
+ end
62
+
63
+ # Roles and Permissions
64
+ def lti_roles
65
+ @lti_roles ||= LTIRoles::RoleManager.new(launch_params['ext_roles'] || '')
66
+ end
67
+
68
+ def canvas_permissions
69
+ panda_pal_session[:canvas_permissions] ||= self.class.role_permissions(launch_params['custom_canvas_role'])
70
+ end
71
+
72
+ def canvas_role_labels
73
+ labels = launch_params['custom_canvas_role']
74
+ labels.is_a?(String) ? labels.split(',') : []
75
+ end
76
+
77
+ def canvas_roles
78
+ self.class.find_roles_by_label(canvas_role_labels)
79
+ end
80
+
81
+ def launch_role_ids
82
+ panda_pal_session[:launch_role_ids] ||= canvas_roles.map(&:canvas_id)
83
+ end
84
+ end
85
+ end
@@ -65,6 +65,10 @@ module PandaPal
65
65
  end
66
66
  end
67
67
 
68
+ initializer "panda_pal.assets.precompile" do |app|
69
+ app.config.assets.precompile << "panda_pal_manifest.js"
70
+ end
71
+
68
72
  initializer :secure_headers do |app|
69
73
  begin
70
74
  ::SecureHeaders::Configuration.default do |config|
@@ -13,11 +13,15 @@ module PandaPal::Helpers
13
13
  end
14
14
 
15
15
  class_methods do
16
- def link_nonce_type(value = :not_given)
17
- if value == :not_given
18
- @link_nonce_type || superclass.try(:link_nonce_type) || :nonce
16
+ def link_nonce_type(value = :not_given, use_non_app: false)
17
+ if use_non_app || !defined?(::ApplicationController) || self <= ::ApplicationController
18
+ if value == :not_given
19
+ @link_nonce_type || superclass.try(:link_nonce_type) || :nonce
20
+ else
21
+ @link_nonce_type = value
22
+ end
19
23
  else
20
- @link_nonce_type = value
24
+ ::ApplicationController.link_nonce_type(value, use_non_app: true)
21
25
  end
22
26
  end
23
27
  end
@@ -0,0 +1,50 @@
1
+ module PandaPal::Jobs
2
+ class MissingGradePassbackParams < StandardError; end
3
+
4
+ class GradePassbackFailure < StandardError; end
5
+
6
+ class GradePassbackJob < ActiveJob::Base
7
+ sidekiq_options retry: 5
8
+
9
+ attr_accessor :organization, :opts
10
+
11
+ # Required values for opts: passback_guid, passback_url, score AND/OR total_score.
12
+ # Possible values for opts: cdata_text, text, url, submitted_at, lti_launch_url.
13
+ # passback_guid is sent in launch params as 'lis_result_sourcedid'.
14
+ # passback_url is sent in LTI launch params as 'lis_outcome_service_url'.
15
+ # See https://canvas.instructure.com/doc/api/file.assignment_tools.html
16
+ def perform(organization, opts = {})
17
+ opts = opts.with_indifferent_access
18
+ raise MissingGradePassbackParams unless valid_options(opts)
19
+
20
+ @organization = organization
21
+ @opts = opts
22
+
23
+ post_to_lms
24
+ end
25
+
26
+ private
27
+
28
+ def post_to_lms
29
+ result = tool_provider.post_extended_replace_result!(opts)
30
+ unless result.success?
31
+ Rails.logger.error "Grade passback failure: #{result.response_code} #{result.code_major} #{result.severity} #{result.description}"
32
+ raise GradePassbackFailure
33
+ end
34
+ end
35
+
36
+ def tool_provider
37
+ @tool_provider ||= IMS::LTI::ToolProvider.new(
38
+ organization.key,
39
+ organization.secret,
40
+ 'lis_result_sourcedid' => opts[:passback_guid],
41
+ 'lis_outcome_service_url' => opts[:passback_url]
42
+ ).extend(IMS::LTI::Extensions::OutcomeData::ToolProvider)
43
+ end
44
+
45
+ def valid_options(opts = {})
46
+ return opts[:passback_guid] && opts[:passback_url] && (opts[:score] || opts[:total_score])
47
+ end
48
+
49
+ end
50
+ end
@@ -1,3 +1,3 @@
1
1
  module PandaPal
2
- VERSION = "5.4.0.beta1"
2
+ VERSION = "5.4.0.beta6"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: panda_pal
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.4.0.beta1
4
+ version: 5.4.0.beta6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Instructure ProServe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-07 00:00:00.000000000 Z
11
+ date: 2021-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -208,6 +208,7 @@ files:
208
208
  - MIT-LICENSE
209
209
  - README.md
210
210
  - Rakefile
211
+ - app/assets/config/panda_pal_manifest.js
211
212
  - app/assets/javascripts/panda_pal/application.js
212
213
  - app/assets/javascripts/panda_pal/lti.js
213
214
  - app/assets/stylesheets/panda_pal/application.css
@@ -243,12 +244,14 @@ files:
243
244
  - db/migrate/20171205183457_encrypt_organization_settings.rb
244
245
  - db/migrate/20171205194657_remove_old_organization_settings.rb
245
246
  - lib/panda_pal.rb
247
+ - lib/panda_pal/ability_mixin.rb
246
248
  - lib/panda_pal/engine.rb
247
249
  - lib/panda_pal/helpers.rb
248
250
  - lib/panda_pal/helpers/controller_helper.rb
249
251
  - lib/panda_pal/helpers/route_helper.rb
250
252
  - lib/panda_pal/helpers/secure_headers.rb
251
253
  - lib/panda_pal/helpers/session_replacement.rb
254
+ - lib/panda_pal/jobs/grade_passback_job.rb
252
255
  - lib/panda_pal/plugins.rb
253
256
  - lib/panda_pal/version.rb
254
257
  - lib/tasks/panda_pal_tasks.rake