ruby-d2l 0.2.2 → 0.3.0
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/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"
|