panda_pal 5.6.9 → 5.6.10

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 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