adobe_connect 1.0.0 → 1.0.2
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 +4 -4
- data/adobe_connect.gemspec +1 -1
- data/lib/adobe_connect.rb +5 -0
- data/lib/adobe_connect/acl_field.rb +60 -0
- data/lib/adobe_connect/base.rb +128 -0
- data/lib/adobe_connect/group.rb +91 -0
- data/lib/adobe_connect/meeting.rb +99 -0
- data/lib/adobe_connect/meeting_folder.rb +12 -0
- data/lib/adobe_connect/param_formatter.rb +6 -0
- data/lib/adobe_connect/response.rb +5 -19
- data/lib/adobe_connect/service.rb +1 -1
- data/lib/adobe_connect/telephony_profile.rb +87 -0
- data/lib/adobe_connect/user.rb +21 -55
- data/lib/adobe_connect/version.rb +1 -1
- data/test/fixtures/acl_field_save_error.xml +6 -0
- data/test/fixtures/acl_field_save_success.xml +7 -0
- data/test/fixtures/acl_field_update_success.xml +7 -0
- data/test/fixtures/{log_in_success.xml → generic_success.xml} +0 -0
- data/test/fixtures/group_is_member.xml +13 -0
- data/test/fixtures/group_is_not_member.xml +5 -0
- data/test/fixtures/group_save_error.xml +6 -0
- data/test/fixtures/group_save_success.xml +9 -0
- data/test/fixtures/group_update_success.xml +9 -0
- data/test/fixtures/meeting_find_by_id_error.xml +4 -0
- data/test/fixtures/meeting_find_by_id_success.xml +16 -0
- data/test/fixtures/meeting_save_error.xml +6 -0
- data/test/fixtures/meeting_save_success.xml +11 -0
- data/test/fixtures/meeting_update_success.xml +11 -0
- data/test/fixtures/telephony_profile_info_success.xml +13 -0
- data/test/fixtures/telephony_profile_list_success.xml +16 -0
- data/test/fixtures/telephony_profile_save_error.xml +6 -0
- data/test/fixtures/telephony_profile_save_success.xml +7 -0
- data/test/fixtures/telephony_profile_update_success.xml +7 -0
- data/test/fixtures/user_update_success.xml +4 -0
- data/test/lib/adobe_connect/acl_field_test.rb +39 -0
- data/test/lib/adobe_connect/adobe_connect_base_tests.rb +121 -0
- data/test/lib/adobe_connect/config_test.rb +1 -1
- data/test/lib/adobe_connect/group_test.rb +77 -0
- data/test/lib/adobe_connect/meeting_folder_test.rb +3 -7
- data/test/lib/adobe_connect/meeting_test.rb +117 -0
- data/test/lib/adobe_connect/param_formatter_test.rb +1 -1
- data/test/lib/adobe_connect/response_test.rb +1 -1
- data/test/lib/adobe_connect/service_test.rb +5 -8
- data/test/lib/adobe_connect/telephony_profile_test.rb +41 -0
- data/test/lib/adobe_connect/user_test.rb +29 -84
- data/test/test_helper.rb +16 -0
- metadata +87 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae95eaae6a338ddf57dc714ddffe464d202deab6
|
4
|
+
data.tar.gz: 19d53983d307144139b25ae5e803f05949499f47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c89efd518cec436b43bc20ad90237ba562c6534fe5be57452adb8be03b056f75b5007aaad47e5b7ae625080ddb5081a66604f85609a1fd387fdf586c9ea9182
|
7
|
+
data.tar.gz: 1eef97ab37e4c0edddcfce8b2f65aad63b6bb9be3434be798e1acdb558545489acd80b26494f744ceca1b81fea854e0be16223741a9020d5806f148468485df9
|
data/adobe_connect.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |gem|
|
|
19
19
|
gem.require_paths = ['lib']
|
20
20
|
|
21
21
|
gem.add_dependency 'activesupport', '>= 2.3.17'
|
22
|
-
gem.add_dependency 'nokogiri', '
|
22
|
+
gem.add_dependency 'nokogiri', '>= 1.5.5', '< 1.7'
|
23
23
|
gem.add_dependency 'rake', '>= 0.9.2'
|
24
24
|
|
25
25
|
gem.add_development_dependency 'minitest', '~> 4.6.0'
|
data/lib/adobe_connect.rb
CHANGED
@@ -7,7 +7,12 @@ require 'adobe_connect/config'
|
|
7
7
|
require 'adobe_connect/response'
|
8
8
|
require 'adobe_connect/service'
|
9
9
|
require 'adobe_connect/param_formatter'
|
10
|
+
require 'adobe_connect/base'
|
11
|
+
require 'adobe_connect/acl_field'
|
12
|
+
require 'adobe_connect/group'
|
13
|
+
require 'adobe_connect/meeting'
|
10
14
|
require 'adobe_connect/meeting_folder'
|
15
|
+
require 'adobe_connect/telephony_profile'
|
11
16
|
require 'adobe_connect/user'
|
12
17
|
|
13
18
|
# Public: Namespace for AdobeConnect classes/modules.
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module AdobeConnect
|
2
|
+
|
3
|
+
# Public: Represents a Custom Field object inside of Connect.
|
4
|
+
class AclField < Base
|
5
|
+
attr_accessor :name, :obj_type, :id, :service
|
6
|
+
|
7
|
+
#
|
8
|
+
# id - The Field-ID of the custom field object.
|
9
|
+
# name - The name of the Field.
|
10
|
+
# obj_type- The type of Connect Object this applies to. Allowed values
|
11
|
+
# are: principal, meeting, sco, event, read-only
|
12
|
+
#
|
13
|
+
def attrs
|
14
|
+
atrs = {
|
15
|
+
:object_type => "object-type-#{obj_type}", :permission_id => 'manage',
|
16
|
+
:name => name, :field_type => 'text', :is_required => false,
|
17
|
+
:is_primary => true
|
18
|
+
}
|
19
|
+
|
20
|
+
if !id.nil?
|
21
|
+
atrs.merge!(:field_id => id)
|
22
|
+
end
|
23
|
+
|
24
|
+
atrs
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.config
|
28
|
+
super.merge({ :ac_obj_type => 'field', :ac_method_prefix => 'custom_field' })
|
29
|
+
end
|
30
|
+
|
31
|
+
# Public: Find a folder on the current Connect instance.
|
32
|
+
#
|
33
|
+
# name, obj_type, service - see #attrs for description
|
34
|
+
#
|
35
|
+
# Returns a new AdobeConnect::AclField object.
|
36
|
+
def self.find_or_create(name, obj_type, service = AdobeConnect::Service.new)
|
37
|
+
response = service.custom_fields(:filter_name => name)
|
38
|
+
c_flds = response.at_xpath('//custom-fields').children
|
39
|
+
|
40
|
+
if c_flds.count.zero?
|
41
|
+
#Create
|
42
|
+
fld = self.new({ :name => name, :obj_type => obj_type }, service)
|
43
|
+
fld.save
|
44
|
+
else
|
45
|
+
fld = load_from_xml(c_flds[0])
|
46
|
+
end
|
47
|
+
|
48
|
+
fld
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
def self.load_from_xml(ac_field, service)
|
53
|
+
self.new({
|
54
|
+
:id => ac_field.attr('field-id'),
|
55
|
+
:name => ac_field.at_xpath('//name').text,
|
56
|
+
:obj_type => ac_field.attr('obj_type')
|
57
|
+
}, service)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module AdobeConnect
|
2
|
+
|
3
|
+
# Provides base interaction with Adobe Connect for a variety of AC Objects
|
4
|
+
class Base
|
5
|
+
# Public: SCO-ID from the Adobe Connect instance.
|
6
|
+
attr_reader :id
|
7
|
+
|
8
|
+
attr_reader :service, :errors
|
9
|
+
|
10
|
+
def initialize(obj_options, service = Service.new)
|
11
|
+
set_attrs(obj_options)
|
12
|
+
@service = service
|
13
|
+
@errors = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def attrs
|
17
|
+
{}
|
18
|
+
end
|
19
|
+
|
20
|
+
# Public: Delete this object form Adobe Connect.
|
21
|
+
#
|
22
|
+
# Returns a boolean.
|
23
|
+
def delete
|
24
|
+
response = service.send(:"#{delete_method_prefix}_delete", {:"#{ac_obj_type}_id" => self.id})
|
25
|
+
response.at_xpath('//status').attr('code') == 'ok'
|
26
|
+
end
|
27
|
+
|
28
|
+
# Public: Save this object to the Adobe Connect instance.
|
29
|
+
#
|
30
|
+
# Returns a boolean.
|
31
|
+
def save
|
32
|
+
response = service.send(:"#{method_prefix}_update", self.attrs)
|
33
|
+
|
34
|
+
if response.at_xpath('//status').attr('code') == 'ok'
|
35
|
+
# Load the ID if this was a creation
|
36
|
+
self.id = response.at_xpath("//#{ac_obj_node_name}").attr("#{ac_obj_type}-id") if self.id.nil?
|
37
|
+
true
|
38
|
+
else
|
39
|
+
save_errors(response)
|
40
|
+
false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Public: Update attributes of the loaded object and save.
|
45
|
+
#
|
46
|
+
# atrs - Generic options (see #initialize for required
|
47
|
+
# attributes).
|
48
|
+
#
|
49
|
+
# Returns a boolean.
|
50
|
+
def update_attributes(atrs)
|
51
|
+
set_attrs(atrs)
|
52
|
+
self.save
|
53
|
+
end
|
54
|
+
|
55
|
+
# Public: Update permissions on the loaded object for the given principal_id.
|
56
|
+
#
|
57
|
+
# principal_id - id of user
|
58
|
+
# permission_id - AdobeConnect permission value
|
59
|
+
#
|
60
|
+
# Returns a boolean.
|
61
|
+
def permissions_update(principal_id, permission_id)
|
62
|
+
response = service.permissions_update(
|
63
|
+
acl_id: self.id,
|
64
|
+
principal_id: principal_id,
|
65
|
+
permission_id: permission_id
|
66
|
+
)
|
67
|
+
|
68
|
+
response.at_xpath('//status').attr('code') == 'ok'
|
69
|
+
end
|
70
|
+
|
71
|
+
# Public: Create a Connect obj from the given app obj.
|
72
|
+
#
|
73
|
+
# obj_options - Generic options (see #initialize for required
|
74
|
+
# attributes).
|
75
|
+
#
|
76
|
+
# Returns an instance of this class, with an attempted save.
|
77
|
+
def self.create(obj_options)
|
78
|
+
obj = self.new(obj_options)
|
79
|
+
obj.save
|
80
|
+
|
81
|
+
obj
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.config
|
85
|
+
{ :ac_obj_type => 'principal', :delete_method_is_plural => true }
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
attr_writer :id
|
90
|
+
|
91
|
+
def ac_obj_node_name
|
92
|
+
self.class.config[:ac_obj_node_name] || ac_obj_type
|
93
|
+
end
|
94
|
+
|
95
|
+
def ac_obj_type
|
96
|
+
self.class.config[:ac_obj_type]
|
97
|
+
end
|
98
|
+
|
99
|
+
def delete_method_prefix
|
100
|
+
prefix = method_prefix
|
101
|
+
prefix = prefix.pluralize if self.class.config[:delete_method_is_plural]
|
102
|
+
prefix
|
103
|
+
end
|
104
|
+
|
105
|
+
def method_prefix
|
106
|
+
self.class.config[:ac_method_prefix] || ac_obj_type
|
107
|
+
end
|
108
|
+
|
109
|
+
# Internal: Store request errors in @errors.
|
110
|
+
#
|
111
|
+
# response - An AdobeConnect::Response.
|
112
|
+
#
|
113
|
+
# Returns nothing.
|
114
|
+
def save_errors(response)
|
115
|
+
@errors = response.xpath('//invalid').map(&:attributes)
|
116
|
+
end
|
117
|
+
|
118
|
+
# Internal: Update attributes from an attribute hash
|
119
|
+
#
|
120
|
+
# atrs - A hash of keys that match attributes of this object and
|
121
|
+
# corresponding values for those attributes.
|
122
|
+
#
|
123
|
+
# Returns nothing.
|
124
|
+
def set_attrs(atrs)
|
125
|
+
atrs.each { |key, value| send(:"#{key}=", value) }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module AdobeConnect
|
2
|
+
|
3
|
+
# Public: Represents a Group in a Connect environment.
|
4
|
+
class Group < Base
|
5
|
+
attr_accessor :description, :name, :id
|
6
|
+
|
7
|
+
#
|
8
|
+
# group_options - A hash with the following keys:
|
9
|
+
# name - The group’s name.
|
10
|
+
# description - The group's description
|
11
|
+
#
|
12
|
+
|
13
|
+
def attrs
|
14
|
+
atrs = { :has_children => 1, :name => name, :description => description }
|
15
|
+
|
16
|
+
if !self.id.nil?
|
17
|
+
atrs.merge!(:principal_id => self.id)
|
18
|
+
else
|
19
|
+
atrs.merge!(
|
20
|
+
:type => 'group'
|
21
|
+
)
|
22
|
+
end
|
23
|
+
atrs
|
24
|
+
end
|
25
|
+
|
26
|
+
# Public: Add a User as a member of this group.
|
27
|
+
#
|
28
|
+
# user - AdobeConnect::User instance
|
29
|
+
#
|
30
|
+
# Returns a boolean of success.
|
31
|
+
def add_member(user)
|
32
|
+
update_membership(user, true)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Public: Find the member of this group.
|
36
|
+
#
|
37
|
+
# email - User's email address
|
38
|
+
#
|
39
|
+
# Returns a boolean.
|
40
|
+
def is_member?(email)
|
41
|
+
return false if self.id.nil?
|
42
|
+
|
43
|
+
response = service.principal_list(:group_id => self.id,
|
44
|
+
:filter_email => email,
|
45
|
+
:filter_is_member => true)
|
46
|
+
|
47
|
+
!response.at_xpath('//principal').nil?
|
48
|
+
end
|
49
|
+
|
50
|
+
# Public: Remove a User from this group.
|
51
|
+
#
|
52
|
+
# user - AdobeConnect::User instance
|
53
|
+
#
|
54
|
+
# Returns a boolean of success.
|
55
|
+
def remove_member(user)
|
56
|
+
update_membership(user, false)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Public: Find the given group on the Connect server.
|
60
|
+
#
|
61
|
+
# name - Group's name on Connect server
|
62
|
+
#
|
63
|
+
# Returns an AdobeConnect::Group or nil.
|
64
|
+
def self.find_by_name(name, service = AdobeConnect::Service.new)
|
65
|
+
response = service.principal_list(:filter_name => name)
|
66
|
+
|
67
|
+
if principal = response.at_xpath('//principal')
|
68
|
+
self.load_from_xml(principal)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
def update_membership(user, status)
|
74
|
+
response = service.group_membership_update({
|
75
|
+
:group_id => self.id,
|
76
|
+
:principal_id => user.id,
|
77
|
+
:is_member => status
|
78
|
+
})
|
79
|
+
|
80
|
+
response.at_xpath('//status').attr('code') == 'ok'
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.load_from_xml(g)
|
84
|
+
self.new({
|
85
|
+
:name => g.at_xpath('//name').children.text,
|
86
|
+
:description => g.at_xpath('//description').try(:children).try(:text),
|
87
|
+
:id => g.attr('principal-id')
|
88
|
+
})
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module AdobeConnect
|
2
|
+
|
3
|
+
# Public: Represents a meeting in a Connect environment.
|
4
|
+
class Meeting < Base
|
5
|
+
attr_accessor :date_begin, :date_end, :description, :folder_id, :name, :url_path
|
6
|
+
|
7
|
+
#
|
8
|
+
# meeting_options - A hash with the following keys:
|
9
|
+
# date_begin - (optional) Datetime that meeting begins.
|
10
|
+
# date_end - (optional) Datetime that meeting ends.
|
11
|
+
# description - A description of the meeting to be displayed to users.
|
12
|
+
# folder_id - (Required for creating) ID of the meeting folder
|
13
|
+
# name - Name of the meeting
|
14
|
+
# url_path - (optional) Custom url for meeting. One will be generated
|
15
|
+
# by AC if not provided
|
16
|
+
#
|
17
|
+
def attrs
|
18
|
+
atrs = {:type => 'meeting'}
|
19
|
+
|
20
|
+
[ :date_end, :date_begin, :description, :name, :url_path ].each do |atr|
|
21
|
+
atrs[atr] = send(atr)
|
22
|
+
end
|
23
|
+
|
24
|
+
if !self.id.nil?
|
25
|
+
atrs.merge!(:sco_id => self.id)
|
26
|
+
else
|
27
|
+
atrs.merge!(:folder_id => folder_id)
|
28
|
+
end
|
29
|
+
|
30
|
+
atrs
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_host(principal_id)
|
34
|
+
permissions_update(principal_id, 'host')
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_presenter(principal_id)
|
38
|
+
permissions_update(principal_id, 'mini-host')
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_participant(principal_id)
|
42
|
+
permissions_update(principal_id, 'view')
|
43
|
+
end
|
44
|
+
|
45
|
+
def remove_user(principal_id)
|
46
|
+
permissions_update(principal_id, 'remove')
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.config
|
50
|
+
super.merge({ :ac_obj_type => 'sco', :delete_method_is_plural => false })
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.find_by_id(sco_id, service = AdobeConnect::Service.new)
|
54
|
+
response = service.sco_info(sco_id: sco_id)
|
55
|
+
sco_info = response.at_xpath('//sco')
|
56
|
+
|
57
|
+
if !sco_info.nil?
|
58
|
+
load_from_xml(sco_info, service)
|
59
|
+
else
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.find_by_url_path(url_path, service = AdobeConnect::Service.new)
|
65
|
+
response = service.sco_by_url(:url_path => url_path)
|
66
|
+
|
67
|
+
ac_meeting = response.at_xpath('//sco')
|
68
|
+
|
69
|
+
if !ac_meeting.nil?
|
70
|
+
load_from_xml(ac_meeting, service)
|
71
|
+
else
|
72
|
+
nil
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.find_within_folder(folder_id, params = {}, service = AdobeConnect::Service.new)
|
77
|
+
response = service.sco_contents( params.merge(:sco_id => folder_id, :type => 'meeting') )
|
78
|
+
ac_meetings = response.at_xpath('//scos')
|
79
|
+
meetings = ac_meetings.children.map{|m| load_from_xml(m, service) }
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
def self.load_from_xml(ac_meeting, service)
|
84
|
+
meeting = self.new({}, service)
|
85
|
+
|
86
|
+
meeting.attrs.each do |atr,v|
|
87
|
+
chld = ac_meeting.children.select{|c| c.name == atr.to_s.dasherize}[0]
|
88
|
+
if !chld.nil?
|
89
|
+
meeting.send(:"#{atr}=", chld.text)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
meeting.folder_id = ac_meeting.attr('folder-id')
|
94
|
+
meeting.instance_variable_set(:@id, ac_meeting.attr('sco-id'))
|
95
|
+
|
96
|
+
meeting
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -41,5 +41,17 @@ module AdobeConnect
|
|
41
41
|
response.at_xpath('//url-path').text,
|
42
42
|
service)
|
43
43
|
end
|
44
|
+
|
45
|
+
# Public: Find the "My Meetings" folder ID of the currently logged in User
|
46
|
+
#
|
47
|
+
# service - An AdobeConnect::Service object (default: Service.new).
|
48
|
+
#
|
49
|
+
# Returns a string of the sco ID of the folder
|
50
|
+
def self.my_meetings_folder_id(service = AdobeConnect::Service.new)
|
51
|
+
response = service.sco_shortcuts({})
|
52
|
+
response.at_xpath('//shortcuts').children.select{|s|
|
53
|
+
s.attr('type') == 'my-meetings'
|
54
|
+
}[0].attr('sco-id')
|
55
|
+
end
|
44
56
|
end
|
45
57
|
end
|
@@ -17,9 +17,15 @@ module AdobeConnect
|
|
17
17
|
# Returns a query string.
|
18
18
|
def format
|
19
19
|
params.sort_by { |k, v| k.to_s }.inject(['']) do |array, param|
|
20
|
+
param[1] = format_datetime(param[1]) if param[1].respond_to?(:strftime)
|
20
21
|
key, value = param.map { |p| ERB::Util.url_encode(p) }
|
21
22
|
array << "#{key.dasherize}=#{value}"
|
22
23
|
end.join('&')
|
23
24
|
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def format_datetime(dt)
|
28
|
+
dt.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
|
29
|
+
end
|
24
30
|
end
|
25
31
|
end
|