d2l_sdk 0.1.10 → 0.1.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +28 -0
- data/.fasterer.yml +28 -0
- data/.rubocop.yml +67 -0
- data/.vscode/settings.json +9 -0
- data/Gemfile +3 -2
- data/README.md +341 -63
- data/d2l_sdk.gemspec +1 -0
- data/lib/d2l_sdk/auth.rb +1 -1
- data/lib/d2l_sdk/calendar.rb +11 -12
- data/lib/d2l_sdk/config.rb +29 -29
- data/lib/d2l_sdk/config_variables.rb +27 -39
- data/lib/d2l_sdk/course.rb +53 -47
- data/lib/d2l_sdk/course_content.rb +60 -54
- data/lib/d2l_sdk/course_template.rb +19 -14
- data/lib/d2l_sdk/datahub.rb +28 -28
- data/lib/d2l_sdk/demographics.rb +23 -8
- data/lib/d2l_sdk/discussions.rb +361 -56
- data/lib/d2l_sdk/dropbox.rb +208 -16
- data/lib/d2l_sdk/enroll.rb +9 -9
- data/lib/d2l_sdk/grades.rb +7 -7
- data/lib/d2l_sdk/group.rb +42 -42
- data/lib/d2l_sdk/logging.rb +2 -2
- data/lib/d2l_sdk/lti.rb +243 -11
- data/lib/d2l_sdk/news.rb +2 -2
- data/lib/d2l_sdk/org_unit.rb +20 -18
- data/lib/d2l_sdk/requests.rb +105 -69
- data/lib/d2l_sdk/section.rb +13 -12
- data/lib/d2l_sdk/semester.rb +6 -5
- data/lib/d2l_sdk/setup_versions.rb +7 -7
- data/lib/d2l_sdk/user.rb +48 -58
- data/lib/d2l_sdk/version.rb +1 -1
- metadata +6 -5
- data/change_lastname.rb +0 -65
- data/lol.txt +0 -1
- data/test.rb +0 -19
data/lib/d2l_sdk/logging.rb
CHANGED
@@ -19,7 +19,7 @@ def get_all_logs(date_range_start, date_range_end, search = '', log_level = '',
|
|
19
19
|
path += "&loggerAssembly=#{logger_assembly}" if logger_assembly != ''
|
20
20
|
path += "&userId=#{user_id}" if user_id != 0
|
21
21
|
path += "&messageGroupId=#{message_group_id}" if message_group_id != 0
|
22
|
-
path += "&includeTraces=#{include_traces}"
|
22
|
+
path += "&includeTraces=#{include_traces}" unless include_traces.nil?
|
23
23
|
path += "&orgUnitId=#{org_unit_id}" if org_unit_id != 0
|
24
24
|
path += "&bookmark=#{bookmark}" if bookmark != ''
|
25
25
|
ap path
|
@@ -51,7 +51,7 @@ end
|
|
51
51
|
# retrieve identified log message
|
52
52
|
def get_log_message(log_message_id, include_traces = nil)
|
53
53
|
path = "/d2l/api/lp/#{$lp_ver}/logging/#{log_message_id}/"
|
54
|
-
path += "?includeTraces=#{include_traces}"
|
54
|
+
path += "?includeTraces=#{include_traces}" unless include_traces.nil?
|
55
55
|
_get(path)
|
56
56
|
# returns Message JSON block
|
57
57
|
end
|
data/lib/d2l_sdk/lti.rb
CHANGED
@@ -5,30 +5,262 @@ require 'json-schema'
|
|
5
5
|
## ACTIONS: ######
|
6
6
|
##################
|
7
7
|
|
8
|
-
#
|
8
|
+
# REVIEW: Remove an LTI link.
|
9
9
|
# => DELETE /d2l/api/le/(version)/lti/link/(ltiLinkId)
|
10
|
-
|
10
|
+
def delete_lti_link(lti_link_id)
|
11
|
+
path = "/d2l/api/le/#{$le_ver}/lti/link/#{lti_link_id}"
|
12
|
+
_delete(path)
|
13
|
+
end
|
14
|
+
|
15
|
+
# REVIEW: Retrieve the information for all LTI links registered for an org unit.
|
11
16
|
# => GET /d2l/api/le/(version)/lti/link/(orgUnitId)/
|
12
|
-
|
17
|
+
def get_org_unit_lti_links(org_unit_id)
|
18
|
+
path = "/d2l/api/le/#{$le_ver}/lti/link/#{org_unit_id}/"
|
19
|
+
_get(path)
|
20
|
+
end
|
21
|
+
|
22
|
+
# REVIEW: Retrieve the information for a particular LTI link.
|
13
23
|
# => GET /d2l/api/le/(version)/lti/link/(orgUnitId)/(ltiLinkId)
|
14
|
-
|
24
|
+
def get_lti_link_info(org_unit_id, lti_link_id)
|
25
|
+
path = "/d2l/api/le/#{$le_ver}/lti/link/#{org_unit_id}/#{lti_link_id}"
|
26
|
+
_get(path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def check_create_lti_link_data_validity(create_lti_link_data)
|
30
|
+
schema = {
|
31
|
+
'type' => 'object',
|
32
|
+
'required' => %w(Title Url Description Key PlainSecret
|
33
|
+
IsVisible SignMessage SignWithTc SendTcInfo
|
34
|
+
SendContextInfo SendUserId SendUserName SendUserEmail
|
35
|
+
SendLinkTitle SendLinkDescription SendD2LUserName
|
36
|
+
SendD2LOrgDefinedId SendD2LOrgRoleId
|
37
|
+
UseToolProviderSecuritySettings CustomParameters),
|
38
|
+
'properties' =>
|
39
|
+
{
|
40
|
+
'Title' => { 'type' => 'string' },
|
41
|
+
'Url' => { 'type' => 'string' },
|
42
|
+
'Description' => { 'type' => 'string' },
|
43
|
+
'Key' => { 'type' => 'string' },
|
44
|
+
'PlainSecret' => { 'type' => 'string' },
|
45
|
+
'IsVisible' => { 'type' => 'boolean' },
|
46
|
+
'SignMessage' => { 'type' => 'boolean' },
|
47
|
+
'SignWithTc' => { 'type' => 'boolean' },
|
48
|
+
'SendTcInfo' => { 'type' => 'boolean' },
|
49
|
+
'SendContextInfo' => { 'type' => 'boolean' },
|
50
|
+
'SendUserId' => { 'type' => 'boolean' },
|
51
|
+
'SendUserName' => { 'type' => 'boolean' },
|
52
|
+
'SendUserEmail' => { 'type' => 'boolean' },
|
53
|
+
'SendLinkTitle' => { 'type' => 'boolean' },
|
54
|
+
'SendLinkDescription' => { 'type' => 'boolean' },
|
55
|
+
'SendD2LUserName' => { 'type' => 'boolean' },
|
56
|
+
'SendD2LOrgDefinedId' => { 'type' => 'boolean' },
|
57
|
+
'SendD2LOrgRoleId' => { 'type' => 'boolean' },
|
58
|
+
'UseToolProviderSecuritySettings' => { 'type' => 'boolean' },
|
59
|
+
'CustomParameters' =>
|
60
|
+
{ # define the CustomParameter array
|
61
|
+
# 'description' => 'The array of CustomParameters
|
62
|
+
'type' => %w(array null),
|
63
|
+
'items' =>
|
64
|
+
{
|
65
|
+
'type' => 'object',
|
66
|
+
"properties" =>
|
67
|
+
{
|
68
|
+
"Name" => { 'type' => 'string' },
|
69
|
+
"Value" => { 'type' => 'string' }
|
70
|
+
}
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
JSON::Validator.validate!(schema, create_lti_link_data, validate_schema: true)
|
76
|
+
end
|
77
|
+
|
78
|
+
# REVIEW: Register a new LTI link for an org unit.
|
15
79
|
# => POST /d2l/api/le/(version)/lti/link/(orgUnitId)
|
16
|
-
|
80
|
+
def register_lti_link(org_unit_id, create_lti_link_data)
|
81
|
+
path = "/d2l/api/le/#{$le_ver}/lti/link/#{org_unit_id}"
|
82
|
+
payload = {
|
83
|
+
'Title' => '',
|
84
|
+
'Url' => '',
|
85
|
+
'Description' => '',
|
86
|
+
'Key' => '',
|
87
|
+
'PlainSecret' => '',
|
88
|
+
'IsVisible' => false,
|
89
|
+
'SignMessage' => false,
|
90
|
+
'SignWithTc' => false,
|
91
|
+
'SendTcInfo' => false,
|
92
|
+
'SendContextInfo' => false,
|
93
|
+
'SendUserId' => false,
|
94
|
+
'SendUserName' => false,
|
95
|
+
'SendUserEmail' => false,
|
96
|
+
'SendLinkTitle' => false,
|
97
|
+
'SendLinkDescription' => false,
|
98
|
+
'SendD2LUserName' => false,
|
99
|
+
'SendD2LOrgDefinedId' => false,
|
100
|
+
'SendD2LOrgRoleId' => false,
|
101
|
+
'UseToolProviderSecuritySettings' => false,
|
102
|
+
'CustomParameters' => nil # or Array of CustomParameter
|
103
|
+
# e.g. [{"Name" => "", "Value" => ""},{"Name" => "", "Value" => ""}]
|
104
|
+
}.merge!(create_lti_link_data)
|
105
|
+
check_create_lti_link_data_validity(payload)
|
106
|
+
_post(path, payload)
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
# REVIEW: Build a new quicklink around an existing LTI link.
|
17
111
|
# => POST /d2l/api/le/(version)/lti/quicklink/(orgUnitId)/(ltiLinkId)
|
18
|
-
|
112
|
+
def create_lti_quicklink(org_unit_id, lti_link_id)
|
113
|
+
path = "/d2l/api/le/#{$le_ver}/lti/quicklink/#{org_unit_id}/#{lti_link_id}"
|
114
|
+
_post(path, {})
|
115
|
+
end
|
116
|
+
|
117
|
+
# REVIEW: Update the information associated with a registered LTI link.
|
19
118
|
# => PUT /d2l/api/le/(version)/lti/link/(ltiLinkId)
|
119
|
+
def update_lti_link(lti_link_id, create_lti_link_data)
|
120
|
+
path = "/d2l/api/le/#{$le_ver}/lti/link/#{lti_link_id}"
|
121
|
+
payload = {
|
122
|
+
'Title' => '',
|
123
|
+
'Url' => '',
|
124
|
+
'Description' => '',
|
125
|
+
'Key' => '',
|
126
|
+
'PlainSecret' => '',
|
127
|
+
'IsVisible' => false,
|
128
|
+
'SignMessage' => false,
|
129
|
+
'SignWithTc' => false,
|
130
|
+
'SendTcInfo' => false,
|
131
|
+
'SendContextInfo' => false,
|
132
|
+
'SendUserId' => false,
|
133
|
+
'SendUserName' => false,
|
134
|
+
'SendUserEmail' => false,
|
135
|
+
'SendLinkTitle' => false,
|
136
|
+
'SendLinkDescription' => false,
|
137
|
+
'SendD2LUserName' => false,
|
138
|
+
'SendD2LOrgDefinedId' => false,
|
139
|
+
'SendD2LOrgRoleId' => false,
|
140
|
+
'UseToolProviderSecuritySettings' => false,
|
141
|
+
'CustomParameters' => nil # or Array of CustomParameter
|
142
|
+
# e.g. [{"Name" => "", "Value" => ""},{"Name" => "", "Value" => ""}]
|
143
|
+
}.merge!(create_lti_link_data)
|
144
|
+
check_create_lti_link_data_validity(payload)
|
145
|
+
_put(path, payload)
|
146
|
+
end
|
20
147
|
|
21
148
|
#############################
|
22
149
|
## LTI TOOL PROVIDERS: ######
|
23
150
|
#############################
|
24
151
|
|
25
|
-
#
|
152
|
+
# REVIEW: Remove the registration for an LTI tool provider.
|
26
153
|
# => DELETE /d2l/api/le/(version)/lti/tp/(tpId)
|
27
|
-
|
154
|
+
def delete_LTI_tool_provider_registration(tp_id)
|
155
|
+
path = "/d2l/api/le/#{$le_ver}/lti/tp/#{tp_id}"
|
156
|
+
_delete(path)
|
157
|
+
end
|
158
|
+
|
159
|
+
# REVIEW: Retrieve the information for all LTI tool providers registered for an org unit.
|
28
160
|
# => GET /d2l/api/le/(version)/lti/tp/(orgUnitId)/
|
29
|
-
|
161
|
+
def get_org_unit_lti_tool_providers(org_unit_id)
|
162
|
+
path = "/d2l/api/le/#{$le_ver}/lti/tp/#{org_unit_id}/"
|
163
|
+
_get(path)
|
164
|
+
end
|
165
|
+
|
166
|
+
# REVIEW: Retrieve the information for a particular LTI tool provider.
|
30
167
|
# => GET /d2l/api/le/(version)/lti/tp/(orgUnitId)/(tpId)
|
31
|
-
|
168
|
+
def get_lti_tool_provider_information(org_unit_id, tp_id)
|
169
|
+
path = "/d2l/api/le/#{$le_ver}/lti/tp/#{org_unit_id}/#{tp_id}"
|
170
|
+
_get(path)
|
171
|
+
end
|
172
|
+
|
173
|
+
# Schema to check the CreateLtiProviderData JSON block validity.
|
174
|
+
def check_create_lti_provider_data_validity(create_lti_provider_data)
|
175
|
+
schema = {
|
176
|
+
'type' => 'object',
|
177
|
+
'required' => %w(LaunchPoint Secret UseDefaultTcInfo Key Name
|
178
|
+
Description ContactEmail SendTcInfo
|
179
|
+
SendContextInfo SendUserId SendUserName SendUserEmail
|
180
|
+
SendLinkTitle SendLinkDescription SendD2LUserName
|
181
|
+
SendD2LOrgDefinedId SendD2LOrgRoleId),
|
182
|
+
'properties' =>
|
183
|
+
{
|
184
|
+
'LaunchPoint' => { 'type' => 'string' },
|
185
|
+
'Secret' => { 'type' => 'string' },
|
186
|
+
'UseDefaultTcInfo' => { 'type' => 'string' },
|
187
|
+
'Key' => { 'type' => 'string' },
|
188
|
+
'Name' => { 'type' => 'string' },
|
189
|
+
'Description' => { 'type' => 'string' },
|
190
|
+
'ContactEmail' => { 'type' => 'string' },
|
191
|
+
'IsVisible' => { 'type' => 'boolean' },
|
192
|
+
'SendTcInfo' => { 'type' => 'boolean' }, # LE's 1.12+
|
193
|
+
'SendContextInfo' => { 'type' => 'boolean' }, # LE's 1.12+
|
194
|
+
'SendUserId' => { 'type' => 'boolean' }, # LE's 1.12+
|
195
|
+
'SendUserName' => { 'type' => 'boolean' }, # LE's 1.12+
|
196
|
+
'SendUserEmail' => { 'type' => 'boolean' }, # LE's 1.12+
|
197
|
+
'SendLinkTitle' => { 'type' => 'boolean' }, # LE's 1.12+
|
198
|
+
'SendLinkDescription' => { 'type' => 'boolean' }, # LE's 1.12+
|
199
|
+
'SendD2LUserName' => { 'type' => 'boolean' }, # LE's 1.12+
|
200
|
+
'SendD2LOrgDefinedId' => { 'type' => 'boolean' }, # LE's 1.12+
|
201
|
+
'SendD2LOrgRoleId' => { 'type' => 'boolean' } # LE's 1.12+
|
202
|
+
}
|
203
|
+
}
|
204
|
+
JSON::Validator.validate!(schema, create_lti_provider_data, validate_schema: true)
|
205
|
+
end
|
206
|
+
|
207
|
+
# REVIEW: Register a new LTI tool provider for an org unit.
|
32
208
|
# => POST /d2l/api/le/(version)/lti/tp/(orgUnitId)
|
33
|
-
#
|
209
|
+
# INPUT: LTI.CreateLtiProviderData
|
210
|
+
def register_lti_tool_provider(org_unit_id, create_lti_provider_data)
|
211
|
+
path = "/d2l/api/le/#{$le_ver}/lti/tp/#{org_unit_id}"
|
212
|
+
payload = {
|
213
|
+
'LaunchPoint' => '',
|
214
|
+
'Secret' => '',
|
215
|
+
'UseDefaultTcInfo' => '',
|
216
|
+
'Key' => '',
|
217
|
+
'Name' => '',
|
218
|
+
'Description' => '',
|
219
|
+
'ContactEmail' => '',
|
220
|
+
'IsVisible' => false,
|
221
|
+
'SendTcInfo' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
222
|
+
'SendContextInfo' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
223
|
+
'SendUserId' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
224
|
+
'SendUserName' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
225
|
+
'SendUserEmail' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
226
|
+
'SendLinkTitle' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
227
|
+
'SendLinkDescription' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
228
|
+
'SendD2LUserName' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
229
|
+
'SendD2LOrgDefinedId' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
230
|
+
'SendD2LOrgRoleId' => false # Appears in LE's 1.12+ contract as of LE v10.6.0
|
231
|
+
}.merge!(create_lti_provider_data)
|
232
|
+
check_create_lti_provider_data_validity(payload)
|
233
|
+
_post(path, payload)
|
234
|
+
# RETURNS: a LtiToolProviderData JSON block
|
235
|
+
end
|
236
|
+
|
237
|
+
|
238
|
+
# REVIEW: Update the information associated with a registered LTI tool provider.
|
34
239
|
# => PUT /d2l/api/le/(version)/lti/tp/(tpId)
|
240
|
+
# INPUT: LTI.CreateLtiProviderData
|
241
|
+
def update_lti_tool_provider(tp_id, create_lti_provider_data)
|
242
|
+
path = "/d2l/api/le/#{$le_ver}/lti/tp/#{tp_id}" # tp_id = tool provider id
|
243
|
+
payload = {
|
244
|
+
'LaunchPoint' => '',
|
245
|
+
'Secret' => '',
|
246
|
+
'UseDefaultTcInfo' => '',
|
247
|
+
'Key' => '',
|
248
|
+
'Name' => '',
|
249
|
+
'Description' => '',
|
250
|
+
'ContactEmail' => '',
|
251
|
+
'IsVisible' => false,
|
252
|
+
'SendTcInfo' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
253
|
+
'SendContextInfo' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
254
|
+
'SendUserId' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
255
|
+
'SendUserName' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
256
|
+
'SendUserEmail' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
257
|
+
'SendLinkTitle' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
258
|
+
'SendLinkDescription' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
259
|
+
'SendD2LUserName' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
260
|
+
'SendD2LOrgDefinedId' => false, # Appears in LE's 1.12+ contract as of LE v10.6.0
|
261
|
+
'SendD2LOrgRoleId' => false # Appears in LE's 1.12+ contract as of LE v10.6.0
|
262
|
+
}.merge!(create_lti_provider_data)
|
263
|
+
check_create_lti_provider_data_validity(payload)
|
264
|
+
_put(path, payload)
|
265
|
+
# RETURNS: a LtiToolProviderData JSON block
|
266
|
+
end
|
data/lib/d2l_sdk/news.rb
CHANGED
@@ -22,12 +22,12 @@ end
|
|
22
22
|
# if since and until are specified, all items between these two dates are fetched
|
23
23
|
# if since > until, an empty feed list is returned
|
24
24
|
# purpose: fetch the feed for the current user context
|
25
|
-
def get_current_user_feed(since = "",
|
25
|
+
def get_current_user_feed(since = "", until_ = "")
|
26
26
|
path = "/d2l/api/lp/#{$lp_ver}/feed/"
|
27
27
|
# if since is specified, then until can be. Until is not required though.
|
28
28
|
if since != ""
|
29
29
|
path += "?since=#{since}"
|
30
|
-
path += "&until=#{
|
30
|
+
path += "&until=#{until_}" if until_ != ""
|
31
31
|
end
|
32
32
|
_get(path)
|
33
33
|
end
|
data/lib/d2l_sdk/org_unit.rb
CHANGED
@@ -34,7 +34,7 @@ def delete_relationship_of_parent_with_child(parent_ou_id, child_ou_id)
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def get_properties_of_all_org_units(org_unit_type = '', org_unit_code = '', org_unit_name = '',
|
37
|
-
|
37
|
+
bookmark = '')
|
38
38
|
path = "/d2l/api/lp/#{$lp_ver}/orgstructure/"
|
39
39
|
path += "?orgUnitType=#{org_unit_type}" if org_unit_type != ''
|
40
40
|
path += "?orgUnitCode=#{org_unit_code}" if org_unit_code != ''
|
@@ -165,9 +165,10 @@ def check_org_unit_data_validity(org_unit_data)
|
|
165
165
|
'Type' => { 'type' => 'integer' },
|
166
166
|
'Name' => { 'type' => 'string' },
|
167
167
|
'Code' => { 'type' => 'string' },
|
168
|
-
'Parents' => {
|
169
|
-
|
170
|
-
|
168
|
+
'Parents' => {
|
169
|
+
'type' => 'array',
|
170
|
+
'items' => { 'type' => 'integer', 'minItems' => 1 }
|
171
|
+
}
|
171
172
|
}
|
172
173
|
}
|
173
174
|
JSON::Validator.validate!(schema, org_unit_data, validate_schema: true)
|
@@ -177,11 +178,12 @@ end
|
|
177
178
|
def create_custom_org_unit(org_unit_data)
|
178
179
|
# Requires the type to have the correct parent. This will work fine in this
|
179
180
|
# sample, as the department (101) can have the parent Organiation (6606)
|
180
|
-
payload = {
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
181
|
+
payload = {
|
182
|
+
'Type' => 101, # Number:D2LID
|
183
|
+
'Name' => 'custom_ou_name', # String
|
184
|
+
'Code' => 'custom_ou_code', # String
|
185
|
+
'Parents' => [6606], # Number:D2LID
|
186
|
+
}.merge!(org_unit_data)
|
185
187
|
check_org_unit_data_validity(payload)
|
186
188
|
path = "/d2l/api/lp/#{$lp_ver}/orgstructure/"
|
187
189
|
# Requires: OrgUnitCreateData JSON block
|
@@ -268,20 +270,20 @@ end
|
|
268
270
|
# COLOUR SCHEMES:#######
|
269
271
|
########################
|
270
272
|
|
271
|
-
#
|
273
|
+
# TODO: Retrieve the colour scheme for an org unit.
|
272
274
|
# RETURNS: ColourScheme JSON data block containing the org unit’s current colour scheme.
|
273
|
-
def get_org_unit_color_scheme(org_unit_id)
|
274
|
-
path = "/d2l/api/lp/#{$lp_ver}/orgstructure/#{org_unit_id}/colours"
|
275
|
+
# def get_org_unit_color_scheme(org_unit_id)
|
276
|
+
# path = "/d2l/api/lp/#{$lp_ver}/orgstructure/#{org_unit_id}/colours"
|
275
277
|
# RETURNS: ColourScheme JSON data block containing the org unit’s current colour scheme.
|
276
|
-
end
|
278
|
+
# end
|
277
279
|
|
278
280
|
# TODO: Set a new colour scheme for an org unit.
|
279
281
|
# INPUT: JSON PARAM of type +colourScheme+ (OrgUnitEditor.ColourScheme)
|
280
282
|
# RETURNS: ColourScheme JSON data block containing the org unit’s new colour scheme.
|
281
|
-
def set_new_org_unit_color_scheme(org_unit_id, colour_scheme)
|
283
|
+
# def set_new_org_unit_color_scheme(org_unit_id, colour_scheme)
|
282
284
|
# PUT /d2l/api/lp/(version)/orgstructure/(orgUnitId)/colours
|
283
285
|
# RETURNS: ColourScheme JSON data block containing the org unit’s new colour scheme.
|
284
|
-
end
|
286
|
+
# end
|
285
287
|
|
286
288
|
########################
|
287
289
|
# RECYCLE BIN:##########
|
@@ -368,7 +370,7 @@ def check_create_org_unit_type_data_validity(org_unit_type_data)
|
|
368
370
|
'Code' => { 'type' => 'string' },
|
369
371
|
'Name' => { 'type' => 'string' },
|
370
372
|
'Description' => { 'type' => 'string' },
|
371
|
-
'SortOrder' => { 'type' => 'integer'}
|
373
|
+
'SortOrder' => { 'type' => 'integer' }
|
372
374
|
}
|
373
375
|
}
|
374
376
|
JSON::Validator.validate!(schema, org_unit_type_data, validate_schema: true)
|
@@ -382,7 +384,7 @@ def create_custom_outype(create_org_unit_type_data)
|
|
382
384
|
'Description' => '',
|
383
385
|
'SortOrder' => 0
|
384
386
|
}.merge!(create_org_unit_type_data)
|
385
|
-
#validate schema
|
387
|
+
# validate schema
|
386
388
|
check_create_org_unit_type_data_validity(payload)
|
387
389
|
path = "/d2l/api/lp/#{$lp_ver}/outypes/"
|
388
390
|
_post(path, payload)
|
@@ -399,7 +401,7 @@ def update_outype(outype_id, create_org_unit_type_data)
|
|
399
401
|
'Description' => '',
|
400
402
|
'SortOrder' => 0
|
401
403
|
}.merge!(create_org_unit_type_data)
|
402
|
-
#validate schema
|
404
|
+
# validate schema
|
403
405
|
check_create_org_unit_type_data_validity(payload)
|
404
406
|
path = "/d2l/api/lp/#{$lp_ver}/outypes/#{outype_id}"
|
405
407
|
_post(path, payload)
|
data/lib/d2l_sdk/requests.rb
CHANGED
@@ -21,7 +21,7 @@ def _get(path, isD2l = true)
|
|
21
21
|
ap uri_string if @debug
|
22
22
|
RestClient.get(uri_string) do |response, _request, _result|
|
23
23
|
begin
|
24
|
-
#ap _request
|
24
|
+
# ap _request
|
25
25
|
case response.code
|
26
26
|
when 200
|
27
27
|
# ap JSON.parse(response) # Here is the JSON fmt'd response printed
|
@@ -30,7 +30,7 @@ def _get(path, isD2l = true)
|
|
30
30
|
display_response_code(response.code)
|
31
31
|
ap JSON.parse(response.body) if @debug
|
32
32
|
end
|
33
|
-
rescue => e
|
33
|
+
rescue # => e
|
34
34
|
display_response_code(response.code)
|
35
35
|
ap JSON.parse(response.body) if @debug
|
36
36
|
raise
|
@@ -51,7 +51,7 @@ def _get_raw(path, isD2l = true)
|
|
51
51
|
display_response_code(response.code)
|
52
52
|
ap response.body
|
53
53
|
end
|
54
|
-
rescue => e
|
54
|
+
rescue # => e
|
55
55
|
display_response_code(response.code)
|
56
56
|
ap response.body
|
57
57
|
raise
|
@@ -81,6 +81,36 @@ def _post(path, payload, isD2l = true)
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
+
# performs a put request using the path and the payload arguments. After first
|
85
|
+
# creating an authenticated uri, the put request is performed using the
|
86
|
+
# authenticated uri, the payload argument, and specifying that the payload is
|
87
|
+
# formatted in JSON.
|
88
|
+
def _put(path, payload, isD2l = true)
|
89
|
+
auth_uri = path
|
90
|
+
auth_uri = create_authenticated_uri(path, 'PUT') if isD2l == true
|
91
|
+
# Perform the put action, updating the data; Provide feedback to client.
|
92
|
+
RestClient.put(auth_uri, payload.to_json, content_type: :json) do |response|
|
93
|
+
case response.code
|
94
|
+
when 200
|
95
|
+
return nil if response == ""
|
96
|
+
JSON.parse(response)
|
97
|
+
# ap JSON.parse(response.body)
|
98
|
+
else
|
99
|
+
display_response_code(response.code)
|
100
|
+
ap JSON.parse(response.body) if $debug
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# Performs a delete request by creating an authenticated uri and using the
|
106
|
+
# RestClient delete method and specifying the content_type as being JSON.
|
107
|
+
def _delete(path, isD2l = true, headers = {})
|
108
|
+
headers[:content_type] = :json
|
109
|
+
auth_uri = path
|
110
|
+
auth_uri = create_authenticated_uri(path, 'DELETE') if isD2l == true
|
111
|
+
RestClient.delete(auth_uri, headers)
|
112
|
+
end
|
113
|
+
|
84
114
|
# NOTE: multipart code examples referrenced from danielwestendorf--
|
85
115
|
# FTC 1867 and FTC 2388 implementations are based upon the following url:
|
86
116
|
# => "https://coderwall.com/p/c-mu-a/http-posts-in-ruby"
|
@@ -95,12 +125,12 @@ def _learning_repository_upload(path, file, method)
|
|
95
125
|
# file = the File's name in the directory.
|
96
126
|
# method = POST or PUT
|
97
127
|
# json = the json appended to the end of the request body
|
98
|
-
auth_uri = path
|
128
|
+
# auth_uri = path
|
99
129
|
auth_uri = create_authenticated_uri(path, method)
|
100
130
|
uri = URI.parse(auth_uri)
|
101
131
|
|
102
132
|
boundary = "xxBOUNDARYxx"
|
103
|
-
header = {"Content-Type" => "multipart/form-data; boundary=#{boundary}"}
|
133
|
+
header = { "Content-Type" => "multipart/form-data; boundary=#{boundary}" }
|
104
134
|
# setup the post body
|
105
135
|
post_body = []
|
106
136
|
post_body << "--#{boundary}\n"
|
@@ -119,19 +149,50 @@ def _learning_repository_upload(path, file, method)
|
|
119
149
|
JSON.parse(response)
|
120
150
|
end
|
121
151
|
|
122
|
-
#
|
123
|
-
def
|
152
|
+
# Upload a file to the learning repository.
|
153
|
+
def _course_package_upload(path, file, method)
|
154
|
+
# name = the content name,
|
155
|
+
# e.g. "Resource", "profileImage", "name", "description", "file", "targetUsers"
|
156
|
+
# file = the File's name in the directory.
|
157
|
+
# method = POST or PUT
|
158
|
+
# json = the json appended to the end of the request body
|
159
|
+
# auth_uri = path
|
160
|
+
auth_uri = create_authenticated_uri(path, method)
|
161
|
+
uri = URI.parse(auth_uri)
|
162
|
+
|
163
|
+
boundary = "xxBOUNDARYxx"
|
164
|
+
header = { "Content-Type" => "multipart/form-data; boundary=#{boundary}" }
|
165
|
+
# setup the post body
|
166
|
+
post_body = []
|
167
|
+
post_body << "--#{boundary}\n"
|
168
|
+
post_body << "Content-Disposition: form-data; name = \"Resource\"; filename=\"#{File.basename(file)}\"\r\n"
|
169
|
+
post_body << "Content-Type: #{MIME::Types.type_for(file)}\r\n\r\n"
|
170
|
+
post_body << File.read(file)
|
171
|
+
post_body << "\r\n\r\n--#{boundary}--\r\n"
|
172
|
+
|
173
|
+
# Create the HTTP objects
|
174
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
175
|
+
request = Net::HTTP::Post.new(uri.request_uri, header)
|
176
|
+
request.body = post_body.join
|
177
|
+
|
178
|
+
# Send the request
|
179
|
+
response = http.request(request)
|
180
|
+
JSON.parse(response)
|
181
|
+
end
|
182
|
+
|
183
|
+
# REVIEW: image upload process
|
184
|
+
def _image_upload(path, file, method)
|
124
185
|
# name = the content name,
|
125
186
|
# e.g. "Resource", "profileImage", "name", "description", "file", "targetUsers"
|
126
187
|
# file = the File's name in the directory.
|
127
188
|
# method = POST or PUT
|
128
189
|
# json = the json appended to the end of the request body
|
129
|
-
auth_uri = path
|
190
|
+
# auth_uri = path
|
130
191
|
auth_uri = create_authenticated_uri(path, method)
|
131
192
|
uri = URI.parse(auth_uri)
|
132
193
|
|
133
194
|
boundary = "xxBOUNDARYxx"
|
134
|
-
header = {"Content-Type" => "multipart/form-data; boundary=#{boundary}"}
|
195
|
+
header = { "Content-Type" => "multipart/form-data; boundary=#{boundary}" }
|
135
196
|
# setup the post body
|
136
197
|
post_body = []
|
137
198
|
post_body << "--#{boundary}\n"
|
@@ -156,12 +217,12 @@ def _ePortfolio_upload(path, file, method, description)
|
|
156
217
|
# filename = the File's name in the directory.
|
157
218
|
# method = POST or PUT
|
158
219
|
# json = the json appended to the end of the request body
|
159
|
-
auth_uri = path
|
220
|
+
# auth_uri = path
|
160
221
|
auth_uri = create_authenticated_uri(path, method)
|
161
222
|
uri = URI.parse(auth_uri)
|
162
223
|
|
163
224
|
boundary = "xxBOUNDARYxx"
|
164
|
-
header = {"Content-Type" => "multipart/form-data; boundary=#{boundary}"}
|
225
|
+
header = { "Content-Type" => "multipart/form-data; boundary=#{boundary}" }
|
165
226
|
# setup the post body
|
166
227
|
post_body = []
|
167
228
|
post_body << "--#{boundary}\r\n"
|
@@ -196,12 +257,12 @@ def _course_content_upload(path, json, file, method)
|
|
196
257
|
# filename = the File's name in the directory.
|
197
258
|
# method = POST or PUT
|
198
259
|
# json = the json appended to the end of the request body
|
199
|
-
auth_uri = path
|
260
|
+
# auth_uri = path
|
200
261
|
auth_uri = create_authenticated_uri(path, method)
|
201
262
|
uri = URI.parse(auth_uri)
|
202
263
|
|
203
264
|
boundary = "xxBOUNDARYxx"
|
204
|
-
header = {"Content-Type" => "multipart/mixed; boundary=#{boundary}"}
|
265
|
+
header = { "Content-Type" => "multipart/mixed; boundary=#{boundary}" }
|
205
266
|
# setup the post body
|
206
267
|
post_body = []
|
207
268
|
post_body << "--#{boundary}\r\n"
|
@@ -232,12 +293,12 @@ def _dropbox_upload(path, json, file, method)
|
|
232
293
|
# filename = the File's name in the directory.
|
233
294
|
# method = POST or PUT
|
234
295
|
# json = the json appended to the end of the request body
|
235
|
-
auth_uri = path
|
296
|
+
# auth_uri = path
|
236
297
|
auth_uri = create_authenticated_uri(path, method)
|
237
298
|
uri = URI.parse(auth_uri)
|
238
299
|
|
239
300
|
boundary = "xxBOUNDARYxx"
|
240
|
-
header = {"Content-Type" => "multipart/mixed; boundary=#{boundary}"}
|
301
|
+
header = { "Content-Type" => "multipart/mixed; boundary=#{boundary}" }
|
241
302
|
# setup the post body
|
242
303
|
post_body = []
|
243
304
|
post_body << "--#{boundary}\r\n"
|
@@ -270,12 +331,12 @@ def _news_upload(path, json, files, method)
|
|
270
331
|
# files = array of filenames
|
271
332
|
# method = POST or PUT
|
272
333
|
# json = the json appended to the end of the request body
|
273
|
-
auth_uri = path
|
334
|
+
# auth_uri = path
|
274
335
|
auth_uri = create_authenticated_uri(path, method)
|
275
336
|
uri = URI.parse(auth_uri)
|
276
337
|
|
277
338
|
boundary = "xxBOUNDARYxx"
|
278
|
-
header = {"Content-Type" => "multipart/mixed; boundary=#{boundary}"}
|
339
|
+
header = { "Content-Type" => "multipart/mixed; boundary=#{boundary}" }
|
279
340
|
# setup the post body
|
280
341
|
post_body = []
|
281
342
|
post_body << "--#{boundary}\r\n"
|
@@ -305,25 +366,12 @@ def _news_upload(path, json, files, method)
|
|
305
366
|
response.body
|
306
367
|
end
|
307
368
|
|
308
|
-
#
|
309
|
-
|
310
|
-
|
311
|
-
# formatted in JSON.
|
312
|
-
def _put(path, payload, isD2l = true)
|
313
|
-
auth_uri = path
|
314
|
-
auth_uri = create_authenticated_uri(path, 'PUT') if isD2l == true
|
315
|
-
# Perform the put action, updating the data; Provide feedback to client.
|
316
|
-
RestClient.put(auth_uri, payload.to_json, content_type: :json)
|
369
|
+
# bridge function ~~~
|
370
|
+
def _upload_post_data(path, json, files, method)
|
371
|
+
_news_upload(path, json, files, method)
|
317
372
|
end
|
318
373
|
|
319
|
-
|
320
|
-
# RestClient delete method and specifying the content_type as being JSON.
|
321
|
-
def _delete(path, isD2l = true, headers = {})
|
322
|
-
headers[:content_type] = :json
|
323
|
-
auth_uri = path
|
324
|
-
auth_uri = create_authenticated_uri(path, 'DELETE') if isD2l == true
|
325
|
-
RestClient.delete(auth_uri, headers)
|
326
|
-
end
|
374
|
+
|
327
375
|
|
328
376
|
# based upon the specific code that is returned from the http method, this
|
329
377
|
# displays the response, in the case that it is an error within the request
|
@@ -334,41 +382,29 @@ end
|
|
334
382
|
# the docs.valence.desire2learn.com website.
|
335
383
|
def display_response_code(code)
|
336
384
|
case code
|
337
|
-
when 400
|
338
|
-
|
339
|
-
when
|
340
|
-
|
341
|
-
|
342
|
-
when
|
343
|
-
|
344
|
-
|
345
|
-
when
|
346
|
-
|
347
|
-
when
|
348
|
-
|
349
|
-
when
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
'Unsupported or invalid parameters, or missing required parameters.'
|
355
|
-
when 415
|
356
|
-
puts '[!] 415: Unsupported Media Type'\
|
357
|
-
'A PUT or POST payload cannot be accepted.'
|
358
|
-
when 423
|
359
|
-
puts '[!] 423'
|
360
|
-
when 500
|
361
|
-
puts '[!] 500: General Service Error\n'\
|
362
|
-
'Empty response body. The service has encountered an unexpected'\
|
363
|
-
'state and cannot continue to handle your action request.'
|
364
|
-
when 504
|
365
|
-
puts '[!] 504: Service Error'
|
385
|
+
when 400 then puts '[!] 400: Bad Request'
|
386
|
+
when 401 then puts '[!] 401: Unauthorized'
|
387
|
+
when 403 then puts '[!] Error Code Forbidden 403: accessing the page or resource '\
|
388
|
+
'you were trying to reach is absolutely forbidden for some reason.'
|
389
|
+
when 404 then puts '[!] 404: Not Found'
|
390
|
+
when 405 then puts '[!] 405: Method Not Allowed'
|
391
|
+
when 406 then puts 'Unacceptable Type'\
|
392
|
+
'Unable to provide content type matching the client\'s Accept header.'
|
393
|
+
when 412 then puts '[!] 412: Precondition failed\n'\
|
394
|
+
'Unsupported or invalid parameters, or missing required parameters.'
|
395
|
+
when 415 then puts '[!] 415: Unsupported Media Type'\
|
396
|
+
'A PUT or POST payload cannot be accepted.'
|
397
|
+
when 423 then puts '[!] 423'
|
398
|
+
when 500 then puts '[!] 500: General Service Error\n'\
|
399
|
+
'Empty response body. The service has encountered an unexpected'\
|
400
|
+
'state and cannot continue to handle your action request.'
|
401
|
+
when 504 then puts '[!] 504: Service Error'
|
366
402
|
end
|
367
403
|
end
|
368
404
|
|
369
|
-
|
370
|
-
###Versions
|
371
|
-
|
405
|
+
##################
|
406
|
+
### Versions #####
|
407
|
+
##################
|
372
408
|
def get_all_products_supported_versions
|
373
409
|
path = "/d2l/api/versions/"
|
374
410
|
_get(path)
|
@@ -400,7 +436,7 @@ def get_versions
|
|
400
436
|
# returns: SupportedVersion JSON block
|
401
437
|
end
|
402
438
|
|
403
|
-
#determine if a specific product component supports a particular API version
|
439
|
+
# determine if a specific product component supports a particular API version
|
404
440
|
def check_if_product_supports_api_version(product_code, version)
|
405
441
|
path = "/d2l/api/#{product_code}/versions/#{version}"
|
406
442
|
_get(path)
|
@@ -414,8 +450,8 @@ def check_supported_version_request_validity(supported_version_request)
|
|
414
450
|
'type' => "object",
|
415
451
|
"properties" =>
|
416
452
|
{
|
417
|
-
"Productcode" => {'type'=>"string"},
|
418
|
-
"Version" => {'type'=>"string"}
|
453
|
+
"Productcode" => { 'type' => "string" },
|
454
|
+
"Version" => { 'type' => "string" }
|
419
455
|
}
|
420
456
|
}
|
421
457
|
}
|