panda_pal 5.6.9 → 5.6.10

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: 7746e5ec8e6a9422e44a880dda50b985b48706b727e48a02fc2918b75d904125
4
- data.tar.gz: 3456caae1ed87a8accafcfa4145ca5ee403fe1bd8f9ac42c3796df8dc334a17c
3
+ metadata.gz: 7c935b2a3eae094ada04fdc46e45f25414c61b2e9afbf9c77d81ae611343548a
4
+ data.tar.gz: 96a098c934a92e921dc951ea0c492a0af5a5c2d8ebfbe57028a344a025c4e718
5
5
  SHA512:
6
- metadata.gz: 0616e5eddcefae83d73bb8da9cb246baef0b06417ae1bbeea2545a1dccebf1d7e1b681931a449e00cc14e5ec3cb0d07c03adc7676048c0e29111701601017171
7
- data.tar.gz: 384c9d6bdab817b224670c9d6e5fa080e791f9c2ed0442a0e8fa242cb5572ade7ad696a115b58f4c181bec8e2bed2b4fe39169d3a0eb0d796987306986b38549
6
+ metadata.gz: e63f7e0b91ce15a03e1baa5f64ec479fb28a921f1301daaac2c5376f3da8aea0728c0639f25836ef9e5e228fe7dd82424935df92511c50d3ad6ca0afa10c55c4
7
+ data.tar.gz: 3e8ffeff4dc35b093d8c2a2b243a1f5a496902508e3207a564285617b7465c803e7d875a21703e452c5afd53529ceb2f660f7e77bfdecd479178be9567f805c0
@@ -72,10 +72,6 @@ module PandaPal
72
72
  find_by_name(Apartment::Tenant.current)
73
73
  end
74
74
 
75
- PandaPal.resolved_extensions_for(self).each do |ext|
76
- include ext
77
- end
78
-
79
75
  def create_api(logic, expiration: nil, uses: nil, host: nil)
80
76
  switch_tenant do
81
77
  logic = "current_organization.#{logic}" if logic.is_a?(Symbol)
@@ -102,6 +98,14 @@ module PandaPal
102
98
  switch_tenant if do_switch
103
99
  end
104
100
 
101
+ def platform_extensions(platform_type)
102
+ return self unless defined?(platform_type::OrgExtension)
103
+ return self if self.class < platform_type::OrgExtension
104
+
105
+ scl = platform_type.org_subclass
106
+ scl ? becomes(scl) : self
107
+ end
108
+
105
109
  if !PandaPal.lti_options[:platform].present? || PandaPal.lti_options[:platform].is_a?(String)
106
110
  platform_cls = Platform.resolve_platform_class(nil) rescue nil
107
111
  if platform_cls && defined?(platform_cls::OrgExtension)
@@ -109,6 +113,10 @@ module PandaPal
109
113
  end
110
114
  end
111
115
 
116
+ PandaPal.resolved_extensions_for(self).each do |ext|
117
+ include ext
118
+ end
119
+
112
120
  private
113
121
 
114
122
  def create_schema
@@ -28,54 +28,77 @@ module PandaPal
28
28
  module OrgExtension
29
29
  extend ActiveSupport::Concern
30
30
 
31
- def install_lti(host: nil, context: :root_account, version: 'v1p3', exists: :error, dedicated_deployment: false)
32
- raise "Automatically installing this LTI requires Bearcat." unless defined?(Bearcat)
31
+ included do
32
+ define_model_callbacks :lti_install
33
+ end
33
34
 
35
+ def _parse_lti_context(context)
34
36
  context = context.to_s
35
37
  context = 'account/self' if context == 'root_account'
36
38
  cid, ctype = context.split(/[\.\/]/).reverse
37
39
  ctype ||= 'account'
38
40
 
39
- if version == 'v1p0'
40
- existing_installs = _find_existing_installs(exists: exists) do |lti|
41
- lti[:consumer_key] == self.key
42
- end
41
+ [ctype, cid]
42
+ end
43
43
 
44
- conf = {
45
- name: PandaPal.lti_options[:title],
46
- description: PandaPal.lti_options[:description],
47
- consumer_key: self.key,
48
- shared_secret: self.secret,
49
- privacy_level: "public",
50
- config_type: 'by_url',
51
- config_url: PandaPal::LaunchUrlHelpers.resolve_route(:v1p0_config_url, host: host),
52
- }
44
+ def install_lti(host: nil, context: :root_account, version: 'v1p3', exists: :error, dedicated_deployment: false)
45
+ raise "Automatically installing this LTI requires Bearcat." unless defined?(Bearcat)
53
46
 
54
- bearcat_client.send(:"create_#{ctype}_external_tool", cid, conf)
55
- elsif version == 'v1p3'
56
- ekey = _ensure_lti_v1p3_key(exists: exists)
47
+ run_callbacks :lti_install do
48
+ ctype, cid = _parse_lti_context(context)
57
49
 
58
- existing_installs = _find_existing_installs(exists: exists) do |lti|
59
- lti[:developer_key_id] == (ekey[:id] % 10_000_000_000_000)
60
- end
50
+ if version == 'v1p0'
51
+ existing_installs = _find_existing_installs(exists: exists) do |lti|
52
+ lti[:consumer_key] == self.key
53
+ end
61
54
 
62
- scope_tool = bearcat_client.send(:"create_#{ctype}_external_tool", cid, {
63
- client_id: ekey[:id],
64
- })
55
+ conf = {
56
+ name: PandaPal.lti_options[:title],
57
+ description: PandaPal.lti_options[:description],
58
+ consumer_key: self.key,
59
+ shared_secret: self.secret,
60
+ privacy_level: "public",
61
+ config_type: 'by_url',
62
+ config_url: PandaPal::LaunchUrlHelpers.resolve_route(:v1p0_config_url, host: host),
63
+ }
64
+
65
+ api_result = existing_installs[0] ? bearcat_client.send(:"edit_#{ctype}_external_tool", cid, existing_installs[0][:id], conf) : bearcat_client.send(:"create_#{ctype}_external_tool", cid, conf)
66
+
67
+ @new_lti_installation = api_result
68
+ elsif version == 'v1p3'
69
+ ekey = _ensure_lti_v1p3_key(exists: exists, host: host)
70
+
71
+ existing_installs = _find_existing_installs(context, exists: exists) do |lti|
72
+ lti[:developer_key_id] == (ekey[:id] % 10_000_000_000_000)
73
+ end
65
74
 
66
- new_client_id = "#{ekey[:id]}"
67
- new_client_id += "/#{scope_tool[:deployment_id]}" if dedicated_deployment
75
+ scope_tool = existing_installs[0]
68
76
 
69
- self.key = new_client_id
70
- self.secret = ekey[:api_key]
77
+ # Don't need to do an update if it already exists - Settings are stored on the LTI Key instead of the installation
78
+ unless scope_tool
79
+ scope_tool = bearcat_client.send(:"create_#{ctype}_external_tool", cid, {
80
+ client_id: ekey[:id],
81
+ })
71
82
 
72
- save! if changed!
73
- else
74
- raise "Unrecognized LTI Version #{version}"
83
+ new_client_id = "#{ekey[:id]}"
84
+ new_client_id += "/#{scope_tool[:deployment_id]}" if dedicated_deployment
85
+
86
+ self.key = new_client_id
87
+ self.secret = ekey[:api_key]
88
+
89
+ save! if changed?
90
+ end
91
+
92
+ @new_lti_installation = scope_tool
93
+ else
94
+ raise "Unrecognized LTI Version #{version}"
95
+ end
75
96
  end
97
+
98
+ save!
76
99
  end
77
100
 
78
- def _ensure_lti_v1p3_key(exists:)
101
+ def _ensure_lti_v1p3_key(exists:, host:)
79
102
  current_client_id = self.key.split('/')[0]
80
103
 
81
104
  existing_keys = []
@@ -111,7 +134,10 @@ module PandaPal
111
134
  # Update Existing
112
135
  ekey = bearcat_client.put("api/lti/developer_keys/#{ekey[:id]}/tool_configuration", {
113
136
  developer_key: ekey[:developer_key],
114
- tool_configuration: lti_json,
137
+ # tool_configuration: lti_json,
138
+ tool_configuration: {
139
+ settings: lti_json,
140
+ },
115
141
  })
116
142
  end
117
143
 
@@ -128,26 +154,32 @@ module PandaPal
128
154
  ekey
129
155
  end
130
156
 
131
- def _find_existing_installs(exists:, &matcher)
157
+ def _find_existing_installs(context, exists: nil, &matcher)
158
+ ctype, cid = _parse_lti_context(context)
159
+
132
160
  existing_installs = bearcat_client.send(:"#{ctype}_external_tools", cid).all_pages_each.filter do |cet|
133
161
  matcher.call(cet)
134
162
  end
135
163
 
136
- if existing_installs.present?
164
+ if exists.present? && existing_installs.present?
137
165
  case exists
138
166
  when :error
139
167
  raise "Tool with key #{self.key} already installed"
140
168
  when :duplicate
169
+ []
141
170
  when :replace
142
171
  existing_installs.each do |install|
143
172
  bearcat_client.send(:"delete_#{ctype}_external_tool", cid, install[:id])
144
173
  end
174
+ []
175
+ when :update
176
+ existing_installs
145
177
  else
146
178
  raise "exists: #{exists} is not supported"
147
179
  end
180
+ else
181
+ existing_installs
148
182
  end
149
-
150
- existing_installs
151
183
  end
152
184
 
153
185
  def reinstall_lti!(*args, **kwargs)
@@ -199,6 +231,10 @@ module PandaPal
199
231
  end
200
232
  end
201
233
 
234
+ def lti_installations(context= :root_account)
235
+ _find_existing_installs(context)
236
+ end
237
+
202
238
  def canvas_url
203
239
  PandaPal::Platform.find_org_setting([
204
240
  "canvas.base_url",
@@ -72,14 +72,13 @@ module PandaPal
72
72
  raise "Unknown platform '#{platform}'"
73
73
  end
74
74
 
75
- def self.materialize_extension(org)
75
+ def self.org_subclass
76
76
  return nil unless defined?(self::OrgExtension)
77
+ oext = self::OrgExtension
77
78
 
78
- ext_mod = self::OrgExtension
79
- org = org.dup
80
- org.extend(ext_mod)
81
-
82
- org
79
+ @org_subclass ||= Class.new(PandaPal::Organization) do
80
+ include oext
81
+ end
83
82
  end
84
83
 
85
84
  protected
@@ -1,3 +1,3 @@
1
1
  module PandaPal
2
- VERSION = "5.6.9"
2
+ VERSION = "5.6.10"
3
3
  end