canvas_connect 0.1.0 → 0.1.1
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.
- data/Gemfile +1 -1
- data/app/models/adobe_connect_conference.rb +66 -29
- data/app/views/plugins/_connect_settings.html.erb +9 -0
- data/lib/canvas/plugins/validators/adobe_connect_validator.rb +1 -1
- data/lib/canvas_connect.rb +1 -0
- data/lib/canvas_connect/version.rb +1 -1
- data/spec_canvas/models/adobe_connect_conference_spec.rb +10 -4
- metadata +16 -9
- checksums.yaml +0 -7
data/Gemfile
CHANGED
@@ -36,9 +36,7 @@ class AdobeConnectConference < WebConference
|
|
36
36
|
#
|
37
37
|
# Returns conference status as a symbol (either :active or :closed).
|
38
38
|
def conference_status
|
39
|
-
if meeting_exists?
|
40
|
-
:active
|
41
|
-
elsif meeting_exists?
|
39
|
+
if meeting_exists?
|
42
40
|
:active
|
43
41
|
else
|
44
42
|
:closed
|
@@ -53,13 +51,18 @@ class AdobeConnectConference < WebConference
|
|
53
51
|
# Returns a meeting URL string.
|
54
52
|
def admin_join_url(admin, _ = nil)
|
55
53
|
user = add_host(admin)
|
56
|
-
settings = { :username => user.username, :password => user.password,
|
57
|
-
:domain => CanvasConnect.config[:domain] }
|
58
54
|
|
59
|
-
|
60
|
-
|
55
|
+
if config[:use_sis_ids] == "no"
|
56
|
+
settings = { :username => user.username, :password => user.password,
|
57
|
+
:domain => CanvasConnect.config[:domain] }
|
58
|
+
|
59
|
+
service = AdobeConnect::Service.new(settings)
|
60
|
+
service.log_in
|
61
61
|
|
62
|
-
|
62
|
+
"#{meeting_url}?session=#{service.session}"
|
63
|
+
else
|
64
|
+
meeting_url
|
65
|
+
end
|
63
66
|
end
|
64
67
|
|
65
68
|
# Public: Add a participant to the conference and create a meeting URL.
|
@@ -73,8 +76,10 @@ class AdobeConnectConference < WebConference
|
|
73
76
|
def participant_join_url(user, _ = nil)
|
74
77
|
if grants_right?(user, nil, :initiate)
|
75
78
|
admin_join_url(user)
|
76
|
-
|
79
|
+
elsif config[:use_sis_ids] == "no"
|
77
80
|
"#{meeting_url}?guestName=#{URI.escape(user.name)}"
|
81
|
+
else
|
82
|
+
meeting_url
|
78
83
|
end
|
79
84
|
end
|
80
85
|
|
@@ -84,11 +89,14 @@ class AdobeConnectConference < WebConference
|
|
84
89
|
# Returns an SCO-ID string.
|
85
90
|
def find_conference_key
|
86
91
|
unless conference_key.present?
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
attr('sco-id').
|
91
|
-
|
92
|
+
meeting_node = meeting_folder.contents.xpath("//sco[name=#{meeting_name.inspect}]")
|
93
|
+
# if meeting node exists, get that value
|
94
|
+
if meeting_node.present?
|
95
|
+
self.conference_key = meeting_node.attr('sco-id').value
|
96
|
+
else
|
97
|
+
# meeting node not found (by name)
|
98
|
+
raise CanvasConnect::MeetingNotFound, "Meeting with name '#{meeting_name}' not found"
|
99
|
+
end
|
92
100
|
end
|
93
101
|
|
94
102
|
conference_key
|
@@ -100,8 +108,21 @@ class AdobeConnectConference < WebConference
|
|
100
108
|
#
|
101
109
|
# Returns the CanvasConnect::ConnectUser.
|
102
110
|
def add_host(user)
|
103
|
-
options =
|
104
|
-
|
111
|
+
options = config[:use_sis_ids] == "yes" ?
|
112
|
+
{
|
113
|
+
first_name: user.first_name,
|
114
|
+
last_name: user.last_name,
|
115
|
+
email: user.email,
|
116
|
+
username: user.sis_pseudonym_for(user.account).try(:sis_user_id),
|
117
|
+
uuid: user.uuid
|
118
|
+
} :
|
119
|
+
{
|
120
|
+
first_name: user.first_name,
|
121
|
+
last_name: user.last_name,
|
122
|
+
email: connect_username(user),
|
123
|
+
username: connect_username(user),
|
124
|
+
uuid: user.uuid
|
125
|
+
}
|
105
126
|
|
106
127
|
connect_user = AdobeConnect::User.find(options) || AdobeConnect::User.create(options)
|
107
128
|
connect_service.permissions_update(
|
@@ -142,11 +163,13 @@ class AdobeConnectConference < WebConference
|
|
142
163
|
#
|
143
164
|
# Returns nothing.
|
144
165
|
def create_meeting
|
166
|
+
url_id = meeting_url_suffix
|
167
|
+
|
145
168
|
params = { :type => 'meeting',
|
146
169
|
:name => meeting_name,
|
147
170
|
:folder_id => meeting_folder.id,
|
148
171
|
:date_begin => start_at.iso8601,
|
149
|
-
:url_path =>
|
172
|
+
:url_path => url_id }
|
150
173
|
params[:end_at] = end_at.iso8601 if end_at.present?
|
151
174
|
|
152
175
|
result = connect_service.sco_update(params)
|
@@ -161,6 +184,9 @@ class AdobeConnectConference < WebConference
|
|
161
184
|
return nil
|
162
185
|
end
|
163
186
|
|
187
|
+
# if made it here, meeting was successfully created. Cache the meeting_url_suffix being used.
|
188
|
+
self.meeting_url_id = url_id
|
189
|
+
|
164
190
|
sco_id = result.body.at_xpath('//sco')['sco-id']
|
165
191
|
make_meeting_public(sco_id)
|
166
192
|
end
|
@@ -180,7 +206,7 @@ class AdobeConnectConference < WebConference
|
|
180
206
|
#
|
181
207
|
# Returns a boolean.
|
182
208
|
def meeting_exists?
|
183
|
-
result = connect_service.sco_by_url(:url_path =>
|
209
|
+
result = connect_service.sco_by_url(:url_path => meeting_url_id)
|
184
210
|
result.body.xpath('//status[@code="ok"]').present?
|
185
211
|
end
|
186
212
|
|
@@ -189,11 +215,7 @@ class AdobeConnectConference < WebConference
|
|
189
215
|
end
|
190
216
|
|
191
217
|
def meeting_url
|
192
|
-
|
193
|
-
end
|
194
|
-
|
195
|
-
def meeting_url_suffix
|
196
|
-
@cached_meeting_url_suffix ||= generate_meeting_url_suffix
|
218
|
+
"#{config[:domain]}/#{meeting_url_id}"
|
197
219
|
end
|
198
220
|
|
199
221
|
# Internal: Get and cache a reference to the remote folder.
|
@@ -226,17 +248,32 @@ class AdobeConnectConference < WebConference
|
|
226
248
|
"#{course_code}: #{self.title} [#{self.id}]"
|
227
249
|
end
|
228
250
|
|
229
|
-
# Internal:
|
251
|
+
# Internal: Get the unique ID to identify the meeting in an Adobe url.
|
252
|
+
#
|
253
|
+
# Returns a string or nil.
|
254
|
+
def meeting_url_id
|
255
|
+
# Return the stored setting value if present. If missing, return the legacy generated format.
|
256
|
+
settings[:meeting_url_id] || meeting_url_suffix_legacy
|
257
|
+
end
|
258
|
+
|
259
|
+
# Internal: Track the unique ID to identify the meeting in an Adobe url.
|
230
260
|
#
|
231
|
-
# Returns
|
232
|
-
def
|
233
|
-
|
261
|
+
# Returns nothing
|
262
|
+
def meeting_url_id=(value)
|
263
|
+
settings[:meeting_url_id] = value
|
264
|
+
end
|
265
|
+
|
266
|
+
# Internal: Generate a URL suffix for this conference. Uses a more globally unique approach.
|
267
|
+
#
|
268
|
+
# Returns a URL suffix string of format "canvas-meeting-:root_acount_global_id-:id-:created_at_as_integer".
|
269
|
+
def meeting_url_suffix
|
270
|
+
"canvas-mtg-#{self.context.root_account.global_id}-#{self.id}-#{self.created_at.to_i}"
|
234
271
|
end
|
235
272
|
|
236
|
-
# Internal: Generate a URL suffix for this conference.
|
273
|
+
# Internal: Generate a URL suffix for this conference. Uses the legacy approach with overly simple uniqueness
|
237
274
|
#
|
238
275
|
# Returns a URL suffix string of format "canvas-meeting-:id".
|
239
|
-
def
|
276
|
+
def meeting_url_suffix_legacy
|
240
277
|
"canvas-meeting-#{self.id}"
|
241
278
|
end
|
242
279
|
end
|
@@ -32,6 +32,15 @@
|
|
32
32
|
<%= f.password_field :password, :autocomplete => false %><br>
|
33
33
|
</td>
|
34
34
|
</tr>
|
35
|
+
<tr>
|
36
|
+
<td><%= f.label :use_sis_ids, "Use SIS IDs" %></td>
|
37
|
+
<td>
|
38
|
+
<%= f.check_box "use_sis_ids", {}, 'yes', 'no' %><br />
|
39
|
+
<small class="help-text">
|
40
|
+
<%= t(:use_sis_ids_description, "Use a user's SIS as their Connect login ID") %>
|
41
|
+
</small>
|
42
|
+
</td>
|
43
|
+
<tr>
|
35
44
|
</tbody>
|
36
45
|
</table>
|
37
46
|
<% end %>
|
@@ -21,7 +21,7 @@ module Canvas
|
|
21
21
|
module Validators
|
22
22
|
module AdobeConnectValidator
|
23
23
|
# Public: An array of allowed plugin settings.
|
24
|
-
REQUIRED_KEYS = %w{domain login password meeting_container}
|
24
|
+
REQUIRED_KEYS = %w{domain login password meeting_container use_sis_ids}
|
25
25
|
|
26
26
|
# Public: Validate setting input for this plugin.
|
27
27
|
#
|
data/lib/canvas_connect.rb
CHANGED
@@ -28,8 +28,8 @@ describe AdobeConnectConference do
|
|
28
28
|
}
|
29
29
|
|
30
30
|
before(:each) do
|
31
|
-
AdobeConnectConference.stubs(:config).returns(CONNECT_CONFIG)
|
32
31
|
@conference = AdobeConnectConference.new
|
32
|
+
@conference.stubs(:config).returns(CONNECT_CONFIG)
|
33
33
|
end
|
34
34
|
|
35
35
|
subject { AdobeConnectConference.new }
|
@@ -37,11 +37,17 @@ describe AdobeConnectConference do
|
|
37
37
|
context 'with an admin participant' do
|
38
38
|
before(:each) do
|
39
39
|
@user = User.new(:name => 'Don Draper')
|
40
|
+
AdobeConnect::Service.stubs(:user_session).returns('CookieValue')
|
41
|
+
@conference.expects(:add_host).with(@user).returns(@user)
|
40
42
|
end
|
41
43
|
|
42
|
-
it 'should generate an admin url' do
|
43
|
-
|
44
|
-
@conference.
|
44
|
+
it 'should generate an admin url using unique format if stored' do
|
45
|
+
stored_url = 'canvas-mtg-ACCOUNT_ID-ID-CREATED_SECONDS'
|
46
|
+
@conference.settings[:meeting_url_id] = stored_url
|
47
|
+
@conference.admin_join_url(@user).should == "http://connect.example.com/#{stored_url}"
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should generate an admin url using legacy format' do
|
45
51
|
@conference.admin_join_url(@user).should == "http://connect.example.com/canvas-meeting-#{@conference.id}"
|
46
52
|
end
|
47
53
|
end
|
metadata
CHANGED
@@ -1,32 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: canvas_connect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Zach Pendleton
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-
|
12
|
+
date: 2013-07-10 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: rake
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- - '>='
|
19
|
+
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: 0.9.6
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
|
-
- - '>='
|
27
|
+
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: 0.9.6
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: adobe_connect
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - ~>
|
32
36
|
- !ruby/object:Gem::Version
|
@@ -34,6 +38,7 @@ dependencies:
|
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - ~>
|
39
44
|
- !ruby/object:Gem::Version
|
@@ -65,26 +70,28 @@ files:
|
|
65
70
|
- spec_canvas/models/adobe_connect_conference_spec.rb
|
66
71
|
homepage: http://instructure.com
|
67
72
|
licenses: []
|
68
|
-
metadata: {}
|
69
73
|
post_install_message:
|
70
74
|
rdoc_options: []
|
71
75
|
require_paths:
|
72
76
|
- app
|
73
77
|
- lib
|
74
78
|
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
75
80
|
requirements:
|
76
|
-
- - '>='
|
81
|
+
- - ! '>='
|
77
82
|
- !ruby/object:Gem::Version
|
78
83
|
version: '0'
|
79
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
80
86
|
requirements:
|
81
|
-
- - '>='
|
87
|
+
- - ! '>='
|
82
88
|
- !ruby/object:Gem::Version
|
83
89
|
version: '0'
|
84
90
|
requirements: []
|
85
91
|
rubyforge_project:
|
86
|
-
rubygems_version:
|
92
|
+
rubygems_version: 1.8.25
|
87
93
|
signing_key:
|
88
|
-
specification_version:
|
94
|
+
specification_version: 3
|
89
95
|
summary: Adobe Connect integration for Instructure Canvas (http://instructure.com).
|
90
96
|
test_files: []
|
97
|
+
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: b78cf0edc21638b06e639c666bcd9256646dd93a
|
4
|
-
data.tar.gz: 3f92a2cf1aa6fa71844742663d0a520c3f9398fb
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: b0b9419da7ee66e6f63f8b99166eaac2fc6144931329de7350321b452c16d90a5c443316a601da462c17260ee2d4a7482b61d6c4cee19f4be0a609abb39caf70
|
7
|
-
data.tar.gz: f1a7c1a1df733b26493ac64f1e3e462a7c925784a2d3fbcfb0da721c9433adc94ceb9e7f2b34a50ed87eed3b9713e30dcf053cfb99b6b0a6a6bac41aded6a83f
|