d2l_sdk 0.1.10 → 0.1.11
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/.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
|
}
|