ruby-d2l 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +2 -2
- data/VERSION +1 -1
- data/lib/ruby-d2l/auth.rb +0 -1
- data/lib/ruby-d2l/org_unit.rb +90 -105
- data/lib/ruby-d2l/user.rb +76 -73
- data/ruby-d2l.gemspec +1 -1
- metadata +4 -4
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= ruby-d2l
|
2
2
|
|
3
|
-
|
3
|
+
Extremely limited functionality so far. At this point it's just a proof of concept. Only a few SOAP calls are implemented at the moment.
|
4
4
|
|
5
5
|
|
6
6
|
This hopefully will eventually provide a much easier way to access the Web Services SOAP interface in Desire2Learn. This code should work with D2L versions 9.4.1 and prior. As of D2L version 9.4.1, a new REST based interface is available. This may be re-written to support REST when I get access to a 9.4.1 test system.
|
@@ -28,7 +28,7 @@ Then in your Ruby application you can use the configure block to set these value
|
|
28
28
|
|
29
29
|
Code Example:
|
30
30
|
|
31
|
-
template = RubyD2L::OrgUnit.get_course_template_by_code("TEMPLATE_CODE").to_hash
|
31
|
+
template = RubyD2L::OrgUnit.get_course_template_by_code(:template_code => "TEMPLATE_CODE").to_hash
|
32
32
|
ap template[:get_course_template_response][:course_template][:name].to_s
|
33
33
|
|
34
34
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/ruby-d2l/auth.rb
CHANGED
@@ -5,7 +5,6 @@ module RubyD2L
|
|
5
5
|
|
6
6
|
def self.connect(site_url)
|
7
7
|
Savon::Client.new do
|
8
|
-
ap site_url
|
9
8
|
wsdl.document = "#{site_url}/d2l/AuthenticationTokenService.asmx?WSDL"
|
10
9
|
wsdl.endpoint = "#{site_url}/d2l/AuthenticationTokenService.asmx"
|
11
10
|
#http.proxy = @@proxy_server if @@proxy_server != nil
|
data/lib/ruby-d2l/org_unit.rb
CHANGED
@@ -10,11 +10,11 @@ module RubyD2L
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
# = CreateCourseOffering
|
14
|
+
# Get a list of available SOAP actions for OrgUnit
|
15
|
+
def self.list_soap_actions()
|
15
16
|
|
16
|
-
site_url
|
17
|
-
ap connect(site_url).wsdl.soap_actions
|
17
|
+
ap connect(RubyD2L.site_url).wsdl.soap_actions
|
18
18
|
|
19
19
|
# [
|
20
20
|
# [ 0] :link_course_offering_to_navbar,
|
@@ -88,89 +88,73 @@ module RubyD2L
|
|
88
88
|
# ]
|
89
89
|
end
|
90
90
|
|
91
|
-
|
92
|
-
|
93
|
-
|
91
|
+
# = CreateCourseOffering
|
92
|
+
# REQUIRED: { :offering_name => "NAME", :offering_code => "CODE" }
|
93
|
+
# OPTIONAL: { :is_active => "true|false", :start_date => DateTime.to_s (e.g. YYYYMMDDThh:mm:ss), :end_date => DateTime.to_s (e.g. YYYYMMDDThh:mm:ss) }
|
94
|
+
# NOT IMPLEMENTED: I don't use <Path>'+ @course_path +'</Path>. Add it if you need it.
|
95
|
+
def self.create_course_offering(params={})
|
96
|
+
self.required_params(params, [:offering_name, :offering_code, :template_id])
|
94
97
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
98
|
+
params = {
|
99
|
+
:offering_name => "",
|
100
|
+
:offering_code => "",
|
101
|
+
:template_id => "",
|
102
|
+
:is_active => "false",
|
103
|
+
:start_date => DateTime.now.to_s,
|
104
|
+
:end_date => DateTime.now.to_s,
|
105
|
+
:can_register => "false",
|
106
|
+
:allow_sections => "false"
|
107
|
+
}.merge(params)
|
104
108
|
|
105
|
-
|
106
|
-
token = params[1]
|
107
|
-
if params[2] == nil || params[2] == "list_params"
|
108
|
-
ap "REQUIRED: [course_name, course_code, template_id]"
|
109
|
-
ap "OPTIONAL: [is_active(T/F), start_date (2011-12-12T00:00:00), end_date, can_register(T/F), allow_sections(T/F)]"
|
110
|
-
ap "Must be comma separated with no spaces. (e.g. -p course_name=CS100,course_code=123,is_active=false)"
|
111
|
-
exit
|
112
|
-
else
|
113
|
-
params[2].split(',').each do |values|
|
114
|
-
vals = values.split('=')
|
115
|
-
instance_variable_set("@#{vals[0]}", vals[1])
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
the_xml = '<?xml version="1.0" encoding="utf-8"?>
|
120
|
-
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
121
|
-
<soap:Header>
|
122
|
-
<RequestHeader xmlns="http://www.desire2learn.com/services/common/xsd/common-v1_0">
|
123
|
-
<Version>1.0</Version>
|
124
|
-
<CorellationId>12345</CorellationId>
|
125
|
-
<AuthenticationToken>'+ token +'</AuthenticationToken>
|
126
|
-
</RequestHeader>
|
127
|
-
</soap:Header>
|
128
|
-
<soap:Body>
|
129
|
-
<CreateCourseOfferingRequest xmlns="http://www.desire2learn.com/services/oums/wsdl/OrgUnitManagementService-v1_0">
|
130
|
-
<Name>'+ @course_name +'</Name>
|
131
|
-
<Code>'+ @course_code +'</Code>
|
132
|
-
<TemplateId>
|
133
|
-
<Id xmlns="http://www.desire2learn.com/services/common/xsd/common-v1_0">'+ @template_id +'</Id>
|
134
|
-
<Source xmlns="http://www.desire2learn.com/services/common/xsd/common-v1_0">Desire2Learn</Source>
|
135
|
-
</TemplateId>
|
136
|
-
<IsActive>'+ @is_active +'</IsActive>
|
137
|
-
<StartDate>'+ @start_date +'</StartDate>
|
138
|
-
<EndDate>'+ @end_date +'</EndDate>
|
139
|
-
<CanRegister>'+ @can_register +'</CanRegister>
|
140
|
-
<AllowSections>'+ @allow_sections +'</AllowSections>
|
141
|
-
</CreateCourseOfferingRequest>
|
142
|
-
</soap:Body>
|
143
|
-
</soap:Envelope>'
|
144
|
-
|
145
|
-
orgunit = connect(site_url).request :create_course_offering do
|
146
|
-
soap.xml = the_xml
|
147
|
-
end
|
148
|
-
|
149
|
-
end
|
150
|
-
|
151
|
-
def self.create_course_template(params)
|
152
|
-
|
153
|
-
# I don't use <Path>'+ @template_path +'</Path>. Add it if you need it.
|
109
|
+
token = RubyD2L::Auth.get_token
|
154
110
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
111
|
+
the_xml = '<?xml version="1.0" encoding="utf-8"?>
|
112
|
+
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
113
|
+
<soap:Header>
|
114
|
+
<RequestHeader xmlns="http://www.desire2learn.com/services/common/xsd/common-v1_0">
|
115
|
+
<Version>1.0</Version>
|
116
|
+
<CorellationId>12345</CorellationId>
|
117
|
+
<AuthenticationToken>'+ token +'</AuthenticationToken>
|
118
|
+
</RequestHeader>
|
119
|
+
</soap:Header>
|
120
|
+
<soap:Body>
|
121
|
+
<CreateCourseOfferingRequest xmlns="http://www.desire2learn.com/services/oums/wsdl/OrgUnitManagementService-v1_0">
|
122
|
+
<Name>'+ params[:offering_name] +'</Name>
|
123
|
+
<Code>'+ params[:offering_code] +'</Code>
|
124
|
+
<TemplateId>
|
125
|
+
<Id xmlns="http://www.desire2learn.com/services/common/xsd/common-v1_0">'+ params[:template_id] +'</Id>
|
126
|
+
<Source xmlns="http://www.desire2learn.com/services/common/xsd/common-v1_0">Desire2Learn</Source>
|
127
|
+
</TemplateId>
|
128
|
+
<IsActive>'+ params[:is_active] +'</IsActive>
|
129
|
+
<StartDate>'+ params[:start_date] +'</StartDate>
|
130
|
+
<EndDate>'+ params[:end_date] +'</EndDate>
|
131
|
+
<CanRegister>'+ params[:can_register] +'</CanRegister>
|
132
|
+
<AllowSections>'+ params[:allow_sections] +'</AllowSections>
|
133
|
+
</CreateCourseOfferingRequest>
|
134
|
+
</soap:Body>
|
135
|
+
</soap:Envelope>'
|
160
136
|
|
161
|
-
|
162
|
-
|
163
|
-
if params[2] == nil || params[2] == "list_params"
|
164
|
-
ap "REQUIRED: [template_name, template_code]"
|
165
|
-
ap "OPTIONAL: [is_active(true/false), start_date(YYYY-MM-DDThh:mm:ss), end_date(YYYY-MM-DDThh:mm:ss)]"
|
166
|
-
ap "Must be comma separated with no spaces. (e.g. -p template_name=CS100,template_code=123,is_active=false)"
|
167
|
-
exit
|
168
|
-
else
|
169
|
-
params[2].split(',').each do |values|
|
170
|
-
vals = values.split('=')
|
171
|
-
instance_variable_set("@#{vals[0]}", vals[1])
|
172
|
-
end
|
137
|
+
orgunit = self.connect(RubyD2L.site_url).request :create_course_offering do
|
138
|
+
soap.xml = the_xml
|
173
139
|
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
# = CreateCourseTemplate
|
144
|
+
# REQUIRED: { :template_name => "NAME", :template_code => "CODE" }
|
145
|
+
# OPTIONAL: { :is_active => "true|false", :start_date => DateTime.to_s (e.g. YYYYMMDDThh:mm:ss), :end_date => DateTime.to_s (e.g. YYYYMMDDThh:mm:ss) }
|
146
|
+
def self.create_course_template(params={})
|
147
|
+
self.required_params(params, [:template_name, :template_code])
|
148
|
+
|
149
|
+
params = {
|
150
|
+
:template_name => "",
|
151
|
+
:template_code => "",
|
152
|
+
:is_active => "false",
|
153
|
+
:start_date => DateTime.now.to_s,
|
154
|
+
:end_date => DateTime.now.to_s
|
155
|
+
}.merge(params)
|
156
|
+
|
157
|
+
token = RubyD2L::Auth.get_token
|
174
158
|
|
175
159
|
the_xml = '<?xml version="1.0" encoding="utf-8"?>
|
176
160
|
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
@@ -183,39 +167,32 @@ module RubyD2L
|
|
183
167
|
</soap:Header>
|
184
168
|
<soap:Body>
|
185
169
|
<CreateCourseTemplateRequest xmlns="http://www.desire2learn.com/services/oums/wsdl/OrgUnitManagementService-v1_0">
|
186
|
-
<Name>'+
|
187
|
-
<Code>'+
|
188
|
-
<IsActive>'+
|
189
|
-
<StartDate>'+
|
190
|
-
<EndDate>'+
|
170
|
+
<Name>'+ params[:template_name] +'</Name>
|
171
|
+
<Code>'+ params[:template_code] +'</Code>
|
172
|
+
<IsActive>'+ params[:is_active] +'</IsActive>
|
173
|
+
<StartDate>'+ params[:start_date] +'</StartDate>
|
174
|
+
<EndDate>'+ params[:end_date] +'</EndDate>
|
191
175
|
</CreateCourseTemplateRequest>
|
192
176
|
</soap:Body>
|
193
177
|
</soap:Envelope>'
|
194
178
|
|
195
|
-
template = connect(site_url).request :create_course_template do
|
179
|
+
template = self.connect(RubyD2L.site_url).request :create_course_template do
|
196
180
|
soap.xml = the_xml
|
197
181
|
end
|
198
182
|
|
199
|
-
|
200
183
|
end
|
201
184
|
|
202
|
-
|
203
|
-
|
204
|
-
|
185
|
+
# = GetCourseTemplateByCode
|
186
|
+
# REQUIRED: template_code => "CODE"
|
187
|
+
def self.get_course_template_by_code(params={})
|
188
|
+
self.required_params(params, [:template_code])
|
189
|
+
|
190
|
+
params = {
|
191
|
+
:template_code => ""
|
192
|
+
}.merge(params)
|
193
|
+
|
205
194
|
token = RubyD2L::Auth.get_token
|
206
195
|
|
207
|
-
# site_url = params[0]
|
208
|
-
# token = params[1]
|
209
|
-
# if params[2] == nil || params[2] == "list_params"
|
210
|
-
# ap "REQUIRED: [template_code]"
|
211
|
-
# exit
|
212
|
-
# else
|
213
|
-
# params[2].split(',').each do |values|
|
214
|
-
# vals = values.split('=')
|
215
|
-
# instance_variable_set("@#{vals[0]}", vals[1])
|
216
|
-
# end
|
217
|
-
# end
|
218
|
-
|
219
196
|
the_xml = '<?xml version="1.0" encoding="utf-8"?>
|
220
197
|
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
221
198
|
<soap:Header>
|
@@ -227,7 +204,7 @@ module RubyD2L
|
|
227
204
|
</soap:Header>
|
228
205
|
<soap:Body>
|
229
206
|
<GetCourseTemplateByCodeRequest xmlns="http://www.desire2learn.com/services/oums/wsdl/OrgUnitManagementService-v1_0">
|
230
|
-
<Code>'+ template_code +'</Code>
|
207
|
+
<Code>'+ params[:template_code] +'</Code>
|
231
208
|
</GetCourseTemplateByCodeRequest>
|
232
209
|
</soap:Body>
|
233
210
|
</soap:Envelope>'
|
@@ -237,5 +214,13 @@ module RubyD2L
|
|
237
214
|
end
|
238
215
|
|
239
216
|
end
|
217
|
+
|
218
|
+
def self.required_params(passed_params={},*args)
|
219
|
+
required_params = *args[0]
|
220
|
+
required_params.each do |key|
|
221
|
+
raise ArgumentError.new("MISSING PARAM -- :#{key} parameter is required!") unless passed_params.has_key?(key)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
240
225
|
end
|
241
226
|
end
|
data/lib/ruby-d2l/user.rb
CHANGED
@@ -1,86 +1,89 @@
|
|
1
|
-
|
1
|
+
require "savon"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
module RubyD2L
|
4
|
+
class User
|
5
|
+
|
6
|
+
def self.connect(site_url)
|
7
|
+
Savon::Client.new do
|
8
|
+
wsdl.document = "#{site_url}/D2LWS/UserManagementService-v1.asmx?WSDL"
|
9
|
+
wsdl.endpoint = "#{site_url}/D2LWS/UserManagementService-v1.asmx"
|
10
|
+
http.auth.ssl.verify_mode = :none
|
11
|
+
end
|
9
12
|
end
|
10
|
-
end
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
+
def self.list_soap_actions(params)
|
15
|
+
# Get available SOAP actions
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
+
site_url = params[0]
|
18
|
+
ap connect(site_url).wsdl.soap_actions
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
20
|
+
# [
|
21
|
+
# [ 0] :get_active_course_offerings_ex,
|
22
|
+
# [ 1] :get_active_course_offerings,
|
23
|
+
# [ 2] :activate_users,
|
24
|
+
# [ 3] :deactivate_users,
|
25
|
+
# [ 4] :get_user_activation_status,
|
26
|
+
# [ 5] :create_auditor_relationship,
|
27
|
+
# [ 6] :remove_auditor_relationship,
|
28
|
+
# [ 7] :get_auditors,
|
29
|
+
# [ 8] :get_auditees,
|
30
|
+
# [ 9] :get_users_by_org_unit_role,
|
31
|
+
# [10] :create_user,
|
32
|
+
# [11] :delete_user,
|
33
|
+
# [12] :get_user,
|
34
|
+
# [13] :update_user,
|
35
|
+
# [14] :delete_user_by_user_name,
|
36
|
+
# [15] :delete_user_by_org_defined_id,
|
37
|
+
# [16] :get_user_by_user_name,
|
38
|
+
# [17] :get_user_by_org_defined_id,
|
39
|
+
# [18] :get_roles,
|
40
|
+
# [19] :get_role,
|
41
|
+
# [20] :change_password,
|
42
|
+
# [21] :enroll_user,
|
43
|
+
# [22] :unenroll_user,
|
44
|
+
# [23] :get_org_unit_enrollment,
|
45
|
+
# [24] :get_enrollments_by_org_unit,
|
46
|
+
# [25] :get_profile_by_user,
|
47
|
+
# [26] :get_profile_picture,
|
48
|
+
# [27] :update_profile,
|
49
|
+
# [28] :get_users_by_group,
|
50
|
+
# [29] :get_users_by_section,
|
51
|
+
# [30] :get_users_by_course_offerings_index,
|
52
|
+
# [31] :get_permitted_tasks_by_user_org_unit
|
53
|
+
# ]
|
52
54
|
|
53
|
-
|
55
|
+
end
|
54
56
|
|
55
57
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
58
|
+
def self.get_user_by_user_name(params)
|
59
|
+
site_url = params[0]
|
60
|
+
token = params[1]
|
61
|
+
if params[2] == nil || params[2] == "list_params"
|
62
|
+
ap "[user_name] param required by get_user_by_user_name!"
|
63
|
+
exit
|
64
|
+
else
|
65
|
+
user_name = params[2]
|
66
|
+
end
|
65
67
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
68
|
+
user = connect(site_url).request :get_user_by_user_name do
|
69
|
+
soap.xml = '<?xml version="1.0" encoding="utf-8"?>
|
70
|
+
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
71
|
+
<soap:Header>
|
72
|
+
<RequestHeader xmlns="http://www.desire2learn.com/services/common/xsd/common-v1_0">
|
73
|
+
<Version>1.0</Version>
|
74
|
+
<CorellationId>12345</CorellationId>
|
75
|
+
<AuthenticationToken>'+ token +'</AuthenticationToken>
|
76
|
+
</RequestHeader>
|
77
|
+
</soap:Header>
|
78
|
+
<soap:Body>
|
79
|
+
<GetUserByUserNameRequest xmlns="http://www.desire2learn.com/services/ums/wsdl/UserManagementService-v1_0">
|
80
|
+
<UserName>'+ user_name +'</UserName>
|
81
|
+
</GetUserByUserNameRequest>
|
82
|
+
</soap:Body>
|
83
|
+
</soap:Envelope>'
|
84
|
+
end
|
82
85
|
end
|
83
|
-
end
|
84
86
|
|
85
87
|
|
88
|
+
end
|
86
89
|
end
|
data/ruby-d2l.gemspec
CHANGED
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Matt Mencel
|
@@ -126,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
126
|
requirements:
|
127
127
|
- - ">="
|
128
128
|
- !ruby/object:Gem::Version
|
129
|
-
hash: -
|
129
|
+
hash: -3831117481161228882
|
130
130
|
segments:
|
131
131
|
- 0
|
132
132
|
version: "0"
|