canvas_webex 0.11 → 0.12
Sign up to get free protection for your applications and to get access to all the features.
- data/app/models/cisco_webex_conference.rb +25 -5
- data/lib/canvas_webex.rb +2 -0
- data/lib/canvas_webex/meeting.rb +5 -48
- data/lib/canvas_webex/service.rb +52 -0
- data/lib/canvas_webex/training.rb +55 -0
- data/lib/canvas_webex/version.rb +1 -1
- data/lib/canvas_webex/webex_session.rb +78 -0
- data/spec/fixtures/get_training.xml +123 -0
- data/spec/lib/canvas_webex/meeting_spec.rb +0 -6
- data/spec/lib/canvas_webex/service_spec.rb +0 -1
- data/spec/lib/canvas_webex/training_spec.rb +27 -0
- data/spec/lib/canvas_webex/webex_session_spec.rb +12 -0
- data/spec/spec_helper.rb +2 -0
- metadata +10 -2
@@ -20,6 +20,18 @@ class CiscoWebexConference < WebConference
|
|
20
20
|
|
21
21
|
after_save :format_scheduled_date
|
22
22
|
|
23
|
+
user_setting_field :webex_service, {
|
24
|
+
name: -> { t('webex_service_setting', 'Service') },
|
25
|
+
description: -> { t('webex_service_setting_description', 'Service') },
|
26
|
+
type: :select,
|
27
|
+
visible: true,
|
28
|
+
location: 'userSettings',
|
29
|
+
options: [
|
30
|
+
{value: 'meeting', name: -> { t('webex_meeting_center', 'Meeting Center') }},
|
31
|
+
{value: 'training', name: -> { t('webex_training_center', 'Training Center') }}
|
32
|
+
]
|
33
|
+
}
|
34
|
+
|
23
35
|
user_setting_field :scheduled_date, {
|
24
36
|
name: -> { t('scheduled_date_setting', 'Scheduled Date') },
|
25
37
|
description: -> { t('scheduled_date_setting_description', 'Scheduled Date') },
|
@@ -46,11 +58,12 @@ class CiscoWebexConference < WebConference
|
|
46
58
|
options = {
|
47
59
|
duration: self.duration || 0,
|
48
60
|
emails: settings[:external_emails].nil? ? [] : settings[:external_emails].strip.split(';'),
|
49
|
-
time_zone: user.time_zone
|
61
|
+
time_zone: user.time_zone,
|
62
|
+
service: settings[:webex_service]
|
50
63
|
}
|
51
64
|
options[:scheduled_date] = scheduled_date.in_time_zone(user.time_zone) if scheduled_date.present?
|
52
|
-
|
53
|
-
self.conference_key =
|
65
|
+
webex_session = CanvasWebex::WebexSession.create(self.title, options)
|
66
|
+
self.conference_key = webex_session.session_key
|
54
67
|
save
|
55
68
|
end
|
56
69
|
self.conference_key
|
@@ -126,7 +139,7 @@ class CiscoWebexConference < WebConference
|
|
126
139
|
#
|
127
140
|
# Returns an Array of recording hashes, or an empty Array if there are no recordings
|
128
141
|
def recordings
|
129
|
-
CanvasWebex::
|
142
|
+
CanvasWebex::WebexSession.recordings(self.conference_key)
|
130
143
|
end
|
131
144
|
|
132
145
|
def after_find
|
@@ -148,7 +161,14 @@ class CiscoWebexConference < WebConference
|
|
148
161
|
#
|
149
162
|
# Returns the meeting object, or nil if the meeting is ended
|
150
163
|
def meeting
|
151
|
-
|
164
|
+
@meeting ||= if self.conference_key
|
165
|
+
case settings[:webex_service]
|
166
|
+
when 'meeting'
|
167
|
+
CanvasWebex::Meeting.retrieve(self.conference_key)
|
168
|
+
when 'training'
|
169
|
+
CanvasWebex::Training.retrieve(self.conference_key)
|
170
|
+
end
|
171
|
+
end
|
152
172
|
end
|
153
173
|
|
154
174
|
def format_scheduled_date
|
data/lib/canvas_webex.rb
CHANGED
@@ -33,7 +33,9 @@ module CanvasWebex
|
|
33
33
|
require_dependency File.expand_path('../app/models/cisco_webex_conference.rb', File.dirname(__FILE__))
|
34
34
|
require_dependency "canvas/plugins/validators/cisco_webex_validator"
|
35
35
|
require_dependency "canvas/plugins/cisco_webex"
|
36
|
+
require_dependency "canvas_webex/webex_session"
|
36
37
|
require_dependency "canvas_webex/service"
|
38
|
+
require_dependency "canvas_webex/training"
|
37
39
|
require_dependency "canvas_webex/meeting"
|
38
40
|
|
39
41
|
Canvas::Plugins::CiscoWebex.new
|
data/lib/canvas_webex/meeting.rb
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
module CanvasWebex
|
19
|
-
class Meeting
|
19
|
+
class Meeting < CanvasWebex::WebexSession
|
20
20
|
|
21
21
|
ATTRIBUTES = [:meeting_key, :conf_name, :start_date, :host_joined, :status]
|
22
22
|
|
@@ -34,53 +34,6 @@ module CanvasWebex
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
def host_url(client = CanvasWebex.client)
|
38
|
-
if response = client.host_meeting_url(meeting_key, nil)
|
39
|
-
response.at_xpath('hostMeetingURL').try(:text)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def join_url(client = CanvasWebex.client)
|
44
|
-
if response = client.join_meeting_url(meeting_key, nil)
|
45
|
-
response.at_xpath('joinMeetingURL').text
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def self.recordings(meeting_key, client = CanvasWebex.client)
|
50
|
-
if response = meeting_key && client.list_recordings(meeting_key)
|
51
|
-
response.search('recording').map do |rec_xml|
|
52
|
-
created_ts = rec_xml.at_xpath('createTime').try(:text)
|
53
|
-
tz_id = rec_xml.at_xpath('timeZoneID').try(:text)
|
54
|
-
created_at = parse_time_stamp(tz_id, created_ts)
|
55
|
-
recording = {
|
56
|
-
recording_id: rec_xml.at_xpath('recordingID').try(:text),
|
57
|
-
title: rec_xml.at_xpath('name').try(:text),
|
58
|
-
playback_url: rec_xml.at_xpath('streamURL').try(:text),
|
59
|
-
created_at: parse_time_stamp(tz_id, created_ts).to_s
|
60
|
-
}
|
61
|
-
if duration = rec_xml.at_xpath('duration').try(:text)
|
62
|
-
recording[:duration_minutes] = duration.to_i / 60
|
63
|
-
end
|
64
|
-
recording
|
65
|
-
end
|
66
|
-
else
|
67
|
-
[]
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def self.parse_time_stamp(time_zone, time_stamp, client = CanvasWebex.client)
|
72
|
-
if response = client.list_time_zone(time_zone, time_stamp)
|
73
|
-
if m_offset = response.at_xpath('timeZone/gmtOffset').try(:text).try(:to_i)
|
74
|
-
offset_string = "%+0#3d:00" %[(m_offset / 60)]
|
75
|
-
DateTime.strptime(time_stamp + offset_string, '%m/%d/%Y %H:%M:%S%z')
|
76
|
-
else
|
77
|
-
DateTime.strptime(time_stamp, '%m/%d/%Y %H:%M:%S')
|
78
|
-
end
|
79
|
-
else
|
80
|
-
""
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
37
|
# Public: Create a new Meeting
|
85
38
|
#
|
86
39
|
# meeting_xml - The xml returned for a meeting (must already exist).
|
@@ -89,6 +42,10 @@ module CanvasWebex
|
|
89
42
|
@xml = meeting_xml
|
90
43
|
end
|
91
44
|
|
45
|
+
def session_key
|
46
|
+
meeting_key
|
47
|
+
end
|
48
|
+
|
92
49
|
def method_missing(meth, *args, &block)
|
93
50
|
if ATTRIBUTES.include?(meth)
|
94
51
|
@attr_cache[meth] ||= @xml.at_xpath("//*[contains(translate(name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'), '#{meth.to_s.camelcase(:lower).downcase}')]").try(:text)
|
data/lib/canvas_webex/service.rb
CHANGED
@@ -66,6 +66,45 @@ module CanvasWebex
|
|
66
66
|
request(body)
|
67
67
|
end
|
68
68
|
|
69
|
+
def create_training_session(confName, options = {})
|
70
|
+
body = xml_request do |xml|
|
71
|
+
xml.bodyContent('xsi:type' =>'java:com.webex.service.binding.training.CreateTrainingSession'){
|
72
|
+
xml.metaData{
|
73
|
+
xml.confName confName
|
74
|
+
}
|
75
|
+
if meeting_password != nil && meeting_password.strip != ''
|
76
|
+
xml.accessControl{
|
77
|
+
xml.sessionPassword meeting_password
|
78
|
+
}
|
79
|
+
end
|
80
|
+
xml.schedule{
|
81
|
+
if options[:scheduled_date].present?
|
82
|
+
xml.startDate options[:scheduled_date].in_time_zone('America/Los_Angeles').strftime("%m/%d/%Y %T") rescue nil
|
83
|
+
xml.timeZoneID 4
|
84
|
+
else
|
85
|
+
xml.startDate
|
86
|
+
end
|
87
|
+
xml.duration(options[:duration].to_i)
|
88
|
+
}
|
89
|
+
if options[:emails]
|
90
|
+
xml.attendees{
|
91
|
+
xml.participants{
|
92
|
+
options[:emails].each do |email|
|
93
|
+
xml.person {
|
94
|
+
xml.email email
|
95
|
+
}
|
96
|
+
end
|
97
|
+
}
|
98
|
+
}
|
99
|
+
xml.attendeeOptions {
|
100
|
+
xml.emailInvitations true
|
101
|
+
}
|
102
|
+
end
|
103
|
+
}
|
104
|
+
end
|
105
|
+
request(body)
|
106
|
+
end
|
107
|
+
|
69
108
|
def host_meeting_url(meeting_key, email)
|
70
109
|
body = xml_request(email) do |xml|
|
71
110
|
xml.bodyContent('xsi:type' => 'java:com.webex.service.binding.meeting.GethosturlMeeting'){
|
@@ -98,6 +137,19 @@ module CanvasWebex
|
|
98
137
|
|
99
138
|
end
|
100
139
|
|
140
|
+
def get_training_session(session_key)
|
141
|
+
body = xml_request do |xml|
|
142
|
+
xml.bodyContent('xsi:type' => 'java:com.webex.service.binding.training.GetTrainingSession'){
|
143
|
+
xml.sessionKey session_key
|
144
|
+
}
|
145
|
+
end
|
146
|
+
begin
|
147
|
+
request(body)
|
148
|
+
rescue CanvasWebex::ConnectionError
|
149
|
+
nil
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
101
153
|
def list_recordings(meeting_key)
|
102
154
|
body = xml_request do |xml|
|
103
155
|
xml.bodyContent('xsi:type' => 'java:com.webex.service.binding.ep.LstRecording'){
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2013 Instructure, Inc.
|
3
|
+
#
|
4
|
+
# This file is part of Canvas.
|
5
|
+
#
|
6
|
+
# Canvas is free software: you can redistribute it and/or modify it under
|
7
|
+
# the terms of the GNU Affero General Public License as published by the Free
|
8
|
+
# Software Foundation, version 3 of the License.
|
9
|
+
#
|
10
|
+
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
11
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
12
|
+
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
13
|
+
# details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License along
|
16
|
+
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
module CanvasWebex
|
19
|
+
class Training < CanvasWebex::WebexSession
|
20
|
+
|
21
|
+
|
22
|
+
ATTRIBUTES = [:session_key, :conf_name, :start_date, :status]
|
23
|
+
|
24
|
+
def self.retrieve(session_key, client = CanvasWebex.client)
|
25
|
+
if response = client.get_training_session(session_key)
|
26
|
+
Training.new(Nokogiri::XML(response.to_xml))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.create(session_name, options = {}, client = CanvasWebex.client)
|
31
|
+
if response = client.create_training_session(session_name, options)
|
32
|
+
if session_key = response.at_xpath('//sessionkey').try(:text)
|
33
|
+
retrieve(session_key, client)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Public: Create a new Training
|
39
|
+
#
|
40
|
+
# training_xml - The xml returned for a training (must already exist).
|
41
|
+
def initialize(training_xml)
|
42
|
+
@attr_cache = {}
|
43
|
+
@xml = training_xml
|
44
|
+
end
|
45
|
+
|
46
|
+
def method_missing(meth, *args, &block)
|
47
|
+
if ATTRIBUTES.include?(meth)
|
48
|
+
@attr_cache[meth] ||= @xml.at_xpath("//*[contains(translate(name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'), '#{meth.to_s.camelcase(:lower).downcase}')]").try(:text)
|
49
|
+
else
|
50
|
+
super
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
data/lib/canvas_webex/version.rb
CHANGED
@@ -0,0 +1,78 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2013 Instructure, Inc.
|
3
|
+
#
|
4
|
+
# This file is part of Canvas.
|
5
|
+
#
|
6
|
+
# Canvas is free software: you can redistribute it and/or modify it under
|
7
|
+
# the terms of the GNU Affero General Public License as published by the Free
|
8
|
+
# Software Foundation, version 3 of the License.
|
9
|
+
#
|
10
|
+
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
11
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
12
|
+
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
13
|
+
# details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License along
|
16
|
+
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
module CanvasWebex
|
19
|
+
class WebexSession
|
20
|
+
|
21
|
+
def self.create(meeting_name, options = {}, client = CanvasWebex.client)
|
22
|
+
case options[:service]
|
23
|
+
when 'meeting'
|
24
|
+
CanvasWebex::Meeting.create(meeting_name, options, client)
|
25
|
+
when 'training'
|
26
|
+
CanvasWebex::Training.create(meeting_name, options, client)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def host_url(client = CanvasWebex.client)
|
31
|
+
if response = client.host_meeting_url(session_key, nil)
|
32
|
+
response.at_xpath('hostMeetingURL').try(:text)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def join_url(client = CanvasWebex.client)
|
37
|
+
if response = client.join_meeting_url(session_key, nil)
|
38
|
+
response.at_xpath('joinMeetingURL').text
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.recordings(session_key, client = CanvasWebex.client)
|
43
|
+
if response = session_key && client.list_recordings(session_key)
|
44
|
+
response.search('recording').map do |rec_xml|
|
45
|
+
created_ts = rec_xml.at_xpath('createTime').try(:text)
|
46
|
+
tz_id = rec_xml.at_xpath('timeZoneID').try(:text)
|
47
|
+
created_at = self.parse_time_stamp(tz_id, created_ts)
|
48
|
+
recording = {
|
49
|
+
recording_id: rec_xml.at_xpath('recordingID').try(:text),
|
50
|
+
title: rec_xml.at_xpath('name').try(:text),
|
51
|
+
playback_url: rec_xml.at_xpath('streamURL').try(:text),
|
52
|
+
created_at: self.parse_time_stamp(tz_id, created_ts).to_s
|
53
|
+
}
|
54
|
+
if duration = rec_xml.at_xpath('duration').try(:text)
|
55
|
+
recording[:duration_minutes] = duration.to_i / 60
|
56
|
+
end
|
57
|
+
recording
|
58
|
+
end
|
59
|
+
else
|
60
|
+
[]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.parse_time_stamp(time_zone, time_stamp, client = CanvasWebex.client)
|
65
|
+
if response = client.list_time_zone(time_zone, time_stamp)
|
66
|
+
if m_offset = response.at_xpath('timeZone/gmtOffset').try(:text).try(:to_i)
|
67
|
+
offset_string = "%+0#3d:00" %[(m_offset / 60)]
|
68
|
+
DateTime.strptime(time_stamp + offset_string, '%m/%d/%Y %H:%M:%S%z')
|
69
|
+
else
|
70
|
+
DateTime.strptime(time_stamp, '%m/%d/%Y %H:%M:%S')
|
71
|
+
end
|
72
|
+
else
|
73
|
+
""
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<serv:message xmlns:serv="http://www.webex.com/schemas/2002/06/service" xmlns:com="http://www.webex.com/schemas/2002/06/common" xmlns:sess="http://www.webex.com/schemas/2002/06/service/session" xmlns:train="http://www.webex.com/schemas/2002/06/service/trainingsession" xmlns:qti="http://www.webex.com/schemas/2002/06/service/trainingsessionqti" xmlns:qtiasi="http://www.webex.com/schemas/2002/06/service/trainingsessionqtiasi">
|
3
|
+
<serv:header>
|
4
|
+
<serv:response>
|
5
|
+
<serv:result>SUCCESS</serv:result>
|
6
|
+
<serv:gsbStatus>PRIMARY</serv:gsbStatus>
|
7
|
+
</serv:response>
|
8
|
+
</serv:header>
|
9
|
+
<serv:body>
|
10
|
+
<serv:bodyContent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="train:getTrainingSessionResponse">
|
11
|
+
<sess:accessControl>
|
12
|
+
<sess:listing>PUBLIC</sess:listing>
|
13
|
+
<sess:sessionPassword>Test1234567</sess:sessionPassword>
|
14
|
+
</sess:accessControl>
|
15
|
+
<sess:schedule>
|
16
|
+
<sess:startDate>01/14/2014 11:22:55</sess:startDate>
|
17
|
+
<sess:timeZone>GMT-07:00, Mountain (Denver)</sess:timeZone>
|
18
|
+
<sess:duration>60</sess:duration>
|
19
|
+
<sess:timeZoneID>6</sess:timeZoneID>
|
20
|
+
<sess:hostWebExID>NetAcadTest</sess:hostWebExID>
|
21
|
+
<sess:openTime>0</sess:openTime>
|
22
|
+
<sess:extNotifyTime>0</sess:extNotifyTime>
|
23
|
+
<sess:joinTeleconfBeforeHost>false</sess:joinTeleconfBeforeHost>
|
24
|
+
</sess:schedule>
|
25
|
+
<train:metaData>
|
26
|
+
<sess:confName>test</sess:confName>
|
27
|
+
<train:location>https://ciscolearning.webex.com</train:location>
|
28
|
+
<train:invitation/>
|
29
|
+
<train:sessionType>11</train:sessionType>
|
30
|
+
<train:enableGreeting>false</train:enableGreeting>
|
31
|
+
</train:metaData>
|
32
|
+
<train:enableOptions>
|
33
|
+
<sess:attendeeList>true</sess:attendeeList>
|
34
|
+
<sess:javaClient>true</sess:javaClient>
|
35
|
+
<sess:nativeClient>true</sess:nativeClient>
|
36
|
+
<train:chat>true</train:chat>
|
37
|
+
<train:poll>true</train:poll>
|
38
|
+
<train:audioVideo>true</train:audioVideo>
|
39
|
+
<train:fileShare>true</train:fileShare>
|
40
|
+
<train:presentation>true</train:presentation>
|
41
|
+
<train:applicationShare>true</train:applicationShare>
|
42
|
+
<train:desktopShare>true</train:desktopShare>
|
43
|
+
<train:webTour>true</train:webTour>
|
44
|
+
<train:trainingSessionRecord>true</train:trainingSessionRecord>
|
45
|
+
<train:annotation>false</train:annotation>
|
46
|
+
<train:importDocument>false</train:importDocument>
|
47
|
+
<train:saveDocument>false</train:saveDocument>
|
48
|
+
<train:printDocument>false</train:printDocument>
|
49
|
+
<train:pointer>false</train:pointer>
|
50
|
+
<train:switchPage>false</train:switchPage>
|
51
|
+
<train:fullScreen>false</train:fullScreen>
|
52
|
+
<train:thumbnail>false</train:thumbnail>
|
53
|
+
<train:zoom>false</train:zoom>
|
54
|
+
<train:copyPage>false</train:copyPage>
|
55
|
+
<train:rcAppShare>true</train:rcAppShare>
|
56
|
+
<train:rcDesktopShare>true</train:rcDesktopShare>
|
57
|
+
<train:rcWebTour>true</train:rcWebTour>
|
58
|
+
<train:attendeeRecordTrainingSession>true</train:attendeeRecordTrainingSession>
|
59
|
+
<train:voip>true</train:voip>
|
60
|
+
<train:faxIntoTrainingSession>false</train:faxIntoTrainingSession>
|
61
|
+
<train:autoDeleteAfterMeetingEnd>false</train:autoDeleteAfterMeetingEnd>
|
62
|
+
<train:displayQuickStartHost>true</train:displayQuickStartHost>
|
63
|
+
<train:displayQuickStartAttendees>false</train:displayQuickStartAttendees>
|
64
|
+
<train:supportQandA>true</train:supportQandA>
|
65
|
+
<train:supportFeedback>true</train:supportFeedback>
|
66
|
+
<train:supportBreakoutSessions>true</train:supportBreakoutSessions>
|
67
|
+
<train:supportRemoteComputer>true</train:supportRemoteComputer>
|
68
|
+
<train:supportShareWebContent>true</train:supportShareWebContent>
|
69
|
+
<train:supportUCFRichMedia>true</train:supportUCFRichMedia>
|
70
|
+
<train:networkBasedRecord>true</train:networkBasedRecord>
|
71
|
+
<train:presenterBreakoutSession>true</train:presenterBreakoutSession>
|
72
|
+
<train:attendeeBreakoutSession>false</train:attendeeBreakoutSession>
|
73
|
+
<train:supportPanelists>true</train:supportPanelists>
|
74
|
+
<train:muteOnEntry>false</train:muteOnEntry>
|
75
|
+
<train:multiVideo>false</train:multiVideo>
|
76
|
+
<train:veryLargeSess>false</train:veryLargeSess>
|
77
|
+
<train:HQvideo>true</train:HQvideo>
|
78
|
+
</train:enableOptions>
|
79
|
+
<train:telephony>
|
80
|
+
<sess:telephonySupport>NONE</sess:telephonySupport>
|
81
|
+
</train:telephony>
|
82
|
+
<train:tracking/>
|
83
|
+
<train:repeat>
|
84
|
+
<train:repeatType>SINGLE</train:repeatType>
|
85
|
+
<train:expirationDate>01/14/2014 12:22:55</train:expirationDate>
|
86
|
+
<train:occurenceType>NO_REPEAT</train:occurenceType>
|
87
|
+
</train:repeat>
|
88
|
+
<train:remind>
|
89
|
+
<sess:enableReminder>false</sess:enableReminder>
|
90
|
+
<sess:emails/>
|
91
|
+
<sess:sendEmail>false</sess:sendEmail>
|
92
|
+
<sess:sendMobile>false</sess:sendMobile>
|
93
|
+
<sess:daysAhead>0</sess:daysAhead>
|
94
|
+
<sess:hoursAhead>0</sess:hoursAhead>
|
95
|
+
<sess:minutesAhead>0</sess:minutesAhead>
|
96
|
+
<sess:attendees>
|
97
|
+
<sess:send>false</sess:send>
|
98
|
+
</sess:attendees>
|
99
|
+
<sess:presenters>
|
100
|
+
<sess:firstReminder>24HR</sess:firstReminder>
|
101
|
+
</sess:presenters>
|
102
|
+
</train:remind>
|
103
|
+
<train:attendeeOptions>
|
104
|
+
<train:request>false</train:request>
|
105
|
+
<train:registration>false</train:registration>
|
106
|
+
<train:auto>false</train:auto>
|
107
|
+
<train:registrationPWD/>
|
108
|
+
<train:maxRegistrations>0</train:maxRegistrations>
|
109
|
+
<train:participantLimit>0</train:participantLimit>
|
110
|
+
</train:attendeeOptions>
|
111
|
+
<train:handsOnLab>
|
112
|
+
<train:reserveHOL>false</train:reserveHOL>
|
113
|
+
<train:numComputers>0</train:numComputers>
|
114
|
+
</train:handsOnLab>
|
115
|
+
<train:sessionKey>752909833</train:sessionKey>
|
116
|
+
<train:status>NOT_INPROGRESS</train:status>
|
117
|
+
<train:hostKey>274056</train:hostKey>
|
118
|
+
<train:eventID>226053157</train:eventID>
|
119
|
+
<train:guestToken>7e802a5c5964f8d9f857a80beca12e06</train:guestToken>
|
120
|
+
<train:hostType>1019001</train:hostType>
|
121
|
+
</serv:bodyContent>
|
122
|
+
</serv:body>
|
123
|
+
</serv:message>
|
@@ -28,10 +28,4 @@ describe CanvasWebex::Meeting do
|
|
28
28
|
subject.status.should == "NOT_INPROGRESS"
|
29
29
|
end
|
30
30
|
|
31
|
-
it 'parses a cisco timestamp' do
|
32
|
-
stub_call('list_timezones')
|
33
|
-
ts = CanvasWebex::Meeting.parse_time_stamp(4, '01/26/2006 21:00:00', client)
|
34
|
-
ts.to_s.should == '2006-01-26T21:00:00-08:00'
|
35
|
-
end
|
36
|
-
|
37
31
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CanvasWebex::Training do
|
4
|
+
let(:client) {CanvasWebex::Service.new('proserv_instructure', 'foo', '123', 'instructure', nil, 'test')}
|
5
|
+
subject{CanvasWebex::Training.retrieve(123, client)}
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
stub_call('get_training')
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'returns the session name' do
|
12
|
+
subject.conf_name.should == "test"
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'returns the session key' do
|
16
|
+
subject.session_key.should == "752909833"
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'returns the start date' do
|
20
|
+
subject.start_date.should == "01/14/2014 11:22:55"
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'returns the status' do
|
24
|
+
subject.status.should == "NOT_INPROGRESS"
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CanvasWebex::WebexSession do
|
4
|
+
let(:client) {CanvasWebex::Service.new('proserv_instructure', 'foo', '123', 'instructure', nil, 'test')}
|
5
|
+
|
6
|
+
it 'parses a cisco timestamp' do
|
7
|
+
stub_call('list_timezones')
|
8
|
+
ts = CanvasWebex::WebexSession.parse_time_stamp(4, '01/26/2006 21:00:00', client)
|
9
|
+
ts.to_s.should == '2006-01-26T21:00:00-08:00'
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: canvas_webex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.12'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-01-
|
12
|
+
date: 2014-01-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -113,9 +113,12 @@ files:
|
|
113
113
|
- lib/canvas_webex.rb
|
114
114
|
- lib/canvas_webex/meeting.rb
|
115
115
|
- lib/canvas_webex/service.rb
|
116
|
+
- lib/canvas_webex/training.rb
|
116
117
|
- lib/canvas_webex/version.rb
|
118
|
+
- lib/canvas_webex/webex_session.rb
|
117
119
|
- spec/fixtures/create_meeting.xml
|
118
120
|
- spec/fixtures/get_meeting.xml
|
121
|
+
- spec/fixtures/get_training.xml
|
119
122
|
- spec/fixtures/host_meeting_url.xml
|
120
123
|
- spec/fixtures/join_meeting_url.xml
|
121
124
|
- spec/fixtures/list_timezones.xml
|
@@ -123,6 +126,8 @@ files:
|
|
123
126
|
- spec/fixtures/recording_list.xml
|
124
127
|
- spec/lib/canvas_webex/meeting_spec.rb
|
125
128
|
- spec/lib/canvas_webex/service_spec.rb
|
129
|
+
- spec/lib/canvas_webex/training_spec.rb
|
130
|
+
- spec/lib/canvas_webex/webex_session_spec.rb
|
126
131
|
- spec/models/cisco_webex_conference_spec.rb
|
127
132
|
- spec/spec_helper.rb
|
128
133
|
homepage: http://instructure.com
|
@@ -153,6 +158,7 @@ summary: Cisco WebEx integration for Instructure Canvas (http://instructure.com)
|
|
153
158
|
test_files:
|
154
159
|
- spec/fixtures/create_meeting.xml
|
155
160
|
- spec/fixtures/get_meeting.xml
|
161
|
+
- spec/fixtures/get_training.xml
|
156
162
|
- spec/fixtures/host_meeting_url.xml
|
157
163
|
- spec/fixtures/join_meeting_url.xml
|
158
164
|
- spec/fixtures/list_timezones.xml
|
@@ -160,6 +166,8 @@ test_files:
|
|
160
166
|
- spec/fixtures/recording_list.xml
|
161
167
|
- spec/lib/canvas_webex/meeting_spec.rb
|
162
168
|
- spec/lib/canvas_webex/service_spec.rb
|
169
|
+
- spec/lib/canvas_webex/training_spec.rb
|
170
|
+
- spec/lib/canvas_webex/webex_session_spec.rb
|
163
171
|
- spec/models/cisco_webex_conference_spec.rb
|
164
172
|
- spec/spec_helper.rb
|
165
173
|
has_rdoc:
|